daysAfter -> daysNext, daysBefore -> daysPrev
[bdrem.git] / src / bdrem / UserInterface.php
index cd1b7ccdd1f28c6219f18315a53df9400722e6fa..e4f7168f3b1f2c5b721a2b7126971b15ccb108d1 100644 (file)
@@ -13,10 +13,12 @@ abstract class UserInterface
         setlocale(LC_TIME, $this->config->locale);
         $source = $this->config->loadSource();
 
-        $this->loadParameters($this->config);
+        $parser = $this->loadParameters();
+        $this->parseParameters($parser);
+
         $arEvents = $source->getEvents(
             $this->config->date,
-            $this->config->daysBefore, $this->config->daysAfter
+            $this->config->daysPrev, $this->config->daysNext
         );
         usort($arEvents, '\\bdrem\\Event::compare');
         $this->render($arEvents);
@@ -24,8 +26,95 @@ abstract class UserInterface
 
     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());
+        }
     }
 
-    abstract protected function render($arEvents);
+    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()
+    {
+    }
 }
 ?>
\ No newline at end of file