<?php
namespace App\Model;
use App\Core\Library\Security;
use App\Core\Model\CoreModel;
use App\Config\Main;
use App\Core\Service\Logger;
abstract class BaseModel extends CoreModel
{
	public $client_db_prefix =  '';
	public $validity_period = [['id' => 'DAY', 'name' => 'Day(s)'], ['id' => 'MONTH', 'name' => 'Month(s)'], ['id' => 'YEAR', 'name' => 'Year(s)']];
	public $whatsapp_solution_provider = [['id' => 'teaminspector', 'name' => 'Teaminspector']];
	public $template_vars = [
		'{{name}}'        => 'Name',
		'{{email_id}}'    => 'Email Id',
		'{{sms_otp}}'     => 'SMS OTP',
		'{{email_otp}}'   => 'Email OTP',
		'{{password}}'    => 'Password',
		'{{url}}'         => 'Link',
		'{{subject}}'     => 'Subject',
		'{{client_name}}' => 'Client Name'
	];

	public $template_for = [
		'sms_for_test' => 'Test OTP SMS',
		'sms_for_otp' => 'OTP SMS',
		'email_for_otp' => 'OTP Email',
		'email_for_test' => 'Test OTP Email',
		'email_for_new_user' => 'Notification Email for New User',
		'email_for_new_client' => 'Notification Email for New Client',
		'email_for_meeting_invitation' => 'Meeting Invitation Email',
		'sms_for_meeting_invitation' => 'Meeting Invitation SMS/WhatsApp',
		'email_for_down_server' => 'Down Server Notification Email'
	];

	public function __construct()
	{
		parent::__construct();
		$this->client_db_prefix = Main::$client_db_prefix;
	}

	public function whereString($search, $tableAliasAr = array(), $operator = array(), $colmnName = array())
	{
		$whereAr[] = " 1=1";
		foreach ($search as $field => $value) {
			$field = trim($field);
			$value = ($value != NULL) ? trim($value) : $value;
			if ($value != '') {
				if (in_array($field, array('list_type', 'list_id', 'pageNoH', 'recToShowH', 'orderByH', 'sortByH'))) {
					continue;
				}
				if (isset($tableAliasAr[$field]) && $tableAliasAr[$field] != '') $tableAlias = $tableAliasAr[$field];
				elseif (isset($tableAliasAr['*']) && $tableAliasAr['*'] != '') $tableAlias = $tableAliasAr['*'];
				else $tableAlias = '';
				$field = Security::xssClean($field);
				$value = Security::xssClean($value);
				$field = self::escapeStr($field);
				$value = self::escapeStr($value);
				if (isset($colmnName[$field]) && $colmnName[$field] != '') $fldName = $colmnName[$field];
				else $fldName =  $field;
				if (count($operator) > 0 && isset($operator[$field])) {
					if ($operator[$field] == 'LIKE') {
						$whereAr[] = $tableAlias . $fldName . " LIKE '%" . $value . "%'";
					} elseif ($operator[$field] == 'LIKELEFT') {
						$whereAr[] = $tableAlias . $fldName . " LIKE '%" . $value . "'";
					} elseif ($operator[$field] == 'LIKERIGHT') {
						$whereAr[] = $tableAlias . $fldName . " LIKE '" . $value . "%'";
					} elseif ($operator[$field] == 'GT') {
						$whereAr[] = $tableAlias . $fldName . " > '" . $value . "'";
					} elseif ($operator[$field] == 'LT') {
						$whereAr[] = $tableAlias . $fldName . " < '" . $value . "'";
					} elseif ($operator[$field] == 'GTE') {
						$whereAr[] = $tableAlias . $fldName . " >= '" . $value . "'";
					} elseif ($operator[$field] == 'LTE') {
						$whereAr[] = $tableAlias . $fldName . " <= '" . $value . "'";
					} elseif ($operator[$field] == 'IN') {
						$whereAr[] = $tableAlias . $fldName . " IN (" . $value . ")";
					} elseif ($operator[$field] == 'NOTIN') {
						$whereAr[] = $tableAlias . $fldName . " NOT IN (" . $value . ")";
					} elseif ($operator[$field] == 'ISNULL') {
						$whereAr[] = $tableAlias . $fldName . " IS NULL ";
					} elseif ($operator[$field] == 'ISNOTNULL') {
						$whereAr[] = $tableAlias . $fldName . " IS NOT NULL ";
					} elseif ($operator[$field] == 'NOT') {
						$whereAr[] = $tableAlias . $fldName . " != '" . $value . "'";
					} elseif ($operator[$field] == 'DLIKE') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") LIKE '%" . $value . "%'";
					} elseif ($operator[$field] == 'DLIKELEFT') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") LIKE '%" . $value . "'";
					} elseif ($operator[$field] == 'DLIKERIGHT') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") LIKE '" . $value . "%'";
					} elseif ($operator[$field] == 'DGT') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") > '" . $value . "'";
					} elseif ($operator[$field] == 'DLT') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") < '" . $value . "'";
					} elseif ($operator[$field] == 'DGTE') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") >= '" . $value . "'";
					} elseif ($operator[$field] == 'DLTE') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") <= '" . $value . "'";
					} elseif ($operator[$field] == 'DIN') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") IN (" . $value . ")";
					} elseif ($operator[$field] == 'DNOTIN') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") NOT IN (" . $value . ")";
					} elseif ($operator[$field] == 'DNOT') {
						$whereAr[] = "date(" . $tableAlias . $fldName . ") != '" . $value . "'";
					} elseif ($operator[$field] == 'FINDINSET') {
						$whereAr[] = " FIND_IN_SET(" . $value . ',' . $tableAlias . $fldName . ")";
					} elseif ($operator[$field] == 'NULLNOTNULL') {
						$whereAr[] = $tableAlias . $fldName . " ".$value;
					} elseif ($operator[$field] == 'DGTE_F') {
						$date = date('Y-m-d', strtotime($value));
						$whereAr[] = "date(" . $tableAlias . $fldName . ") >= '" . $date . "'";
					} elseif ($operator[$field] == 'DGTE_FF') {
						$date = date('Y-m-d H:i:s', strtotime($value));
						$whereAr[] = $tableAlias . $fldName . " >= '" . $date . "'";
					} elseif ($operator[$field] == 'DLTE_LL') {
						$date = date('Y-m-d H:i:s', strtotime($value));
						$whereAr[] = $tableAlias . $fldName . " <= '" . $date . "'";
					} elseif ($operator[$field] == 'DLTE_L') {
						$date = date('Y-m-d', strtotime($value));
						$whereAr[] = "date(" . $tableAlias . $fldName . ") <= '" . $date . "'";
					} else {
						$whereAr[] = $tableAlias . $fldName . "='" . $value . "'";
					}
				} else {
					$whereAr[] = $tableAlias . $fldName . "='" . $value . "'";
				}
			}
		}
		return implode(' AND ', $whereAr);
	}

	function callProcedure(String $procedure_name, Array $params = array(), Bool $single = false)
	{
		try {
			$placeholders = array();
			$tmpparams = array();
			foreach ($params as $key => $val) {
				$ky = trim(preg_replace('/\s+/', '', $key));
				$placeholders[] = ':'.trim(preg_replace('/\s+/', '', $key));
				$tmpparams[$ky] = $val;
			}
			$placeholders_str = '';
			if(!empty($placeholders)) {
				$placeholders_str = implode(',', $placeholders);
			}
            $sql = "CALL " . $procedure_name . "(" . $placeholders_str . ")";
            // Logger::debug($sql, ['File' => __FILE__, 'Line' => __LINE__]);
			// Logger::debug(json_encode($params), ['File' => __FILE__, 'Line' => __LINE__]);
			$countrs = $this->fetchMultiSetData($sql, $tmpparams);
            if (empty($countrs['status'])) {
                throw new \Exception($countrs['error']);
            }
            if(!empty($countrs['data'])) {
                if(!empty($countrs['data'][0])) {
                    return ["status"=>true, "data"=>$single ? $countrs['data'][0][0] : $countrs['data'][0]];
                } else {
                    return ["status"=>true, "data"=>NULL];
                }
            } else {
                return ["status"=>true, "data"=>NULL];
            }
            return ["status" => true, "data" => $rsp['data']];
        } catch (\Exception $e) {
			
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
	}

	function callProcedureMultiResult(String $procedure_name, Array $params = array())
	{
		try {
			$placeholders = array();
			$tmpparams = array();
			foreach ($params as $key => $val) {
				$ky = trim(preg_replace('/\s+/', '', $key));
				$placeholders[] = ':'.trim(preg_replace('/\s+/', '', $key));
				$tmpparams[$ky] = $val;
			}
			$placeholders_str = '';
			if(!empty($placeholders)) {
				$placeholders_str = implode(',', $placeholders);
			}
            $sql = "CALL " . $procedure_name . "(" . $placeholders_str . ")";
            Logger::debug($sql, ['File' => __FILE__, 'Line' => __LINE__]);
			Logger::debug(json_encode($params), ['File' => __FILE__, 'Line' => __LINE__]);
			$countrs = $this->fetchMultiSetData($sql, $tmpparams);
            if (empty($countrs['status'])) {
                throw new \Exception($countrs['error']);
            }
            if(!empty($countrs['data'])) {
                if(!empty($countrs['data'])) {
                    return ["status"=>true, "data"=>$countrs['data']];
                } else {
                    return ["status"=>true, "data"=>NULL];
                }
            } else {
                return ["status"=>true, "data"=>NULL];
            }
            return ["status" => true, "data" => $rsp['data']];
        } catch (\Exception $e) {
			
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
	}
}
