<?php
/*
  MODULOOM Package Tracking Service version 6.1
  This module has been adapted to fit in OpenCart 2.2.x.

  @package shippingMethod
  @copyright Copyright © 2012-2016 Philippe BLAIN <pblain@NOSPAMfree.fr>.
  ------------------------------------------------------------------------------
*/
define('PTS_TRACKER_STATUS_DISABLED',    0);
define('PTS_TRACKER_STATUS_ENABLED',     1);
define('PTS_TRACKER_STATUS_INOPERATIVE', 2);

class ModelModulePackageTracking extends Model {

  public function __construct($registry) {
    parent::__construct($registry);
    $this->load->model('tool/image');
    $this->load->helper('package_tracking');
  }

//#######################################################################
//#####                        TRACKERS                             #####
//#######################################################################

  public function getTracker($tracker_id) {
    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "pts_tracker WHERE tracker_id = '" . (int)$tracker_id . "'");

    return (($query instanceof stdClass) && isset($query->row) && is_array($query->row)) ? $query->row : null;
  }

  public function getTrackers($data = array()) {
    if (!empty($data)) {
      $sql = "SELECT * FROM " . DB_PREFIX . "pts_tracker";

      if (isset($data['filter_statuses']) && is_array($data['filter_statuses']) && !empty($data['filter_statuses'])) {
        $sql .= " WHERE tracker_status IN ('" . implode('\',\'', $data['filter_statuses']) . "')";
      } else {
        $sql .= " WHERE tracker_status >= 0";
      }

      if (isset($data['filter_tracker_id']) && !is_null($data['filter_tracker_id'])) {
        $sql .= " AND tracker_id = '" . (int)$data['filter_tracker_id'] . "'";
      }

      if (isset($data['filter_carrier_name']) && !is_null($data['filter_carrier_name'])) {
        $sql .= " AND tracker_carrier_name LIKE '%" . $this->db->escape($data['filter_carrier_name']) . "%'";
      }

      if (isset($data['filter_last_modified']) && !is_null($data['filter_last_modified'])) {
        $sql .= " AND DATE(last_modified) = DATE('" . $this->db->escape($data['filter_last_modified']) . "')";
      }

      if (isset($data['filter_date_added']) && !is_null($data['filter_date_added'])) {
        $sql .= " AND DATE(date_added) = DATE('" . $this->db->escape($data['filter_date_added']) . "')";
      }

      $sort_data = array(
        'tracker_carrier_name',
        'tracker_carrier_link'
      );

      if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
        $sql .= " ORDER BY " . $data['sort'];
      } else {
        $sql .= " ORDER BY tracker_carrier_name";
      }

      if (isset($data['order']) && ($data['order'] == 'DESC')) {
        $sql .= " DESC";
      } else {
        $sql .= " ASC";
      }

      if (isset($data['start']) || isset($data['limit'])) {
        if ($data['start'] < 0) {
          $data['start'] = 0;
        }

        if ($data['limit'] < 1) {
          $data['limit'] = 20;
        }

        $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
      }

      $query = $this->db->query($sql);

      return $query->rows;

    } else {

      $tracker_query_data = $this->cache->get('pts_tracker');
      if (!$tracker_query_data) {
        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "pts_tracker ORDER BY tracker_carrier_name ASC");
        $tracker_query_data = $query->rows;
        $this->cache->set('pts_tracker', $tracker_query_data);
      }
      return $tracker_query_data;
    }
  }

  public function getTotalTrackers($data = array()) {
    $sql = "SELECT COUNT(*) AS total FROM " . DB_PREFIX . "pts_tracker";

    if (!empty($data)) {
      if (isset($data['filter_statuses']) && is_array($data['filter_statuses']) && !empty($data['filter_statuses'])) {
        $sql .= " WHERE tracker_status IN ('" . implode('\',\'', $data['filter_statuses']) . "')";
      } else {
        $sql .= " WHERE tracker_status >= 0";
      }

      if (isset($data['filter_tracker_id']) && !is_null($data['filter_tracker_id'])) {
        $sql .= " AND tracker_id = '" . (int)$data['filter_tracker_id'] . "'";
      }

      if (isset($data['filter_carrier_name']) && !is_null($data['filter_carrier_name'])) {
        $sql .= " AND tracker_carrier_name LIKE '%" . $this->db->escape($data['filter_carrier_name']) . "%'";
      }

      if (isset($data['filter_last_modified']) && !is_null($data['filter_last_modified'])) {
        $sql .= " AND DATE(last_modified) = DATE('" . $this->db->escape($data['filter_last_modified']) . "')";
      }

      if (isset($data['filter_date_added']) && !is_null($data['filter_date_added'])) {
        $sql .= " AND DATE(date_added) = DATE('" . $this->db->escape($data['filter_date_added']) . "')";
      }
    }

    $query = $this->db->query($sql);
    return (($query instanceof stdClass) && isset($query->row) && is_array($query->row)) ? $query->row['total'] : 0;
  }

//#######################################################################
//#####                      MISCELLANEOUS                          #####
//#######################################################################

  public function getSomeSimpleOrderFields($order_id, $data = array()) {
    $result = array();
    if (!is_array($data) || empty($data)) return $result;

    $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` o WHERE o.order_id = '" . (int)$order_id . "'");

    if (($query instanceof stdClass) && isset($query->row) && is_array($query->row)) {
      foreach ($data as $key) {
        if (isset($query->row[$key])) $result[$key] = $query->row[$key];
      }
    }
    return $result;
  }

  public function decodeFieldToArray(&$field) {
    if (isset($field) && is_string($field)) {
      $a = array();
      if (!empty($field)) {
        if (isSerialized($field)) {
          if (is_array($u = unserialize($field))) $a = $u;
      } else {
          $a = preg_split("/[,;]+/", $field, -1, PREG_SPLIT_NO_EMPTY);
        }
        foreach ($a as &$value) $value = html_entity_decode(trim($value), ENT_QUOTES, 'UTF-8');
      }
      $field = $a;
    }
  }

  public function convertQueryField($query, $col) {
    if (($query instanceof stdClass) && isset($query->row)) {
      $this->decodeFieldToArray($query->row[$col]);

      foreach ($query->rows as &$row)
        $this->decodeFieldToArray($row[$col]);
    }
  }

  public function replaceTagsInLink($link, $data = array()) {
    // $data: array('tracking_number' => xxx, 'shipping_postcode' => yyy)
    if (!is_array($data)) return $link;
    $find = array();
    foreach (array_keys($data) as $key) {
      $find[] = '{$'.(string)$key.'}';
    }
    return str_replace($find, $data, $link);
  }

  // Declare "$this->load->helper('package_tracking'); $this->load->model('tool/image');" before calling this function
  public function renderTrackingNumbers($tracker_id, $tracking_numbers = array(), $shipping_postcode = '', $with_image = false, $img_scale = 100, $with_anchor = false) {
    $html = '';
    if (isset($tracker_id) && $tracker_id > 0) {
      $tracker_info = $this->getTracker($tracker_id);
      if (!empty($tracker_info) && is_array($tracker_info)) {
        if ($with_image && !empty($tracker_info['tracker_image']) && is_file(DIR_IMAGE . $tracker_info['tracker_image'])) {
          $dims = getImageDimensions($tracker_info['tracker_image'], $img_scale);
          $thumb = $this->model_tool_image->resize($tracker_info['tracker_image'], $dims['width'], $dims['height']);
          $html .= '<img src="'.$thumb.'" alt="'.$tracker_info['tracker_carrier_name'].'" style="padding: 1px; border: 1px solid #DDDDDD;" /><br />';
        }
        $html .= $tracker_info['tracker_carrier_name'];
        for ($k = 0, $count = count($tracking_numbers); $k < $count; $k++) {
          if ($with_anchor) {
            if (isset($tracker_info['tracker_status']) && in_array($tracker_info['tracker_status'], array(PTS_TRACKER_STATUS_ENABLED, PTS_TRACKER_STATUS_DISABLED)))
              $t_num = '<a href="' . $this->replaceTagsInLink($tracker_info['tracker_carrier_link'], array('tracking_number' => trim($tracking_numbers[$k]), 'shipping_postcode' => $shipping_postcode)) . '" target="_blank">' . htmlentities(trim($tracking_numbers[$k]), ENT_QUOTES, 'UTF-8') . '</a>';
            else
              $t_num = htmlentities(trim($tracking_numbers[$k]), ENT_QUOTES, 'UTF-8');
          } else $t_num = htmlentities(trim($tracking_numbers[$k]), ENT_QUOTES, 'UTF-8');
          $html .= '<br />'.$t_num;
        }
      } else {
        $html .= 'Tracker (#Id='.$tracker_id.') not found.';
      }
    }
    return $html;
  }
}
?>