<?php

/**
 * This file contains QUI\Cron\Console
 */

namespace QUI\Cron;

/**
 * Cron Console Manager
 *
 * @author www.namerobot.com (Henning Leutz)
 */

class Console extends \QUI\System\Console\Tool
{
    /**
     * Konstruktor
     */
    public function __construct()
    {
        $this->setName('package:cron')
             ->setDescription('Cron Manager');
    }

    /**
     * (non-PHPdoc)
     * @see \QUI\System\Console\Tool::execute()
     */
    public function execute()
    {
        $run     = $this->getArgument('--run');
        $list    = $this->getArgument('--list');
        $listall = $this->getArgument('--list-all');

        if ( $run )
        {
            $this->run();
            return;
        }

        if ( $list )
        {
            $this->listCrons();
            return;
        }

        if ( $listall )
        {
            $this->listAllCrons();
            return;
        }

        $this->writeLn( 'Welcome to the Cron Manager' );
        $this->writeLn( 'Which Command would you execute?' );
        $this->writeLn( '' );

        $this->commandRead();
    }

    /**
     * Read the command from the command line
     */
    public function commandRead()
    {
        $this->writeLn( 'Available Commands: ' );
        $this->writeLn( "- run\t\trun all active crons" );
        $this->writeLn( "- list\t\tlist all active crons" );
        $this->writeLn( "- list-all\tlist all crons" );

        $this->writeLn( '' );

        $this->writeLn( 'Command: ' );
        $command = $this->readInput();

        switch ( $command )
        {
            // run all crons
            case 'run':
                $this->run();
                $this->commandRead();
            break;

            // list all inserted crons
            case 'list':
                $this->listCrons();
                $this->commandRead();
            break;

            // list all inserted crons
            case 'list-all':
                $this->listAllCrons();
                $this->commandRead();
            break;

            default:
                $this->writeLn( 'Command not found, please type another command', 'red' );
                $this->commandRead();
        }
    }

    /**
     * Execute all upcoming crons
     */
    public function run()
    {
        $Manager = new Manager();

        $this->writeLn( '' );
        $this->write('Execute all upcoming crons ...');

        $Manager->execute();

        $this->write('finish');
        $this->writeLn( '' );
    }

    /**
     * List all active crons
     */
    public function listCrons()
    {
        $Manager = new Manager();
        $list    = $Manager->getList();

        $this->writeLn( 'Cron list:' );
        $this->writeLn( '=======================================================' );
        $this->writeLn( '' );

        foreach ( $list as $entry )
        {
            if ( $entry['active'] != 1 ) {
                continue;
            }

            $time = $entry['min'] .' '. $entry['hour'] .' '. $entry['day'] .' '. $entry['month'];
            $exec = $entry['exec'];

            $this->writeLn( 'ID: '. $entry['id'] );
            $this->writeLn( $time ."\t". $exec, 'green' );

            $this->resetColor();
            $this->writeLn( '' );
        }

        $this->writeLn( '=======================================================' );
        $this->writeLn( '' );
    }

    /**
     * List all inserted Crons
     */
    public function listAllCrons()
    {
        $Manager = new Manager();
        $list    = $Manager->getList();

        $this->writeLn( 'Cron list:' );
        $this->writeLn( '=======================================================' );
        $this->writeLn( '' );

        foreach ( $list as $entry )
        {
            $time = $entry['min'] .' '. $entry['hour'] .' '. $entry['day'] .' '. $entry['month'];
            $exec = $entry['exec'];

            $this->writeLn( 'ID: '. $entry['id'] );
            $this->writeLn( $time ."\t". $exec, 'green' );

            $this->resetColor();
            $this->writeLn( '' );
        }

        $this->writeLn( '=======================================================' );
        $this->writeLn( '' );
    }
}