<?php

namespace App\Model;

use App\Model\BaseModel;
use App\Core\Service\Logger;

class AdminModel extends BaseModel
{
    public function __construct()
    {
        parent::__construct();
    }

    private function getMasterTable($master)
    {
        $table = '';
        switch ($master) {
            case 'menu':
                $table = $this->tables['admin_menu_master'];
                break;
            case 'user':
                $table = $this->tables['admin_user_master'];
                break;
            case 'template':
                $table = $this->tables['admin_template'];
                break;
            case 'template_assign':
                $table = $this->tables['admin_template_assign'];
                break;
            case 'settings':
                $table = $this->tables['admin_settings'];
                break;
            case 'plan':
                $table = $this->tables['admin_plan_master'];
                break;
            case 'client':
                $table = $this->tables['admin_client_master'];
                break;
            case 'plan_log':
                $table = $this->tables['admin_client_plan_log'];
                break;
            case 'payment_log':
                $table = $this->tables['admin_client_payment_log'];
                break;
            case 'notification':
                $table = $this->tables['admin_email_sms_logs'];
                break;
            case 'client-menus':
                $table = $this->tables['client_menu_master'];
                break;
            case 'country':
                $table = $this->tables['admin_country_master'];
                break;
            case 'state':
                $table = $this->tables['admin_state_master'];
                break;
            case 'client_users_master': $table = $this->tables['client_users_master'];break;
            case 'courier-master':
                $table = $this->tables['admin_courier_api_master'];
                break;
            case 'payment-gateway':
                $table = $this->tables['admin_payment_gateway_master'];
                break;
            case 'api-provider':
                $table = $this->tables['admin_lead_source_api_provider'];
                break;
            case 'whatsapp-provider':
                $table = $this->tables['whatsapp_solution_providers'];
                break;
            default:
                break;
        }
        return $table;
    }

    public function getUpdateCondition($master, $data)
    {
        try {
            $cond = [];
            switch ($master) {
                case 'menu':
                case 'client-menus':
                    if (!empty($data['menu_id'])) $cond = ["menu_id" => $data['menu_id']];
                    break;
                case 'country':
                    if (!empty($data['country_id'])) $cond = ["country_id" => $data['country_id']];
                    break;
                case 'state':
                    if (!empty($data['state_id'])) $cond = ["state_id" => $data['state_id']];
                    break;
                case 'user':
                case 'template':
                case 'settings':
                case 'plan':
                case 'client':
                case 'plan_log':
                case 'payment_log':
                case 'courier-master':
                case 'payment-gateway':
                case 'api-provider':
                case 'whatsapp-provider':                    
                    if (!empty($data['id'])) $cond = ["id" => $data['id']];
                    break;
                default:
                    break;
            }
            if (empty($cond)) throw new \Exception("Update condition not found for master $master");
            return ["status" => true, "data" => $cond];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getDeleteCondition($master, $data)
    {
        try {
            $cond = [];
            switch ($master) {
                case 'menu':
                case 'client-menus':
                    if (!empty($data['menu_id'])) $cond = ["menu_id" => $data['menu_id']];
                    break;
                case 'country':
                    if (!empty($data['country_id'])) $cond = ["country_id" => $data['country_id']];
                    break;
                case 'state':
                    if (!empty($data['state_id'])) $cond = ["state_id" => $data['state_id']];
                    break;
                case 'user':
                case 'template':
                case 'settings':
                case 'plan':
                case 'client':
                case 'plan_log':
                case 'payment_log':
                case 'courier-master':
                case 'payment-gateway':
                case 'api-provider':
                case 'whatsapp-provider':
                    if (!empty($data['id'])) $cond = ["id" => $data['id']];
                    break;
                default:
                    break;
            }
            if (empty($cond)) throw new \Exception("Delete condition not found for master $master");
            return ["status" => true, "data" => $cond];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function checkDuplicateData($master, $data)
    {
        try {
            $cond = "";
            $duplicate_for = '';
            switch ($master) {
                case 'menu':
                case 'client-menus':
                    $duplicate_for = 'Menu Name';
                    $cond .= " menu_name = '" . $data['menu_name'] . "'";
                    if (!empty($data['menu_id'])) $cond .= " AND menu_id != " . $data['menu_id'];
                    break;
                case 'country':
                    if (!empty($data['country_name'])) {
                        $duplicate_for = 'Country Name';
                        $cond .= "country_name='" . $data['country_name'] . "'";
                        if (!empty($data['country_id'])) $cond .= " AND country_id != " . $data['country_id'];
                    } else if (!empty($data['country_code'])) {
                        $duplicate_for = 'Country Code';
                        $cond .= "country_code='" . $data['country_code'] . "'";
                        if (!empty($data['country_id'])) $cond .= " AND country_id != " . $data['country_id'];
                    }
                    break;
                case 'state':
                    $duplicate_for = 'State Name';
                    if (!empty($data['country_id']) && !empty($data['state_name'])) {
                        $cond .= " (country_id=" . $data['country_id'] . " AND state_name = '" . $data['state_name'] . "')";
                        if (!empty($data['state_id']))  $cond .= " AND state_id != " . $data['state_id'];
                    }
                    break;
                case 'user':
                    $duplicate_for = 'Email ID';
                    $cond .= "email_id='" . $data['email_id'] . "'";
                    if (!empty($data['id']))  $cond .= " AND id != " . $data['id'];
                    break;
                case 'template':
                    $duplicate_for = 'Template Name';
                    $cond .= "template_name='" . $data['template_name'] . "'";
                    if (!empty($data['id']))  $cond .= " AND id != " . $data['id'];
                    break;
                case 'plan':
                    $duplicate_for = 'Plan Name';
                    $cond .= "name='" . $data['name'] . "'";
                    if (!empty($data['id']))  $cond .= " AND id != " . $data['id'];
                    break;
                case 'client':
                    if (!empty($data['phone_code']) && !empty($data['phone_no']) && !empty($data['email_id'])) {
                        $duplicate_for = 'Phone No. OR Email ID';
                        $cond .= "(CONCAT(phone_code,phone_no) = '" . $data['phone_code'] . $data['phone_no'] . "' OR email_id='" . $data['email_id'] . "')";
                    } else if (!empty($data['phone_code']) && !empty($data['phone_no'])) {
                        $duplicate_for = 'Phone No.';
                        $cond .= "CONCAT(phone_code,phone_no) = '" . $data['phone_code'] . $data['phone_no'] . "'";
                    } else if (!empty($data['email_id'])) {
                        $duplicate_for = 'Email ID';
                        $cond .= "email_id='" . $data['email_id'] . "'";
                    } else if (!empty($data['phone_no'])) {
                        $duplicate_for = 'Phone No.';
                        $cond .= "phone_no='" . $data['phone_no'] . "'";
                    }
                    if (!empty($data['id']))  $cond .= " AND id != " . $data['id'];
                    break;
                case 'client_users_master':
                    if (!empty($data['phone_no'])) {
                        $duplicate_for = 'Phone No.';
                        $cond .= "user_phone='" . $data['phone_no'] . "'";
                    } else if (!empty($data['email_id'])) {
                        $duplicate_for = 'Email ID';
                        $cond .= "user_email='" . $data['email_id'] . "'";
                    }
                    break;
                default:
                    break;
            }

            if (!empty($cond)) {
                $table = $this->getMasterTable($master);
                if (empty($table)) {
                    throw new \Exception("Invalid master '$master'. Unable to check duplicate records");
                }
                $dbrs = $this->getFromMaster($table, $cond, []);
                if (empty($dbrs['status'])) {
                    throw new \Exception($dbrs['error']);
                }
                if (!empty($dbrs['data'])) {
                    return ["status" => true, "exist" => true, "error" => "Similar record already exists for $duplicate_for"];
                }
            }
            return ["status" => true, "exist" => false];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => "Error occured while checking duplicate record. " . $e->getMessage()];
        }
    }

    public function getMenuMaster($search, $page_no, $page_limit, $sort_by = "menu_name", $sort_type = "ASC")
    {
        try {
            $where = $this->whereString($search, array('*' => 't1.'), array('menu_name' => 'LIKE', 'menu_url' => 'LIKE'), array());
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            }
            return $this->fetchPaginatedData("SELECT t1.*, t1.menu_id AS id, t4.menu_name as menuParent, IF(t1.status=1, 'Active', 'Inactive') AS status_title,
            (CASE t1.status WHEN 0 THEN 'alert-danger' WHEN 1 THEN '' END) AS status_alert_class,
            IF(t1.cr_date IS NOT NULL, DATE_FORMAT(t1.cr_date, '%d-%m-%Y %H:%i:%s'), '') AS created_date,
            IF(t1.md_date IS NOT NULL, DATE_FORMAT(t1.md_date, '%d-%m-%Y %H:%i:%s'), '') AS modified_date FROM admin_menu_master t1 LEFT JOIN admin_menu_master t4 ON(t4.menu_id=t1.menu_parent) WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getClientMenuMaster($search, $page_no, $page_limit, $sort_by = "menu_name", $sort_type = "ASC")
    {
        try {
            $where = $this->whereString($search, array('*' => 't1.'), array('menu_name' => 'LIKE', 'menu_url' => 'LIKE'), array());
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            }
            return $this->fetchPaginatedData("SELECT t1.*, t1.menu_id AS id, t4.menu_name as menuParent, IF(t1.status=1, 'Active', 'Inactive') AS status_title,
            (CASE t1.status WHEN 0 THEN 'alert-danger' WHEN 1 THEN '' END) AS status_alert_class,
            IF(t1.created_at IS NOT NULL, DATE_FORMAT(t1.created_at, '%d-%m-%Y %H:%i:%s'), '') AS created_date,
            IF(t1.updated_at IS NOT NULL, DATE_FORMAT(t1.updated_at, '%d-%m-%Y %H:%i:%s'), '') AS modified_date FROM client_menu_master t1 LEFT JOIN client_menu_master t4 ON(t4.menu_id=t1.menu_parent) WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }
    public function getClientParentMenuList()
    {
        try {
            return $this->fetchAllData("SELECT * FROM " . $this->tables['client_menu_master'] . " WHERE status=1 AND menu_parent=0 ORDER BY menu_priority, menu_id DESC");
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getCountryMaster($search, $page_no, $page_limit, $sort_by = "country_name", $sort_type = "ASC")
    {
        try {
            $where = $this->whereString($search, array('*' => 't1.'), array('country_name' => 'LIKE'), array());
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            } else if (!empty($sort_by)) {
                $sort_str = " ORDER BY $sort_by";
            }
            return $this->fetchPaginatedData("SELECT t1.*, IF(t1.status=1, 'Active', 'Inactive') AS status_title, (CASE t1.status WHEN 0 THEN 'alert-danger' WHEN 1 THEN '' END) AS status_alert_class, IF(t1.cr_date IS NOT NULL, DATE_FORMAT(t1.cr_date, '%d-%m-%Y %H:%i:%s'), '') AS created_date, IF(t1.md_date IS NOT NULL, DATE_FORMAT(t1.md_date, '%d-%m-%Y %H:%i:%s'), '') AS modified_date FROM " . $this->tables['admin_country_master'] . " t1 WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getStateMaster($search, $page_no, $page_limit, $sort_by = "state_name", $sort_type = "ASC")
    {
        try {
            $where = $this->whereString($search, array('*' => 't1.'), array('state_name' => 'LIKE'), array());
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            } else if (!empty($sort_by)) {
                $sort_str = " ORDER BY $sort_by";
            }
            return $this->fetchPaginatedData("SELECT t1.*, t2.country_name, IF(t1.is_union_territory=1, 'Yes', 'No') AS union_territory, IF(t1.status=1, 'Active', 'Inactive') AS status_title, (CASE t1.status WHEN 0 THEN 'alert-danger' WHEN 1 THEN '' END) AS status_alert_class, IF(t1.cr_date IS NOT NULL, DATE_FORMAT(t1.cr_date, '%d-%m-%Y %H:%i:%s'), '') AS created_date, IF(t1.md_date IS NOT NULL, DATE_FORMAT(t1.md_date, '%d-%m-%Y %H:%i:%s'), '') AS modified_date FROM " . $this->tables['admin_state_master'] . " t1 LEFT JOIN " . $this->tables['admin_country_master'] . " t2 ON(t2.country_id=t1.country_id) WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }
    //  SHWETA
    public function getWhatsAppProviderMaster($search, $page_no, $page_limit, $sort_by = "title", $sort_type = "ASC")
    {
        try {
            $where = $this->whereString($search, array('*' => 't1.'), array('title' => 'LIKE'), array());
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            }
            return $this->fetchPaginatedData("SELECT t1.*,IF(t1.status=1, 'Active', 'Inactive') AS status_title, (CASE t1.status WHEN 0 THEN 'alert-danger' WHEN 1 THEN '' END) AS status_alert_class, IF(t1.cr_date IS NOT NULL, DATE_FORMAT(t1.cr_date, '%d-%m-%Y %H:%i:%s'), '') AS created_date, IF(t1.md_date IS NOT NULL, DATE_FORMAT(t1.md_date, '%d-%m-%Y %H:%i:%s'), '') AS modified_date FROM " . $this->tables['whatsapp_solution_providers'] . " t1 WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getCourierMaster($search, $page_no, $page_limit, $sort_by = "courier_name", $sort_type = "ASC")
    {
        try {
            $where = $this->whereString($search, array('*' => 't1.'), array('courier_name' => 'LIKE'), array());
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            }
            return $this->fetchPaginatedData("SELECT t1.*,IF(t1.status=1, 'Active', 'Inactive') AS status_title, (CASE t1.status WHEN 0 THEN 'alert-danger' WHEN 1 THEN '' END) AS status_alert_class, IF(t1.cr_date IS NOT NULL, DATE_FORMAT(t1.cr_date, '%d-%m-%Y %H:%i:%s'), '') AS created_date, IF(t1.md_date IS NOT NULL, DATE_FORMAT(t1.md_date, '%d-%m-%Y %H:%i:%s'), '') AS modified_date FROM " . $this->tables['admin_courier_api_master'] . " t1 WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getPaymentGatewayMaster($search, $page_no, $page_limit, $sort_by = "name", $sort_type = "ASC")
    {
        try {
            $where = $this->whereString($search, array('*' => 't1.'), array('name' => 'LIKE'), array());
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            } else if (!empty($sort_by)) {
                $sort_str = " ORDER BY $sort_by";
            }
            return $this->fetchPaginatedData("SELECT t1.*,IF(t1.status=1, 'Active', 'Inactive') AS status_title, (CASE t1.status WHEN 0 THEN 'alert-danger' WHEN 1 THEN '' END) AS status_alert_class, IF(t1.cr_date IS NOT NULL, DATE_FORMAT(t1.cr_date, '%d-%m-%Y %H:%i:%s'), '') AS created_date, IF(t1.md_date IS NOT NULL, DATE_FORMAT(t1.md_date, '%d-%m-%Y %H:%i:%s'), '') AS modified_date FROM " . $this->tables['admin_payment_gateway_master'] . " t1 WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getApiProviderMaster($search, $page_no, $page_limit, $sort_by = "name", $sort_type = "ASC")
    {
        try {
            $where = $this->whereString($search, array('*' => 't1.'), array('name' => 'LIKE'), array());
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            }
            return $this->fetchPaginatedData("SELECT t1.*,IF(t1.status=1, 'Active', 'Inactive') AS status_title, (CASE t1.status WHEN 0 THEN 'alert-danger' WHEN 1 THEN '' END) AS status_alert_class, IF(t1.cr_date IS NOT NULL, DATE_FORMAT(t1.cr_date, '%d-%m-%Y %H:%i:%s'), '') AS created_date, IF(t1.md_date IS NOT NULL, DATE_FORMAT(t1.md_date, '%d-%m-%Y %H:%i:%s'), '') AS modified_date FROM " . $this->tables['admin_lead_source_api_provider'] . " t1 WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getPlanMaster($search, $page_no, $page_limit, $sort_by = "name", $sort_type = "ASC")
    {
        try {
            $where = $this->whereString($search, array('*' => 't1.'), array('name' => 'LIKE'), array());
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            }
            return $this->fetchPaginatedData("SELECT t1.name, t1.id, t1.price, t1.add_on_price, CONCAT(t1.validity, ' ',t1.validity_for) validity, t1.user_count, IF(t1.is_renewable=1, 'Yes', 'No') AS is_renewable, IF(t1.is_trial=1, 'Yes', 'No') AS is_trial, IF(t1.status=1, 'Active', 'Inactive') AS status, (CASE t1.status WHEN 0 THEN 'alert-danger' WHEN 1 THEN '' END) AS status_alert_class, IF(t1.cr_date IS NOT NULL, DATE_FORMAT(t1.cr_date, '%d-%m-%Y %H:%i:%s'), '') AS created_date, IF(t1.md_date IS NOT NULL, DATE_FORMAT(t1.md_date, '%d-%m-%Y %H:%i:%s'), '') AS modified_date FROM " . $this->tables['admin_plan_master'] . " t1 WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getNotificationLogList($search, $page_no, $page_limit, $sort_by = "name", $sort_type = "ASC")
    {
        try {
            if (isset($search['sent_date'])) {
                $sent_date = $search['sent_date'];
                unset($search['sent_date']);
                if (!empty($sent_date)) {
                    $search['start_date'] = date('Y-m-d', strtotime($sent_date[0]));
                    $search['end_date'] = date('Y-m-d', strtotime($sent_date[1]));
                }
            }
            $where = $this->whereString($search, array('*' => 't1.'), array('start_date' => 'DGTE', 'end_date' => 'DLTE'), array('start_date' => 'cr_date', 'end_date' => 'cr_date'));
            $sort_str = "";
            if (!empty($sort_by) && !empty($sort_type)) {
                $sort_str = " ORDER BY $sort_by $sort_type";
            }
            return $this->fetchPaginatedData("SELECT t1.id, t1.type, t1.ref_name, IF(t1.type='Email', email_to, msg_to) AS recipient, t1.email_subject, t1.body, t1.response, IFNULL(DATE_FORMAT(t1.sent_at, '%d-%m-%Y %H:%i:%s'), '') AS sent_date, (CASE sent_status WHEN 0 THEN 'Pending' WHEN 1 THEN 'Success' WHEN 2 THEN 'Failed' ELSE 'Pending' END) AS status  FROM " . $this->tables['admin_email_sms_logs'] . " t1 WHERE $where $sort_str", $page_no, $page_limit);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getMasterData($table, $where, $params = [])
    {
        try {
            return $this->fetchSingleData("SELECT * FROM $table WHERE $where", $params);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getFromMaster($table, $where, $params = [])
    {
        try {
            return $this->fetchAllData("SELECT * FROM $table WHERE $where LIMIT 1 ", $params);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getAppSettings()
    {
        try {
            return $this->fetchSingleData("SELECT * FROM " . $this->tables['admin_settings'] . " ORDER BY id LIMIT 1");
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getPlanList()
    {
        try {
            return $this->fetchAllData("SELECT t1.*, CONCAT(t1.name, '(', CONCAT(t1.validity, ' ', t1.validity_for), ', INR: ', IFNULL(t1.price, 0) , ')') as display_name FROM " . $this->tables['admin_plan_master'] . " t1 ORDER BY display_order, display_name, price");
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getCountryList()
    {
        try {
            return $this->fetchAllData("SELECT t1.*, CONCAT(t1.country_name, ' (', t1.phone_code , ')') as display_name FROM " . $this->tables['admin_country_master'] . " t1 WHERE status=1 ORDER BY display_order, display_name");
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getStateList($country_id)
    {
        try {
            return $this->fetchAllData("SELECT t1.* FROM " . $this->tables['admin_state_master'] . " t1 WHERE country_id=" . $country_id . " AND status=1 ORDER BY display_order, state_name ");
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    private function prepareMasterData($master, $data)
    {
        switch ($master) {
            case 'user':
                if (!empty($data['password'])) {
                    $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
                }
                $data['status'] = empty($data['status']) ? 0 : 1;
                break;
            case 'template':
                $data['status'] = empty($data['status']) ? 0 : 1;
                break;
            case 'country':
                $data['status'] = empty($data['status']) ? 0 : 1;
                break;
            case 'state':
                $data['status'] = empty($data['status']) ? 0 : 1;
                $data['is_union_territory'] = empty($data['is_union_territory']) ? 0 : 1;
                break;
            case 'menu':
                $data['status'] = empty($data['status']) ? 0 : 1;
                break;
            case 'client-menus':
                $data['status'] = empty($data['status']) ? 0 : 1;
                break;
            case 'settings':
                $data['smtp_enable_ssl'] = empty($data['smtp_enable_ssl']) ? 0 : 1;
                $data['smtp_verify_ssl'] = empty($data['smtp_verify_ssl']) ? 0 : 1;
                break;
            case 'plan':
                $data['is_renewable'] = empty($data['is_renewable']) ? 0 : 1;
                $data['is_trial'] = empty($data['is_trial']) ? 0 : 1;
                $data['status'] = empty($data['status']) ? 0 : 1;
                $data['display_order'] = !empty($data['display_order']) ? $data['display_order'] : NULL;
                break;
            case 'notification':
                unset($data['template_id']);
                unset($data['message_body']);
                if (!empty($data['whatsapp'])) {
                    $data['type'] = 'WHATSAPP';
                }
                unset($data['whatsapp']);
                break;
            default:
                break;
        }
        return $data;
    }

    public function saveMasterData($master, $data)
    {
        try {
            $table = $this->getMasterTable($master);
            $data  = $this->prepareMasterData($master, $data);
            return $this->insert($table, $data);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function updateMasterData($master, $data, $cond)
    {
        try {
            $table = $this->getMasterTable($master);
            $data  = $this->prepareMasterData($master, $data);
            return $this->update($table, $data, $cond, []);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function deleteMasterData($master, $condtion)
    {
        try {
            $table = $this->getMasterTable($master);
            return $this->delete($table, $condtion, []);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    private function getMenuInputRules($input)
    {
        return [
            'menu_name' => array("rules" => 'required|max_length[100]', 'label' => "Menu name"),
            'menu_url' => array("rules" => 'required|max_length[100]', 'label' => "Menu URL"),
            'menu_priority' => array("rules" => 'required', 'label' => "Menu priority")
        ];
    }

    private function getUserInputRules($input)
    {
        $rules = [
            'name' => array("rules" => 'required|max_length[100]', 'label' => "User name"),
            'email_id' => array("rules" => 'required|email|max_length[150]', 'label' => "Email ID"),
            'manager_id' => array("rules" => 'required', 'label' => "Manager")
        ];
        if (empty($input['id']) || !empty($input['password'])) {
            $rules['password'] = array("rules" => 'required|min_length[8]|max_length[50]', 'label' => "Password");
        }
        return $rules;
    }

    private function getTemplateInputRules($input)
    {
        $rules = [
            'template_name' => array("rules" => 'required|max_length[150]', 'label' => "Template name"),
            'temp_type' => array("rules" => 'required|max_length[50]', 'label' => "Template type"),
            'template_body' => array("rules" => 'required|max_length[5000]', 'label' => "Template body")
        ];
        if (empty($input['temp_type'])) {
            if (strtoupper($input['temp_type']) == 'EMAIL') {
                $rules['subject'] = array("rules" => 'required|max_length[100]', 'label' => "Email subject");
            }
        }
        return $rules;
    }

    private function getTemplateAssignRules($input)
    {
        $rules = [
            'template_for' => array("rules" => 'required|max_length[150]', 'label' => "Template For"),
            'template_id' => array("rules" => 'required|max_length[50]', 'label' => "Template"),
        ];
        return $rules;
    }

    private function getSettingsRules($input)
    {
        $rules = [
            'smtp_email_id' => array("rules" => 'max_length[150]|email', 'label' => "SMTP Email ID"),
            'smtp_email_password' => array("rules" => 'max_length[100]', 'label' => "SMTP Password"),
            'smtp_email_server' => array("rules" => 'max_length[100]', 'label' => "SMTP Server"),
            'smtp_port' => array("rules" => 'max_length[10]', 'label' => "SMTP Port"),
            'sms_api' => array("rules" => 'max_length[500]|valid_url', 'label' => "SMS API"),
            'whatsapp_api' => array("rules" => 'max_length[500]|valid_url', 'label' => "WhatsaApp API"),
            'whatsapp_solution_provider' => array("rules" => 'max_length[100]', 'label' => "Provider"),
            'whatsapp_api_key' => array("rules" => 'max_length[250]', 'label' => "API Key/Password/Token"),
            'whatsapp_no' => array("rules" => 'max_length[10]|integer', 'label' => "WhatsApp No."),
        ];
        return $rules;
    }

    private function getPlanRules($input)
    {
        $rules = [
            'name' => array("rules" => 'required|min_length[2]|max_length[100]', 'label' => "Plan Name"),
            'price' => array("rules" => 'greater_than_equal_to[0]', 'label' => "Plan Price"),
            'add_on_price' => array("rules" => 'greater_than_equal_to[0]', 'label' => "Add-on Price"),
            'validity' => array("rules" => 'required', 'label' => "Validity"),
            'validity_for' => array("rules" => 'required', 'label' => "Validity For (Day, Month, Year)"),
            'user_count' => array("rules" => 'required|greater_than_equal_to[1]', 'label' => "License"),
            'display_order' => array("rules" => 'integer', 'label' => "Display Order")
        ];
        return $rules;
    }

    private function getClientRules($input)
    {
        $rules = [
            'name' => array("rules" => 'required|min_length[2]|max_length[200]', 'label' => "Client Name"),
            'phone_code' => array("rules" => 'required|max_length[10]', 'label' => "Country Code"),
            'phone_no' => array("rules" => 'required|max_length[20]', 'label' => "Phone No."),
            'email_id' => array("rules" => 'max_length[150]|email', 'label' => "Email Id"),
            'country_id' => array("rules" => 'required', 'label' => "Country"),
            'state_id' => array("rules" => 'required', 'label' => "State"),
            'address' => array("rules" => 'required|max_length[250]', 'label' => "Address"),
        ];
        if (empty($input['id']) || isset($input['password'])) {
            $rules['password'] = array("rules" => 'required|min_length[8]|max_length[50]', 'label' => "Password");
        }
        return $rules;
    }

    private function getCountryRules($input)
    {
        $rules = [
            'country_name' => array("rules" => 'required|min_length[2]|max_length[100]', 'label' => "Country Name"),
            'country_code' => array("rules" => 'required|max_length[3]', 'label' => "Code"),
            'phone_code' => array("rules" => 'required|max_length[20]', 'label' => "Phone Code"),
            'flag' => array("rules" => 'max_length[150]', 'label' => "Flag Code"),
            'display_order' => array("rules" => 'integer', 'label' => "Display Order"),
        ];
        return $rules;
    }

    private function getStateRules($input)
    {
        $rules = [
            'state_name' => array("rules" => 'required|min_length[2]|max_length[200]', 'label' => "State Name"),
            'country_id' => array("rules" => 'required|integer', 'label' => "Country"),
            'state_code' => array("rules" => 'max_length[10]', 'label' => "State Code"),
            'display_order' => array("rules" => 'integer', 'label' => "Display Order"),
        ];
        return $rules;
    }

    private function getCourierRules($input)
    {
        $rules = [
            'courier_api' => array("rules" => 'required|min_length[2]|max_length[200]', 'label' => "courier API"),
            'courier_name' => array("rules" => 'required|min_length[2]|max_length[200]', 'label' => "courier name")
        ];
        return $rules;
    }

    private function getPaymentGatewayRules($input)
    {
        $rules = [
            'api' => array("rules" => 'required|min_length[2]|max_length[200]', 'label' => "API"),
            'name' => array("rules" => 'required|min_length[2]|max_length[200]', 'label' => "Name")
        ];
        return $rules;
    }

    public function getRules($master, $input)
    {
        try {
            $rules = [];
            switch ($master) {
                case 'menu':
                case 'client-menus':
                    $rules = $this->getMenuInputRules($input);
                    break;
                case 'user':
                    $rules = $this->getUserInputRules($input);
                    break;
                case 'template':
                    $rules = $this->getTemplateInputRules($input);
                    break;
                case 'template_assign':
                    $rules = $this->getTemplateAssignRules($input);
                    break;
                case 'settings':
                    $rules = $this->getSettingsRules($input);
                    break;
                case 'settings':
                    $rules = $this->getSettingsRules($input);
                    break;
                case 'plan':
                    $rules = $this->getPlanRules($input);
                    break;
                case 'client':
                    $rules = $this->getClientRules($input);
                    break;
                case 'country':
                    $rules = $this->getCountryRules($input);
                    break;
                case 'state':
                    $rules = $this->getStateRules($input);
                    break;
                case 'courier-master':
                    $rules = $this->getCourierRules($input);
                    break;
                case 'payment-gateway':
                    $rules = $this->getPaymentGatewayRules($input);
                    break;
                default:
                    break;
            }
            return ["status" => true, "rules" => $rules];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }
}
