<?php

class Bootstrap_Helpdesk extends Am_Module
{

    function onSetupEmailTemplateTypes(Am_Event $event)
    {
        $ticket = array (
            'ticket.ticket_mask' => 'Ticket Mask',
            'ticket.subject' => 'Ticket Subject',
        );

        $event->addReturn(array(
                'id' => 'helpdesk.notify_new_message',
                'title' => 'Notify New Message',
                'mailPeriodic' => Am_Mail::USER_REQUESTED,
                'vars' => $ticket + array('url' => 'Url of Page with Message', 'user'),
            ), 'helpdesk.notify_new_message');
        $event->addReturn(array(
                'id' => 'helpdesk.notify_new_message',
                'title' => 'Notify New Message',
                'mailPeriodic' => Am_Mail::USER_REQUESTED,
                'vars' => $ticket + array('url' => 'Url of Page with Message', 'user'),
            ), 'helpdesk.notify_new_message_admin');
        $event->addReturn(array(
                'id' => 'helpdesk.new_ticket',
                'title' => 'Autoresponder New Ticket',
                'mailPeriodic' => Am_Mail::USER_REQUESTED,
                'vars' => $ticket +  array('url' => 'Url of Page with Ticket', 'user'),
            ), 'helpdesk.new_ticket');
    }

    function onLoadAdminDashboardWidgets(Am_Event $event)
    {
        $event->addReturn(new Am_Widget('helpdesk-messages', ___('Last Messages in Helpdesk'), array($this, 'renderWidget'), Am_Widget::TARGET_ANY, array($this, 'createWidgetConfigForm'), 'helpdesk'));
    }

    function createWidgetConfigForm()
    {
        $form = new Am_Form_Admin();
        $form->addInteger('num')
            ->setLabel(___('Number of Messages to display'))
            ->setValue(5);

        return $form;
    }

    function renderWidget(Am_View $view, $config = null)
    {
       $view->num = is_null($config) ? 5 : $config['num'];
       return $view->render('admin/helpdesk/widget/messages.phtml');
    }

    function onClearItems(Am_Event $event)
    {
        $event->addReturn(array (
            'method' => array($this->getDi()->helpdeskTicketTable, 'clearOld'),
            'title'  => 'Helpdesk Tickets',
            'desc'   => 'records with last update date early than Date to Purge'
        ), 'helpdesk_tickets');
    }

    function  onAdminWarnings(Am_Event $event)
    {
        $cnt = $this->getDi()->db->selectCell("SELECT COUNT(ticket_id) FROM ?_helpdesk_ticket WHERE status IN (?a)",
            array(HelpdeskTicket::STATUS_AWAITING_ADMIN_RESPONSE, HelpdeskTicket::STATUS_NEW));

        if ($cnt) $event->addReturn(___('You have %s%d tickets%s that require your attention',
            sprintf('<a href="%s">', ROOT_URL . '/helpdesk/admin/?_admin_filter_s[]=new&_admin_filter_s[]=awaiting_admin_response'), $cnt, '</a>'));
    }

    function onUserMerge(Am_Event $event)
    {
        $target = $event->getTarget();
        $source = $event->getSource();

        $this->getDi()->db->query('UPDATE ?_helpdesk_ticket SET user_id=? WHERE user_id=?',
            $target->pk(), $source->pk());
    }
    function onAdminMenu(Am_Event $event)
    {
        $event->getMenu()->addPage(array(
            'label' => ___('Helpdesk'),
            'controller' => 'admin',
            'action' => 'index',
            'module' => 'helpdesk',
            'id' => 'helpdesk',
            'resource' => "helpdesk",
            'params' => array (
                'page_id' => 'index'
            ),
            'route' => 'inside-pages'
        ));
    }
    function onUserMenu(Am_Event $event)
    {
        $event->getMenu()->addPage(
            array(
                'id' => 'helpdesk',
                'label' => ___('Helpdesk'),
                'controller' => 'index',
                'action' => 'index',
                'params' => array('page_id' => 'index'),
                'module' => 'helpdesk',
                'order' => 600,
                'route' => 'inside-pages',
                'resource' => 'helpdesk',
            )
        );
    }
    function onUserTabs(Am_Event_UserTabs $event)
    {
        $event->getTabs()->addPage(array(
            'id' => 'helpdesk',
            'module' => 'helpdesk',
            'controller' => 'admin-user',
            'action' => 'index',
            'params' => array (
                            'user_id' => $event->getUserId()
                        ),
            'label' => ___('Tickets'),
            'order' => 1000,
            'resource' => 'helpdesk',
        ));
    }
    function onGetPermissionsList(Am_Event $event)
    {
        $event->addReturn(___("Can open and answer helpdesk tickets"), "helpdesk");
    }    
    
    function onUserAfterDelete(Am_Event_UserAfterDelete $event) 
    {
        $this->getDi()->db->query("DELETE FROM ?_helpdesk_message WHERE 
            ticket_id IN (SELECT ticket_id FROM ?_helpdesk_ticket
            WHERE user_id=?)", $event->getUser()->user_id);
        $this->getDi()->db->query("DELETE FROM ?_helpdesk_ticket
            WHERE user_id=?", $event->getUser()->user_id);
    }
    
    function onInitFinished() {
       $this->getDi()->register('helpdeskStrategy', 'Am_Helpdesk_Strategy_Abstract')
            ->setConstructor('create');
       
    }
    
    function onBuildDemo(Am_Event $event)
    {
        $subjects = array(
            'Please help',
            'Urgent question',
            'I have a problem',
            'Important question',
            'Pre-sale inquiry',
        );
        $questions = array(
            "My website is now working. Can you help?",
            "I have a problem with website script.\nWhere can I find documentation?",
            "I am unable to place an order, my credit card is not accepted.",
        );
        $answers = array(
            "Please call us to phone# 1-800-222-3334",
            "We are looking to your problem, and it will be resolved within 4 hours",
        );
        $user = $event->getUser();
        /* @var $user User */
        while (rand(0,10)<4)
        {
            $now = $this->getDi()->time;

            $created = sqlTime($now - rand(3600, 3600*24*180));

            $ticket = $this->getDi()->helpdeskTicketRecord;
            $ticket->status = HelpdeskTicket::STATUS_AWAITING_ADMIN_RESPONSE;
            $ticket->subject = $subjects[ rand(0, count($subjects)-1) ];
            $ticket->user_id = $user->pk();
            $ticket->created = sqlTime($created);
            $ticket->updated = sqlTime($created);
            $ticket->insert();
            //
            $msg = $this->getDi()->helpdeskMessageRecord;
            $msg->content = $questions[ rand(0, count($questions)-1) ];
            $msg->type = 'message';
            $msg->ticket_id = $ticket->pk();
            $msg->dattm = $tm = sqlTime($created);
            $msg->insert();
            //
            if (rand(0, 10)<6)
            {
                $msg = $this->getDi()->helpdeskMessageRecord;
                $msg->content = $answers[ rand(0, count($answers)-1) ];
                $msg->type = 'message';
                $msg->ticket_id = $ticket->pk();
                $msg->dattm = sqlTime(min(strtotime($tm) + rand(180, 3600*24), $now));
                $msg->admin_id = $this->getDi()->adminTable->findFirstBy()->pk();
                $msg->insert();
                if (rand(0, 10)<6)
                    $ticket->status = HelpdeskTicket::STATUS_AWAITING_USER_RESPONSE;
                else
                    $ticket->status = HelpdeskTicket::STATUS_CLOSED;
                $ticket->updated = $msg->dattm;
                $ticket->update();
            }
        }
    }
}