<?php
/**
  * Ahead WebSoft Technologies Pvt Ltd.
  * @copyright  Copyright 2006-2026 Ahead WebSoft Technologies Pvt Ltd.
  * @license    https://www.socialengine.com/policies
*/
class Core_AdminAdsController extends Core_Controller_Action_Admin
{
    // Ad Campaign actions

    public function indexAction()
    {
        $this->view->navigation = $navigation = Engine_Api::_()->getApi('menus', 'core')->getNavigation('core_admin_main_ads', array(), 'core_admin_main_ads_manage');
        
        $this->view->viewer = $viewer = Engine_Api::_()->user()->getViewer();

        $table = Engine_Api::_()->getDbtable('adcampaigns', 'core');
        $select = $table->select()
            ->order('adcampaign_id DESC');
        $this->view->paginator = $paginator = Zend_Paginator::factory($select);
        $paginator->setCurrentPageNumber($this->_getParam('page'));
        //$paginator->setItemCountPerPage(1);

        // Build a list of statuses for each ad
        $status = array();
        foreach ($paginator as $item) {
            if (!$item->status) {
                $status[$item->getIdentity()][] = $this->view->translate('Paused');
            }
            if (!$item->hasStarted()) {
                $status[$item->getIdentity()][] = $this->view->translate('Not Started');
            }
            if ($item->hasExpired()) {
                $status[$item->getIdentity()][] = $this->view->translate('Ended');
            }
            if ($item->hasReachedViewLimit()) {
                $status[$item->getIdentity()][] = $this->view->translate('Reached View Limit');
            }
            if ($item->hasReachedClickLimit()) {
                $status[$item->getIdentity()][] = $this->view->translate('Reached Click Limit');
            }
            if ($item->hasReachedCtrLimit()) {
                $status[$item->getIdentity()][] = $this->view->translate('Reached CTR Limit');
            }
            if (empty($status[$item->getIdentity()])) {
                $status[$item->getIdentity()][] = $this->view->translate('Active');
            }
        }
        $this->view->status = $status;
    }

    public function createAction()
    {
//         $this->view->navigation = Engine_Api::_()
//             ->getApi('menus', 'core')
//             ->getNavigation('core_admin_main');
            
        $this->view->navigation = $navigation = Engine_Api::_()->getApi('menus', 'core')->getNavigation('core_admin_main_ads', array(), 'core_admin_main_ads_create');

        $this->view->form = $form = new Core_Form_Admin_Ads_Create();

        $viewer = Engine_Api::_()->user()->getViewer();
        if ($viewer->getIdentity() && !empty($viewer->timezone)) {
            $form->getElement('start_time')->setAttrib('optionalSuffix', ' (' . $viewer->timezone . ')');
            $form->getElement('end_settings')->setAttrib('optionalSuffix', ' (' . $viewer->timezone . ')');
        } else {
            $form->getElement('start_time')->setAttrib('optionalSuffix', ' (' . 'UTC' . ')');
            $form->getElement('end_settings')->setAttrib('optionalSuffix', ' (' . 'UTC' . ')');
        }

        if (!$this->getRequest()->isPost()) {
            return;
        }

        if (!$form->isValid($this->getRequest()->getPost())) {
            return;
        }


        // Process
        $params = $form->getValues();

        // Process timezone
        $viewer = Engine_Api::_()->user()->getViewer();
        if ($viewer->getIdentity() && !empty($viewer->timezone)) {
            if (!empty($params['start_time']) && '' != $params['start_time']) {
                $params['start_time'] = $this->_convertTimezone($params['start_time'], $viewer->timezone, 'UTC');
            }
            if (!empty($params['end_time']) && '' != $params['end_time']) {
                $params['end_time'] = $this->_convertTimezone($params['end_time'], $viewer->timezone, 'UTC');
            }
        }

        $campaign = Engine_Api::_()->getDbtable('adcampaigns', 'core')->createRow();
        $campaign->setFromArray($params);
        $campaign->network = Zend_Json_Encoder::encode($params['ad_networks']);
        $campaign->level = Zend_Json_Encoder::encode($params['ad_levels']);
        $campaign->status = 1;
        $campaign->save();

        // redirect to manage page for now
        return $this->_helper->redirector->gotoRoute(array('action' => 'manageads',
            'id' => $campaign->adcampaign_id));
    }

    public function editAction()
    {
        $id = $this->_getParam('id', null);
        $this->view->navigation = $navigation = Engine_Api::_()->getApi('menus', 'core')
            ->getNavigation('adcampaign_admin_main', array('params'=>array('id'=>$id)), 'adcampaign_admin_main_edit');

        $this->view->form = $form = new Core_Form_Admin_Ads_Edit();
        $this->view->campaign = $campaign = Engine_Api::_()->getItem('core_adcampaign', $id);

        $viewer = Engine_Api::_()->user()->getViewer();
        if ($viewer->getIdentity() && !empty($viewer->timezone)) {
            $form->getElement('start_time')->setAttrib('optionalSuffix', ' (' . $viewer->timezone . ')');
            $form->getElement('end_settings')->setAttrib('optionalSuffix', ' (' . $viewer->timezone . ')');
        } else {
            $form->getElement('start_time')->setAttrib('optionalSuffix', ' (' . 'UTC' . ')');
            $form->getElement('end_settings')->setAttrib('optionalSuffix', ' (' . 'UTC' . ')');
        }

        // Initialize values
        $params = $campaign->toArray();

        // Process timezone
        $viewer = Engine_Api::_()->user()->getViewer();
        if ($viewer->getIdentity() && !empty($viewer->timezone)) {
            if (!empty($params['start_time']) && '' != $params['start_time']) {
                $params['start_time'] = $this->_convertTimezone($params['start_time'], 'UTC', $viewer->timezone);
            }
            if (!empty($params['end_time']) && '' != $params['end_time']) {
                $params['end_time'] = $this->_convertTimezone($params['end_time'], 'UTC', $viewer->timezone);
            }
        }

        // if end_time is not set make sure the form value is populated properly
        if ($campaign->end_settings == 0) {
            $params['end_time'] = 0;
        }

        // set the networks & level values
        $networks = Engine_Api::_()->getDbtable('networks', 'network')->fetchAll();
        if ($networks && isset($campaign->network) && $campaign->network != 'null') {
            if (substr($campaign->network, -2) == ',"') {
                $campaign->network = substr_replace($campaign->network, '', -2);
                $campaign->network .= ']';
            } elseif (substr($campaign->network, -2) != '"]') {
                $campaign->network .= '"]';
            }
            $params['ad_networks'] = Zend_Json::decode($campaign->network);
//      if( ($ad_networks = $form->getElement('ad_networks')) ) {
//        $ad_networks->setValue(Zend_Json_Decoder::decode($campaign->network));
//      }
        } else {
          $params['ad_networks'] = '';
        }
        $params['ad_levels'] = Zend_Json::decode($campaign->level);
//    if( ($levels = $form->getElement('ad_levels')) ) {
//      $levels->setValue(Zend_Json_Decoder::decode($campaign->level));
//    }

        $form->populate($params);



        // Save values
        if (!$this->getRequest()->isPost()) {
            return;
        }

        if (!$form->isValid($this->getRequest()->getPost())) {
            return;
        }



        // Process
        $params = $form->getValues();

        // Process timezone
        $viewer = Engine_Api::_()->user()->getViewer();
        if ($viewer->getIdentity() && !empty($viewer->timezone)) {
            if (!empty($params['start_time']) && '' != $params['start_time']) {
                $params['start_time'] = $this->_convertTimezone($params['start_time'], $viewer->timezone, 'UTC');
            }
            if (!empty($params['end_time']) && '' != $params['end_time']) {
                $params['end_time'] = $this->_convertTimezone($params['end_time'], $viewer->timezone, 'UTC');
            }
        }

        $campaign->setFromArray($params);

        $selected_levels = $this->_getParam('ad_levels');
        $selected_networks = $this->_getParam('ad_networks');

        $campaign->network = Zend_Json_Encoder::encode($selected_networks);
        $campaign->level = Zend_Json_Encoder::encode($selected_levels);

        $campaign->save();


        $form->addNotice('Changes Saved!');
    }

    public function deleteAction()
    {
        // delete associated advertisements

        // remove the ad campaing
        $this->view->form = $form = new Core_Form_Admin_Ads_Delete();
        $id = $this->_getParam('id', null);

        if ($id) {
            $form->adcampaign_id->setValue($id);
        }

        if ($this->getRequest()->isPost()) {
            $table = Engine_Api::_()->getDbtable('adcampaigns', 'core');
            $db = $table->getAdapter();
            $db->beginTransaction();

            try {
                $campaign = Engine_Api::_()->getItem('core_adcampaign', $id);
                $ads = $campaign->getAds();
                foreach ($ads as $ad) {
                    Engine_Api::_()->getApi('Ad', 'core')->deleteAd($ad);
                }
                $campaign->delete();

                $db->commit();

                $this->_forward('success', 'utility', 'core', array(
                    'smoothboxClose' => true,
                    'parentRefresh' => true,
                    'format'=> 'smoothbox',
                    'messages' => array(Zend_Registry::get('Zend_Translate')->_("Ad Campaign Deleted"))
                ));
            } catch (Exception $e) {
                $db->rollBack();
                throw $e;
            }
        }
    }

    public function statusAction()
    {
        $id = $this->_getParam('adcampaign_id', null);
        $table = Engine_Api::_()->getDbtable('adcampaigns', 'core');
        $db = $table->getAdapter();
        $db->beginTransaction();

        try {
            $campaign = Engine_Api::_()->getItem('core_adcampaign', $id);

            // make status paused or started depending on current setting
            if ($campaign->status) {
                $campaign->status = 0;
            } else {
                $campaign->status = 1;
            }
            $campaign->save();

            $db->commit();
        } catch (Exception $e) {
            $db->rollBack();
            throw $e;
        }
    }

    public function manageadsAction()
    {
        $this->view->campaign_id = $id = $this->_getParam('id', null);
        $this->view->campaign = $campaign = Engine_Api::_()->getItem('core_adcampaign', $id);

        $this->view->navigation = $navigation = Engine_Api::_()->getApi('menus', 'core')
            ->getNavigation('adcampaign_admin_main',
                array('params' => array('id' => $campaign->adcampaign_id)),
                'adcampaign_admin_main_manageads');

        $table = Engine_Api::_()->getDbtable('ads', 'core');
        $select = $table->select()->where('ad_campaign = ?', $campaign->adcampaign_id);
        $this->view->paginator = $paginator = Zend_Paginator::factory($select);
        $paginator->setCurrentPageNumber($this->_getParam('page'));
        //$paginator->setItemCountPerPage(1);
    }

    // Ad action actions
    public function createadAction()
    {
        $id = $this->_getParam('id', null);
        $this->view->campaign = $campaign = Engine_Api::_()->getItem('core_adcampaign', $id);

        $this->view->navigation = $navigation = Engine_Api::_()->getApi('menus', 'core')
            ->getNavigation('adcampaign_admin_main', array('params'=>array('id'=>$id)), 'adcampaign_admin_main_manageads');

        $this->view->form = $form = new Core_Form_Admin_Ads_Ad();

        if ($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost())) {
            $params = $form->getValues();
            $ad = Engine_Api::_()->getDbtable('ads', 'core')->createRow();
            $ad->setFromArray($params);
            $ad->ad_campaign = $id;

            $ad->save();

            // redirect to manage page for now
            $this->_helper->redirector->gotoRoute(array('action' => 'manageads', 'id'=>$id));
        }
    }

    public function editadAction()
    {
        $this->view->form = $form = new Core_Form_Admin_Ads_Adedit();
        $id = $this->_getParam('id', null);
        $campaign = Engine_Api::_()->getItem('core_ad', $id);

        // Save values
        if ($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost())) {
            $params = $form->getValues();
            $campaign->setFromArray($params);
            $campaign->save();

            $this->_forward('success', 'utility', 'core', array(
                'smoothboxClose' => true,
                'parentRefresh' => true,
                'format'=> 'smoothbox',
                'messages' => array(Zend_Registry::get('Zend_Translate')->_("Advertisement Edited."))
            ));
        }

        // Initialize values
        else {
            $form->populate($campaign->toArray());
        }
    }

    public function deleteadAction()
    {
        $this->view->form = $form = new Core_Form_Admin_Ads_Addelete();
        $id = $this->_getParam('id', null);

        if ($id) {
            $form->ad_id->setValue($id);
        }

        if ($this->getRequest()->isPost()) {
            $table = Engine_Api::_()->getDbtable('Ads', 'core');
            $db = $table->getAdapter();
            $db->beginTransaction();

            try {
                $ad = Engine_Api::_()->getItem('core_ad', $id);
                Engine_Api::_()->getApi('Ad', 'core')->deleteAd($ad);
                $db->commit();

                $this->_forward('success', 'utility', 'core', array(
                    'smoothboxClose' => true,
                    'parentRefresh' => true,
                    'format'=> 'smoothbox',
                    'messages' => array(Zend_Registry::get('Zend_Translate')->_("Advertisement Deleted."))
                ));
            } catch (Exception $e) {
                $db->rollBack();
                throw $e;
            }
        }
    }

    // code to handle upload stuff

    public function uploadPhotoAction()
    {
        if (!$this->_helper->requireUser()->checkRequire()) {
            $this->view->status = false;
            $this->view->error = Zend_Registry::get('Zend_Translate')->_("Max file size limit exceeded (probably).");
            return;
        }

        if (!$this->getRequest()->isPost()) {
            $this->view->status = false;
            $this->view->error = Zend_Registry::get('Zend_Translate')->_("Invalid request method");
            return;
        }

        if (empty($_FILES['file'])) {
            $this->view->status = false;
            $this->view->error = Zend_Registry::get('Zend_Translate')->_("No file");
            return;
        }

        if (!isset($_FILES['file']) || !is_uploaded_file($_FILES['file']['tmp_name'])) {
            $this->view->status = false;
            $this->view->error = Zend_Registry::get('Zend_Translate')->_("Invalid Upload");
            return;
        }
        $table = Engine_Api::_()->getDbtable('adphotos', 'core');
        $db = $table->getAdapter();
        $db->beginTransaction();

        try {
            $viewer = Engine_Api::_()->user()->getViewer();

            $params = array(
                'owner_type' => 'user',
                'owner_id' => $viewer->getIdentity()
            );
            $photo_id = Engine_Api::_()->getApi('Ad', 'core')->createPhoto($params, $_FILES['file'])->adphoto_id;
            $db->commit();

            $this->sendJson([
              'id' => $photo_id,
              'fileName' => $_FILES['file']['name'],
              'photo_id' => $photo_id,
              'photo_url' => "<a href='' target='_blank'><img src='".Engine_Api::_()->getItem('core_adphoto', $photo_id)->getPhotoUrl()."'/></a>",
            ]);
        } catch (Exception $e) {
            $db->rollBack();
            $this->view->status = false;
            $this->view->error = 'An error occurred.'.$e;
            // throw $e;
            return;
        }
    }

    public function previewAction()
    {
        $id = $this->_getParam('id', null);
        $campaign = Engine_Api::_()->getItem('core_ad', $id);
        $photo_id = $campaign->photo_id;

        $preview = $campaign->html_code;

        $this->view->preview = $preview;
    }

    public function removephotoAction()
    {
        $viewer = Engine_Api::_()->user()->getViewer();

        $photo_id= (int) $this->_getParam('photo_id');
        $photo = Engine_Api::_()->getItem('core_adphoto', $photo_id);

        if (!$this->getRequest()->isPost()) {
            return;
        }

        $db = $photo->getTable()->getAdapter();
        $db->beginTransaction();

        try {
            $photo->delete();
            // @todo need to delete it out of storage system
            $db->commit();
        } catch (Exception $e) {
            $db->rollBack();
            throw $e;
        }
    }

    public function deleteselectedAction()
    {
        $this->view->ids = $ids = $this->_getParam('ids', null);
        $confirm = $this->_getParam('confirm', false);
        $this->view->count = engine_count(explode(",", $ids));

        // Save values
        if ($this->getRequest()->isPost() && $confirm == true) {
            $ids_array = explode(",", $ids);
            foreach ($ids_array as $id) {
                $campaign = Engine_Api::_()->getItem('core_adcampaign', $id);
                $ads = $campaign->getAds();
                foreach ($ads as $ad) {
                    Engine_Api::_()->getApi('Ad', 'core')->deleteAd($ad);
                }
                $campaign->delete();
            }

            $this->_helper->redirector->gotoRoute(array('action' => 'index'));
        }
    }

    protected function _convertTimezone($date, $from, $to)
    {
        $dateObject = new Zend_Date();
        $dateObject->setTimezone($from);
        $dateObject->setIso($date);
        $dateObject->setTimezone($to);
        return $dateObject->toString('yyyy-MM-dd HH:mm:ss');
    }
}
