<?php
class DModelLogLog extends Model {

  private function getJsonField($data, $fieldName, $defaultValue = ''){
    if (isset($data[$fieldName])) {
      $result = json_encode($data[$fieldName]);
      if ($result) {
        $result = "'" . $this->db->escape(json_encode($data[$fieldName])) . "'";
      } else {
        $result = $data[$fieldName];
      }
    } else {
      $result = $defaultValue;
    }

    return $result;
  }

  private function getTextField($data, $fieldName, $defaultValue = ''){
    if (isset($data[$fieldName])) {
      $result = "'" . $this->db->escape($data[$fieldName]) . "'";
    } else {
      $result = $defaultValue;
    }

    return $result;
  }

  private function getMd5Field($data){
    $tipoIntegracao = $this->getTextField($data, 'tipoIntegracao');
    $url            = $this->getTextField($data, 'url');
    $metodo         = $this->getTextField($data, 'metodo');
    $httpCode       = $this->getTextField($data, 'httpCode');
    $retorno        = $this->getJsonField($data, 'retorno');
    $enviado        = $this->getJsonField($data, 'enviado');

    $strLog = trim($data['tipoEnviado']) . "|" .trim($tipoIntegracao) . "|" . trim($data['tipoLog']) . "|" . trim($data['tipoId']) . "|" .
              trim($data['entidadeId']) . "|" . trim($url) . "|" . trim($metodo) . "|" . trim($httpCode) . "|" .
              trim($retorno) . "|" . trim($enviado);
    return md5($strLog);
  }

  public function saveLogDB($data){
    if (isset($data['dataHora'])) {
      $dataHora = $data['dataHora'];
    } else {
      $dataHora = $this->db->dataAtual();
    }

    $tipoIntegracao = $this->getTextField($data, 'tipoIntegracao', 'null');
    $url            = $this->getTextField($data, 'url', 'null');
    $metodo         = $this->getTextField($data, 'metodo', 'null');
    $httpCode       = $this->getTextField($data, 'httpCode', 'null');
    $entidadeId     = $this->getTextField($data, 'entidadeId', 'null');
    $retorno        = $this->getJsonField($data, 'retorno', 'null');
    $enviado        = $this->getJsonField($data, 'enviado', 'null');
    $md5            = $this->getMd5Field($data);

    // Verifica se o md5 gerado é o mesmo do ultimo log, pra não ficar salvando informações repetidas em sequencia
    if ($data['tipoLog'] == Type_Log::Tp_LogPedido) {
      if (!isset($data['tipoIntegracao'])) {
        $lastOrderLog = $this->getLastOrderLogByOrderId($data['entidadeId']);
      } else {
        $lastOrderLog = $this->getLastOrderLogByOrderId(null, $data['tipoIntegracao'], $data['entidadeId']);
      }

      if (isset($lastOrderLog)){
        if ($md5 == $lastOrderLog['md5']) {
          return;
        }
      }
    }

    $sql = "insert into oc_log set "
      . " data_hora = '"  . $this->db->escape($dataHora) . "',"
      . " tipo_enviado = '"    . $this->db->escape($data['tipoEnviado']) . "',"
      . " tipo_integracao = " . $tipoIntegracao . ","
      . " origem = '"   . $this->db->escape($data['origem']) . "',"
      . " tipo_log = '"   . $this->db->escape($data['tipoLog']) . "',"
      . " tipo_id = '"   . $this->db->escape($data['tipoId']) . "',"
      . " entidade_id = "   . $entidadeId . ","
      . " url = "   . $url . ","
      . " metodo = " . $metodo . ","
      . " retorno_http = " . $httpCode . ","
      . " retorno = " . $retorno . ","
      . " enviado = " . $enviado . ","
      . " md5 = '" . $md5 . "'";
    $this->db->query($sql);

    $this->deleteOldLogs($data);
  }

  public function getOrderLogByOrderId($orderId = null, $tipoIntegracao = null, $mktOrderId = null, $limit = false){
    $sqlOrderId = '';
    if (isset($orderId)){
      $sqlOrderId = " ((entidade_id = '" . $this->db->escape($orderId) . "') and (tipo_id = '" . $this->db->escape(Type_LogId::Tp_LogIdPedido) . "'))";
    }

    $sqlMktId = '';
    if (isset($tipoIntegracao) and isset($mktOrderId)) {
      $sqlMktId = "((entidade_id = '" . $this->db->escape($mktOrderId) . "')"
      . " and (tipo_id = '" . $this->db->escape(Type_LogId::Tp_LogIdMktPedido) . "')"
      . " and (tipo_integracao = '" . $this->db->escape($tipoIntegracao) . "'))";
    }

    $sqlFilterOrder = "";
    if (!empty($sqlOrderId)){
      $sqlFilterOrder = $sqlOrderId;
    }

    if (!empty($sqlMktId)){
      if (empty($sqlFilterOrder)){
        $sqlFilterOrder = $sqlMktId;
      } else {
        $sqlFilterOrder .= " or " . $sqlMktId;
      }
    }

    $limit ? $sqlLimit = " limit " . $limit: $sqlLimit = "";

    $sql = "select * from oc_log "
      . " where tipo_log = "   . $this->db->escape(Type_Log::Tp_LogPedido)
      . " and   (" . $sqlFilterOrder . ")"
      . " order by data_hora desc"
      . $sqlLimit;

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

    return $query->rows;
  }

  public function getLastOrderLogByOrderId($orderId = null, $tipoIntegracao = null, $mktOrderId = null){
    $result = $this->getOrderLogByOrderId($orderId, $tipoIntegracao, $mktOrderId, 1);

    if (!empty($result)){
      return $result['0'];
    } else {
      return;
    }
  }

    public function deleteOldLogs($data){
        $maxLogsSameType = 30;

        $sql = "SELECT  * FROM `oc_log`
                WHERE tipo_log = " . $data['tipoLog'] . "
                AND tipo_id = " . $data['tipoId'] . "
                AND entidade_id = '" . $data['entidadeId'] . "'
                AND tipo_enviado = " . $data['tipoEnviado'] . "
                AND tipo_integracao = " . ($data['tipoIntegracao'] ?? "null") . "
                AND origem = '" . $data['origem'] . "'
                AND url = " . (!empty($data['url']) ? "'".$data['url']."'" : "null") . "
                AND metodo = " . (!empty($data['metodo']) ? "'".$data['metodo']."'" : "null") . "
                AND retorno_http = " . (!empty($data['httpCode']) ? "'".$data['httpCode']."'" : "null") . "
                ORDER BY data_hora desc
                LIMIT $maxLogsSameType, 1";

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

        if ($query->num_rows){
            $logId = $query->row['log_id'];

            $sql = "DELETE FROM `oc_log`
                    WHERE log_id = " . $logId;

            $this->db->executeSql($sql, []);
        }
    }

}