aboutsummaryrefslogtreecommitdiff
path: root/src/bdrem/UserInterface.php
blob: e4f7168f3b1f2c5b721a2b7126971b15ccb108d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
namespace bdrem;

abstract class UserInterface
{
    protected $config;

    public function run()
    {
        $this->config = new Config();
        $this->config->load();
        $this->config->date = date('Y-m-d');
        setlocale(LC_TIME, $this->config->locale);
        $source = $this->config->loadSource();

        $parser = $this->loadParameters();
        $this->parseParameters($parser);

        $arEvents = $source->getEvents(
            $this->config->date,
            $this->config->daysPrev, $this->config->daysNext
        );
        usort($arEvents, '\\bdrem\\Event::compare');
        $this->render($arEvents);
    }

    protected function loadParameters()
    {
        $parser = new \Console_CommandLine();
        $parser->description = 'Birthday reminder';
        $parser->version = '0.1.0';

        $parser->addOption(
            'daysNext',
            array(
                'short_name'  => '-n',
                'long_name'   => '--days-next',
                'description' => 'Show NUM days after date',
                'help_name'   => 'NUM',
                'action'      => 'StoreInt',
                'default'     => $this->config->daysAfter,
            )
        );
        $parser->addOption(
            'daysPrev',
            array(
                'short_name'  => '-p',
                'long_name'   => '--previous',
                'description' => 'Show NUM days before date',
                'help_name'   => 'NUM',
                'action'      => 'StoreInt',
                'default'     => $this->config->daysBefore,
            )
        );
        $parser->addOption(
            'renderer',
            array(
                'short_name'  => '-r',
                'long_name'   => '--renderer',
                'description' => 'Output mode',
                'action'      => 'StoreString',
                'choices'     => array(
                    'console',
                    'html',
                    'htmltable',
                    'mail',
                ),
                'default'     => 'console',
                'add_list_option' => true,
            )
        );
        $parser->addOption(
            'quiet',
            array(
                'short_name'  => '-q',
                'long_name'   => '--quiet',
                'description' => "Don't print status messages to stdout",
                'action'      => 'StoreTrue'
            )
        );
        return $parser;
    }

    protected function parseParameters($parser)
    {
        try {
            $result = $parser->parse();
            // do something with the result object
            $this->config->daysNext = $result->options['daysNext'];
            $this->config->daysPrev = $result->options['daysPrev'];
            $this->config->renderer = $result->options['renderer'];
            $this->config->quiet    = $result->options['quiet'];
        } catch (\Exception $exc) {
            $this->preRenderParameterError();
            $parser->displayError($exc->getMessage());
        }
    }

    protected function render($arEvents)
    {
        $r = $this->getRenderer();
        $r->config = $this->config;
        $r->renderAndOutput($arEvents);
    }

    protected function getRenderer()
    {
        $renderer = ucfirst($this->config->renderer);
        if ($renderer == 'Htmltable') {
            $renderer = 'HtmlTable';
        }
        $class = '\\bdrem\\Renderer_' . $renderer;
        return new $class();
    }

    protected function preRenderParameterError()
    {
    }
}
?>