<?php
/** no direct access **/
defined('MECEXEC') or die();

/**
 * Webnus MEC schedule class.
 * @author Webnus <info@webnus.net>
 */
class MEC_schedule extends MEC_base
{
    private $db;
    private $main;
    private $render;

    public function __construct()
    {
        $this->db = $this->getDB();
        $this->main = $this->getMain();
        $this->render = $this->getRender();
    }

    public function cron()
    {
        // Get All Events
        $events = $this->main->get_events();

        // Append Schedule for Events
        foreach($events as $event)
        {
            $maximum = 50;
            $repeat_type = get_post_meta($event->ID, 'mec_repeat_type', true);

            // Reschedule Schedule for Normal and Custom Days Events
            if($repeat_type === '' or $repeat_type === 'custom_days') $this->reschedule($event->ID, 200);
            else $this->append($event->ID, $maximum);
        }
    }

    public function reschedule($event_id, $maximum = 200)
    {
        // Clean Current Schedule
        $this->clean($event_id);

        // Event Start Date
        $start = get_post_meta($event_id, 'mec_start_date', true);

        if(trim($start) == '' or $start == '0000-00-00') $start = date('Y-m-d', strtotime('-1 Year'));
        else $start = date('Y-m-d', strtotime('-1 Day', strtotime($start)));

        // New Schedule
        $this->schedule($event_id, $start, $maximum);
    }

    public function append($event_id, $maximum = 25)
    {
        // Get Start Date
        $start = $this->time($event_id, 'max', 'Y-m-d');

        // Don't create dates more than next 7 years!
        if(strtotime($start) > strtotime('+7 years', current_time('timestamp', 0))) return;

        // Append Schedule
        $this->schedule($event_id, $start, $maximum);
    }

    public function schedule($event_id, $start, $maximum = 100)
    {
        // Get event dates
        $dates = $this->render->dates($event_id, NULL, $maximum, $start);

        // No new date found!
        if(!is_array($dates) || !count($dates)) return false;

        // All Day Event
        $allday = get_post_meta($event_id, 'mec_allday', true);

        // Public Event
        $public = get_post_meta($event_id, 'mec_public', true);
        if(trim($public) === '') $public = 1;

        // Create Public Column If Not Exists
        if(!$this->db->columns('mec_dates', 'public')) $this->db->q("ALTER TABLE `#__mec_dates` ADD `public` INT(4) UNSIGNED NOT NULL DEFAULT 1 AFTER `tend`;");

        foreach($dates as $date)
        {
            $sd = $date['start']['date'];
            $ed = $date['end']['date'];

            $start_hour = isset($date['start']['hour']) ? sprintf("%02d", $date['start']['hour']) : '08';
            $start_minute = isset($date['start']['minutes']) ? sprintf("%02d", $date['start']['minutes']) : '00';
            $start_ampm = $date['start']['ampm'] ?? 'AM';

            if($start_hour == '00')
            {
                $start_hour = '';
                $start_minute = '';
                $start_ampm = '';
            }

            $start_time = $start_hour.':'.$start_minute.' '.$start_ampm;

            $end_hour = isset($date['end']['hour']) ? sprintf("%02d", $date['end']['hour']) : '06';
            $end_minute = isset($date['end']['minutes']) ? sprintf("%02d", $date['end']['minutes']) : '00';
            $end_ampm = $date['end']['ampm'] ?? 'PM';

            if($end_hour == '00')
            {
                $end_hour = '';
                $end_minute = '';
                $end_ampm = '';
            }

            $end_time = $end_hour.':'.$end_minute.' '.$end_ampm;

            // All Day Event
            if($allday)
            {
                $start_time = '12:01 AM';
                $end_time = '11:59 PM';
            }

            $st = strtotime(trim($date['start']['date'].' '.$start_time, ' :'));
            $et = strtotime(trim($date['end']['date'].' '.$end_time, ' :'));

            $date_id = $this->db->select("SELECT `id` FROM `#__mec_dates` WHERE `post_id`='$event_id' AND `tstart`='$st' AND `tend`='$et'", 'loadResult');

            // Add new Date
            if(!$date_id) $this->db->q("INSERT INTO `#__mec_dates` (`post_id`,`dstart`,`dend`,`tstart`,`tend`,`public`) VALUES ('$event_id','$sd','$ed','$st','$et','$public');");
            // Update Existing Record
            else $this->db->q("UPDATE `#__mec_dates` SET `tstart`='$st', `tend`='$et', `public`='$public' WHERE `id`='$date_id';");
        }

        return true;
    }

    public function clean($event_id)
    {
        // Remove All Scheduled Dates
        return $this->db->q("DELETE FROM `#__mec_dates` WHERE `post_id`='$event_id'");
    }

    public function time($event_id, $type = 'max', $format = 'Y-m-d')
    {
        $time = $this->db->select("SELECT ".(strtolower($type) == 'min' ? 'MIN' : 'MAX')."(`tstart`) FROM `#__mec_dates` WHERE `post_id`='$event_id'", 'loadResult');
        if(!$time) $time = time();

        return date($format, $time);
    }

    public function get_reschedule_maximum($repeat_type)
    {
        if($repeat_type == 'daily') return 370;
        elseif($repeat_type == 'weekday') return 270;
        elseif($repeat_type == 'advanced') return 250;
        elseif($repeat_type == 'weekend') return 200;
        elseif($repeat_type == 'certain_weekdays') return 200;
        elseif($repeat_type == 'weekly') return 100;
        elseif($repeat_type == 'monthly') return 50;
        elseif($repeat_type == 'yearly') return 50;
        else return 50;
    }
}