<?php
class Contesting_model extends CI_Model {

    /*
     * This function gets the QSOs to fill the "Contest Logbook" under the contesting form.
     */
    function getSessionQsos($qso) {
        $CI =& get_instance();
        $CI->load->model('Stations');
        $station_id = $CI->Stations->find_active();

        $qsoarray = explode(',', $qso);

        $contestid = $qsoarray[2];
        $date = DateTime::createFromFormat('d-m-Y H:i:s', $qsoarray[0]);
        if ($date == false) $date = DateTime::createFromFormat('d-m-Y H:i', $qsoarray[0]);
        // If date still can't be parsed fall back to start of today (UTC) to show all today's QSOs
        if ($date == false) $date = new DateTime('today', new DateTimeZone('UTC'));
        $date = $date->format('Y-m-d H:i:s');

		$this->db->select("date_format(col_time_on, '%d-%m-%Y %H:%i:%s') as col_time_on, col_call, col_band, col_mode,
	       		col_submode, col_rst_sent, col_rst_rcvd, coalesce(col_srx, '') col_srx, coalesce(col_srx_string, '') col_srx_string,
	       		coalesce(col_stx, '') col_stx, coalesce(col_stx_string, '') col_stx_string, coalesce(col_gridsquare, '') col_gridsquare,
	       		coalesce(col_vucc_grids, '') col_vucc_grids", false);
		$this->db->from($this->config->item('table_name'));
		$this->db->where('station_id', (int) $station_id);
		$this->db->where('COL_TIME_ON >=', $date);
		$this->db->where('COL_CONTEST_ID', $contestid);
		$this->db->order_by('COL_PRIMARY_KEY', 'ASC');

		$data = $this->db->get();
        return $data->result();
    }

	function getSessionFreshQsos($contest_id) {
        $CI =& get_instance();
        $CI->load->model('Stations');
        $station_id = $CI->Stations->find_active();

		$contestid = (string) $contest_id;

		// save contestid to debug
		// Get current date and time
		$now = new DateTime();
		$now->modify('-1 minute');
		$date = $now->format('Y-m-d H:i:s');

		$this->db->select("date_format(col_time_on, '%d-%m-%Y %H:%i:%s') as col_time_on, col_call, col_band, col_mode,
	       		col_submode, col_rst_sent, col_rst_rcvd, coalesce(col_srx, '') col_srx, coalesce(col_srx_string, '') col_srx_string,
	       		coalesce(col_stx, '') col_stx, coalesce(col_stx_string, '') col_stx_string, coalesce(col_gridsquare, '') col_gridsquare,
	       		coalesce(col_vucc_grids, '') col_vucc_grids", false);
		$this->db->from($this->config->item('table_name'));
		$this->db->where('station_id', (int) $station_id);
		$this->db->where('COL_TIME_ON >=', $date);
		$this->db->where('COL_CONTEST_ID', $contestid);
		$this->db->order_by('COL_PRIMARY_KEY', 'ASC');

		$data = $this->db->get();

        return $data->result();
    }

	function getSession() {
        $CI =& get_instance();
        $CI->load->model('Stations');
        $station_id = $CI->Stations->find_active();

		$this->db->where('station_id', (int) $station_id);
		$data = $this->db->get('contest_session');

        return $data->row();
    }



	function deleteSession() {
        $CI =& get_instance();
        $CI->load->model('Stations');
        $station_id = $CI->Stations->find_active();

		$this->db->where('station_id', (int) $station_id);
		$this->db->delete('contest_session');
		return;
    }

	function setSession() {
        $CI =& get_instance();
        $CI->load->model('Stations');
        $station_id = $CI->Stations->find_active();

		$qso = "";

		if ($this->input->post('callsign')) {
			// In LIVE mode start_date/start_time are disabled fields and not submitted, use server UTC time
			$start_date = xss_clean($this->input->post('start_date', true));
			$start_time = xss_clean($this->input->post('start_time', true));
			if (empty($start_date) || empty($start_time)) {
				$timestamp = gmdate('d-m-Y H:i:s');
			} else {
				$timestamp = $start_date . ' ' . $start_time;
			}
			$qso = $timestamp . ',' . xss_clean($this->input->post('callsign', true)) . ',' . xss_clean($this->input->post('contestname', true));
		}

		$data = array(
			'contestid' 			=> xss_clean($this->input->post('contestname', true)),
			'exchangetype' 			=> xss_clean($this->input->post('exchangetype', true)),
			'exchangesent' 			=> xss_clean($this->input->post('exch_sent', true)),
			'serialsent' 			=> xss_clean($this->input->post('exch_serial_s', true)),
			'copytodok'             => $this->input->post('copyexchangetodok', true) == "" ? 0 : xss_clean($this->input->post('copyexchangetodok', true)),
			'qso' 					=> $qso,
			'station_id' 			=> $station_id,
		);

        if ($this->input->post('copyexchangeto')) {
          $data['copytodok'] = xss_clean($this->input->post('copyexchangeto'));
        }

		$this->db->where('station_id', (int) $station_id);
		$querydata = $this->db->get('contest_session');

		if ($querydata->num_rows() == 0) {
			$this->db->insert('contest_session', $data);
			return;
		}

		$result = $querydata->row();

		if ($result->qso != "") {
			// Only keep the existing qso marker if its timestamp is valid to avoid persisting bad data
			$existing_parts = explode(',', $result->qso);
			$existing_date = DateTime::createFromFormat('d-m-Y H:i:s', $existing_parts[0]);
			if ($existing_date == false) $existing_date = DateTime::createFromFormat('d-m-Y H:i', $existing_parts[0]);
			if ($existing_date !== false) {
				$data['qso'] = $result->qso;
			}
		}

		$this->updateSession($data, $station_id);
		
		return;
    }

	function updateSession($data, $station_id) {
		$this->db->where('station_id', $station_id);

		$this->db->update('contest_session', $data);
    }

    function getActivecontests() {

		$sql = "SELECT name, adifname FROM contest WHERE active = 1 ORDER BY name ASC";

		$data = $this->db->query($sql);

		return($data->result_array());
	}

	function getAllContests() {

		$sql = "SELECT id, name, adifname, active FROM contest ORDER BY name ASC";

		$data = $this->db->query($sql);

		return($data->result_array());
	}

	function delete($id) {
		$clean_id = (int) $id;

		// Delete Contest
		$this->db->delete('contest', array('id' => $clean_id));
	}

	function activate($id) {
		$clean_id = (int) $id;

		$data = array(
			'active' => '1',
		);

		$this->db->where('id', $clean_id);

		$this->db->update('contest', $data);

		return true;
	}

	function deactivate($id) {
		$clean_id = (int) $id;

		$data = array(
			'active' => '0',
		);

		$this->db->where('id', $clean_id);

		$this->db->update('contest', $data);

		return true;
	}

	function add() {
		$data = array(
			'name' => xss_clean($this->input->post('name', true)),
			'adifname' => xss_clean($this->input->post('adifname', true)),
		);

		$this->db->insert('contest', $data);
	}

	function contest($id) {
		$clean_id = (int) $id;

		$this->db->select('id, name, adifname, active');
		$this->db->where('id', $clean_id);
		$data = $this->db->get('contest');

		return ($data->row());
	}

	function edit($id) {
		$data = array(
			'name' => xss_clean($this->input->post('name', true)),
			'adifname' => xss_clean($this->input->post('adifname', true)),
			'active' =>  xss_clean($this->input->post('active', true)),
		);

		$this->db->where('id', (int) $id);
		$this->db->update('contest', $data);
	}

	function activateall() {
		$data = array(
			'active' => '1',
		);

		$this->db->update('contest', $data);

		return true;
	}

	function deactivateall() {
		$data = array(
			'active' => '0',
		);

		$this->db->update('contest', $data);

		return true;
	}

	function checkIfWorkedBefore($call, $band, $mode, $contest) {
		$CI =& get_instance();
		$CI->load->model('Stations');
		$station_id = $CI->Stations->find_active();

		$contest_session = $this->getSession();
		
		if ($contest_session && $contest_session->qso != "") {
			$qsoarray = explode(',', $contest_session->qso);
	
			$date = DateTime::createFromFormat('d-m-Y H:i:s', $qsoarray[0]);
			if ($date == false) $date = DateTime::createFromFormat('d-m-Y H:i', $qsoarray[0]);
			$date = $date->format('Y-m-d H:i:s');

			$this->db->select('timediff(UTC_TIMESTAMP(),col_time_off) b4, COL_TIME_OFF');
			$this->db->where('STATION_ID', $station_id);
			$this->db->where('COL_CALL', xss_clean($call));
			$this->db->where("COL_BAND", xss_clean($band));
			$this->db->where("COL_CONTEST_ID", xss_clean($contest));
			$this->db->where("COL_TIME_ON >=", $date);
			$this->db->group_start();
			$this->db->where("COL_MODE", xss_clean($mode));
			$this->db->or_where("COL_SUBMODE", xss_clean($mode));
			$this->db->group_end();
        		$this->db->order_by($this->config->item('table_name').".COL_TIME_ON", "DESC");
			$query = $this->db->get($this->config->item('table_name'));
	
			return $query;
		}
		return;
	}

	function export_custom($from, $to, $contest_id, $station_id) {
		$station_id = (int) $station_id;
		$contest_id = (string) $contest_id;
        $this->db->select(''.$this->config->item('table_name').'.*, station_profile.*');
        $this->db->from($this->config->item('table_name'));
        $this->db->where($this->config->item('table_name').'.station_id', $station_id);

        // If date is set, we format the date and add it to the where-statement
        if ($from != 0) {
            $from = DateTime::createFromFormat('Y-m-d', $from);
            $from = $from->format('Y-m-d');
			$this->db->where('DATE('.$this->config->item('table_name').'.COL_TIME_ON) >= '.$this->db->escape($from), NULL, FALSE);
        }
        if ($to != 0) {
            $to = DateTime::createFromFormat('Y-m-d', $to);
            $to = $to->format('Y-m-d');
			$this->db->where('DATE('.$this->config->item('table_name').'.COL_TIME_ON) <= '.$this->db->escape($to), NULL, FALSE);
        }

		$this->db->where($this->config->item('table_name').'.COL_CONTEST_ID', $contest_id);

        $this->db->order_by($this->config->item('table_name').".COL_TIME_ON", "ASC");

        $this->db->join('station_profile', 'station_profile.station_id = '.$this->config->item('table_name').'.station_id');

        return $this->db->get();
    }

	function get_logged_contests2() {
		$CI =& get_instance();
        $CI->load->model('Stations');
		$station_id = (int) $CI->Stations->find_active();

		$this->db->select('col_contest_id, min(date(col_time_on)) mindate, max(date(col_time_on)) maxdate, year(col_time_on) year, month(col_time_on) month', false);
		$this->db->from($this->config->item('table_name'));
		$this->db->where("coalesce(COL_CONTEST_ID, '') <> ''", NULL, FALSE);
		$this->db->where('station_id', $station_id);
		$this->db->group_by('COL_CONTEST_ID, year(col_time_on), month(col_time_on)', false);
		$this->db->order_by('year(col_time_on)', 'DESC', false);

		$data = $this->db->get();

		return ($data->result());
	}

	function get_logged_years($station_id) {
		$station_id = (int) $station_id;
		$this->db->distinct();
		$this->db->select('year(col_time_on) year', false);
		$this->db->from($this->config->item('table_name'));
		$this->db->where("coalesce(COL_CONTEST_ID, '') <> ''", NULL, FALSE);
		$this->db->where('station_id', $station_id);
		$this->db->order_by('year(col_time_on)', 'DESC', false);
		$data = $this->db->get();

		return $data->result();
	}

	function get_logged_contests($station_id, $year) {
		$station_id = (int) $station_id;
		$year = (int) $year;
		$this->db->distinct();
		$this->db->select('col_contest_id');
		$this->db->from($this->config->item('table_name'));
		$this->db->where("coalesce(COL_CONTEST_ID, '') <> ''", NULL, FALSE);
		$this->db->where('station_id', $station_id);
		$this->db->where('year(col_time_on)', $year, false);
		$this->db->order_by('COL_CONTEST_ID', 'ASC');
		$data = $this->db->get();

        return $data->result();
    }

	function get_contest_dates($station_id, $year, $contestid) {
		$station_id = (int) $station_id;
		$year = (int) $year;
		$this->db->distinct();
		$this->db->select('date(col_time_on) date', false);
		$this->db->from($this->config->item('table_name'));
		$this->db->where("coalesce(COL_CONTEST_ID, '') <> ''", NULL, FALSE);
		$this->db->where('station_id', $station_id);
		$this->db->where('year(col_time_on)', $year, false);
		$this->db->where('col_contest_id', $contestid);
		$data = $this->db->get();

        return $data->result();
	}
}
