<?php


class PostfixAdminAlias extends Shell {

/**
 * Contains tasks to load and instantiate
 *
 * @var array
 * @access public
 */
        var $tasks = array('Add', 'Update', 'Delete', 'View');





/**
 * Show help for this shell.
 *
 * @access public
 */
        function help() {
                $head  = "Usage: postfixadmin-cli alias <task> [<address>] [] [-m <method>]\n";
                $head .= "-----------------------------------------------\n";
                $head .= "Parameters:\n\n";

                $commands = array(
                        'task' => "\t<task>\n" .
                                                "\t\tAvailable values:\n\n".
                                                "\t\t".sprintf("%-20s %s", "view: ",  "View an existing alias.")."\n".
                                                "\t\t".sprintf("%-20s %s", "add: ",  "Adds an alias.")."\n".
                                                "\t\t".sprintf("%-20s %s", "update: ",  "Updates an alias.")."\n".
                                                "\t\t".sprintf("%-20s %s", "delete: ",  "Deletes an alias")."\n",
                        'address' => "\t[<address>]\n" .
                                                "\t\tA address of recipient.\n",
                );

                $this->out($head);
                if (!isset($this->args[1])) {
                        foreach ($commands as $cmd) {
                                $this->out("{$cmd}\n\n");
                        }
                } elseif (isset($commands[low($this->args[1])])) {
                        $this->out($commands[low($this->args[1])] . "\n\n");
                } else {
                        $this->out("Command '" . $this->args[1] . "' not found");
                }
        }


}

class AddTask extends Shell {
/**
 * Execution method always used for tasks
 *
 * @access public
 */
        function execute() {
                if (empty($this->args)) {
                        $this->__interactive();
                }

                if (!empty($this->args[0])) {
                        $this->__handle($this->args[0], $this->args[1]);

                }
        }
/**
 * Interactive
 *
 * @access private
 */
        function __interactive() {
                while(0==0) {
                    $question = "Enter address:";
                    $address = $this->in($question);
                
                    if(preg_match("/^((?:(?:(?:[a-zA-Z0-9][\.\-\+_]?)*)[a-zA-Z0-9])+)\@((?:(?:(?:[a-zA-Z0-9][\.\-_]?){0,62})[a-zA-Z0-9])+)\.([a-zA-Z0-9]{2,6})$/", $address) == 1)
                        break;
                    
                    $this->err("Invalid emailaddress");
  
                }
                while(0==0) {
                    $question = "Forward to:";
                    $goto = $this->in($question);
                    
                    if(preg_match("/^((?:(?:(?:[a-zA-Z0-9][\.\-\+_]?)*)[a-zA-Z0-9])+)\@((?:(?:(?:[a-zA-Z0-9][\.\-_]?){0,62})[a-zA-Z0-9])+)\.([a-zA-Z0-9]{2,6})$/", $address) == 1)
                        break;
                    
                    $this->err("Invalid emailaddress");
                }
                
                $this->__handle($address, $goto);
        }
        
/**
 * Interactive
 *
 * @access private
 */
        function __handle($address, $goto) {
                
                $handler =  new AliasHandler($address);
                $return = $handler->add($goto);

                if($return == 1) {
                        $this->error("Error:", join("\n", $handler->errormsg));
                } else {
                        $this->out("");
                        $this->out("Alias ( $address -> $goto ) generated.");
                        $this->hr();
                }
        return;
        }
/**
 * Displays help contents
 *
 * @access public
 */
        function help() {
                $this->hr();
                $this->out("Usage: postfixadmin-cli user add <address> [<password>] <name> <quota> [-g]");
                $this->hr();
                $this->out('Commands:');
                $this->out("\n\tadd\n\t\tAdds mailbox in interactive mode.");
                $this->out("\n\tadd <address> [<password>] [-g] <name> <quota>\n\t\tAdds mailbox for <address> with password <password> of if -g with rand pw. <quota> in MB.");
                $this->out("");
                $this->_stop();
        }

}
#TODO: implement
class UpdateTask extends Shell {
/**
 * Execution method always used for tasks
 *
 * @access public
 */
        function execute() {
                if (empty($this->args)) {
                        $this->help();
                        //$this->__interactive();
                }

                if (!empty($this->args[0])) {
                        $this->help();
                }
        }
/**
 * Interactive
 *
 * @access private
 */
        function __interactive() {
        
        }
/**
 * Displays help contents
 *
 * @access public
 */
        function help() {
                $this->hr();
        $this->out("Not Implemented yet!");
                /*$this->out("Usage: postfixadmin-cli user update <args>");
                //$this->hr();
                //$this->out('Commands:');
                //$this->out("\n\tmodel\n\t\tbakes model in interactive mode.");
                //$this->out("\n\tmodel <name>\n\t\tbakes model file with no associations or validation");
                //$this->out("");*/
                $this->_stop();
        }

}
class DeleteTask extends Shell {
/**
 * Execution method always used for tasks
 *
 * @access public
 */
        function execute() {

                if (empty($this->args)) {
                        $this->help();
                        //$this->__interactive();
                }

                if (!empty($this->args[0])) {
                    $this->__handle($this->args[0]);
                }
        }
/**
 * Interactive
 *
 * @access private
 */
        function __interactive() {
                $question[] = "Which Address do you want to view?";

                $address = $this->in(join("\n", $question));


                $question = "Do you really want to delete mailbox of '$address'?";
       
                $create = $this->in($question, array('y','n'));
                
                $create == 'y' ? $create = true : $create = false;
                
                if ($create)                
                      $this->__handle($address);


        
        }
 /**
 * Interactive
 *
 * @access private
 */
        function __handle($address) {

### TODO: don't use UserHandler, instead add delete function to AliasHandler (if not already there)
### using UserHandler for deleting aliases is like taking a sledgehammer to crack a nut
### (and will probably cause some error messages that I added today ;-)

### Implemented check it please!
                $handler =  new AliasHandler($address);
                $status = $handler->delete();
                if ($status == true) {
                      $this->out("Mailbox of '$address' was deleted.");
                      
                } else {
                      $this->error("Error:", join("\n", $handler->errormsg));
                }
                return;
        
        }
/**
 * Displays help contents
 *
 * @access public
 */
        function help() {
                $this->hr();
                $this->out("NOT implemented yet.");
                //$this->out("Usage: postfixadmin-cli user model <arg1>");
                //$this->hr();
                //$this->out('Commands:');
                //$this->out("\n\tdelete\n\t\tdeletes mailbox in interactive mode.");
                //$this->out("\n\tdelete <address>\n\t\tdeletes mailbox with address <address>");
                //$this->out("");
                $this->_stop();
        }

}
class ViewTask extends Shell {
/**
 * Execution method always used for tasks
 *
 * @access public
 */
        function execute() {

                if (empty($this->args)) {
                        $this->__interactive();
                }

                if (!empty($this->args[0])) {
                        $this->__handle($this->args[0]);
                       
                }
        }
/**
 * Interactive
 *
 * @access private
 */
        function __interactive() {
                $question[] = "Which Alias do you want to view?";

                $address = $this->in(join("\n", $question));

                      $this->__handle($address);


        
        }
 /**
 * Interactive
 *
 * @access private
 */
        function __handle($address) {


                $handler =  new AliasHandler($address);
                $status = $handler->get(); # TODO: set the "all" flag?
                if ( ! $status) {
                    $this->error("Error: Not Found", "The requested alias was not found!");
                } else {
                      $result = $handler->return;

                      $this->out(sprintf("Entries for: %s\n", $address));
                      $this->out("Goto: \t");
                      foreach($result AS $goto) {
                        $this->out("\t -> ".$goto);
                      }
                      # TODO: display "deliver to mailbox"
                      ##NEED fix in is_mailbox_alias because user is not set correctly in this scenario!
                      /**
                      if( $handler->is_mailbox_alias($address) )
                        $this->out("A mailbox was set for this alias!\n");
                      }
                      */
                      # TODO: display if vacation is on?
                      /**
                      if( $handler->is_vacation_address($address) ) {
                        $this->out("This alias is a vacation address!");
                      }
                      */
                }
                return;
        
        }
/**
 * Displays help contents
 *
 * @access public
 */
        function help() {
                $this->out("");
                $this->hr();
                $this->out("Usage: postfixadmin-cli user view <address>");
                $this->hr();
                $this->out('Commands:');
                $this->out("\n\tview\n\t\tView user. Select address in interactive mode.");
                $this->out("\n\tview <address>\n\t\tView user with address <address>");
                $this->out("");
                $this->_stop();
        }

}
