<?php
namespace App\Model;
use App\Model\BaseModel;
use App\Core\Service\Logger;

class AdminUserModel extends BaseModel
{
    public function __construct() {
        parent::__construct();
    }
    
    public function getUserMaster($search, $page_no, $page_limit, $sort_by="name", $sort_type="ASC", $self_user_id=0) {
        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";
            }
            $subqry  = "WITH RECURSIVE UserHierarchy AS (SELECT id FROM admin_user_master WHERE manager_id = $self_user_id UNION ALL SELECT  u.id FROM admin_user_master u INNER JOIN UserHierarchy uh ON u.manager_id = uh.id)
				SELECT id FROM UserHierarchy";
            if(!empty($where)) {
                $where .= " AND (t1.id IN($subqry) OR t1.id = $self_user_id)";
            } else {
                $where = "(t1.id IN($subqry) OR t1.id = $self_user_id)";
            }
            return $this->fetchPaginatedData("SELECT t1.id, t1.name, t1.email_id, t2.name as manager_name, IF(t1.is_master=1, 'Yes', 'No') AS ismaster, 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.id=$self_user_id, 1, 0) AS not_editable , IF(t1.id=$self_user_id, 1, 0) AS not_deletable,
            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_user_master t1 LEFT JOIN admin_user_master t2 ON(t2.id=t1.manager_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()];
        }
    }
    
    public function getManagerList($self_user_id) {
        try {
            $subqry  = "WITH RECURSIVE UserHierarchy AS (SELECT id FROM admin_user_master WHERE manager_id = $self_user_id UNION ALL SELECT  u.id FROM admin_user_master u INNER JOIN UserHierarchy uh ON u.manager_id = uh.id)
				SELECT id FROM UserHierarchy";
            $where = "(t1.id IN($subqry) OR t1.id = $self_user_id)";
            
            return $this->fetchAllData("SELECT t1.id, t1.name, IF(t1.id=$self_user_id, 1, 0) AS not_editable FROM admin_user_master t1 WHERE $where ORDER BY not_editable DESC, t1.name");
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getPermissions($user_id, $is_master) {
        try {
            if($is_master) {
                $sql = "SELECT FLOOR(RAND() * 1000) AS random_no, menu_id, menu_name, menu_priority, menu_url, menu_parent, '1' view_right, '1' add_right, '1' edit_right, '1' delete_right, '1' export_right ";
                $sql .= " FROM ".$this->tables['admin_menu_master'];
            } else {
                $sub_sql = "SELECT page_id AS menu_id FROM ".$this->tables['admin_users_rights']." WHERE user_id = '$user_id'";
                $sql = " SELECT FLOOR(RAND() * 1000) AS random_no, menu_id, menu_name, menu_priority, menu_url, menu_parent, '0' view_right, '0' add_right, '0' edit_right, '0' delete_right, '0' export_right ";
                $sql .= " FROM ".$this->tables['admin_menu_master'];
                $sql .= " WHERE menu_id NOT IN($sub_sql) ";
                $sql .= " UNION "; 
                $sql .= " SELECT FLOOR(RAND() * 1000) AS random_no, T2.menu_id, T2.menu_name, T2.menu_priority, T2.menu_url, T2.menu_parent, T1.view_right, T1.add_right, T1.edit_right, T1.delete_right, T1.export_right ";
                $sql .= " FROM ".$this->tables['admin_users_rights']." T1 "; 
                $sql .= " JOIN ".$this->tables['admin_menu_master']." T2 ON (T1.page_id = T2.menu_id) "; 
                $sql .= " WHERE T1.user_id = '$user_id'";
                $sql .= " ORDER BY menu_priority ";
            }
            return $this->fetchAllData($sql);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function addUserRights($data) {
        try {
            return $this->batchInsert($this->tables['admin_users_rights'], $data);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function deleteUserRights($user_id) {
        try {
            return $this->delete($this->tables['admin_users_rights'], ["user_id"=>$user_id]);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

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

    public function updateAdminUser(Array $data, string|array $where) {
        try {
            return $this->update($this->tables['admin_user_master'], $data, $where);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getLoginLogs(String $where)
    {
        try {
            return $this->fetchAllData("SELECT * FROM ".$this->tables['admin_user_login_log']." WHERE $where ORDER BY cr_date LIMIT 1");
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function deleteLoginLogs(array $where)
    {
        try {
            return $this->delete($this->tables['admin_user_login_log'], $where);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }
    
    public function addLoginLogs(array $log)
    {
        try {
            return $this->insert($this->tables['admin_user_login_log'], $log);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getAdminParentMenuList($is_master, $user_id)
    {
        try {
            if (!empty($is_master)) {
                return $this->fetchAllData("SELECT *, '1' view_right, '1' add_right, '1' edit_right, '1' delete_right, '1' export_right FROM ".$this->tables['admin_menu_master']." WHERE status=1 AND menu_parent=0 AND menu_type=0 ORDER BY menu_priority, menu_id DESC");
            } else {
                return $this->fetchAllData("SELECT MM.*, UR.view_right, UR.add_right, UR.edit_right, UR.delete_right, UR.export_right FROM ".$this->tables['admin_menu_master']." MM INNER JOIN admin_users_rights UR ON UR.page_id=MM.menu_id WHERE MM.status = '1' AND UR.user_id=" . $user_id . " AND view_right=1 AND MM.menu_parent=0 AND MM.menu_type=0 ORDER BY MM.menu_priority, MM.menu_id DESC");
            }
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getAdminChildMenuList($is_master, $user_id, $menu_id)
    {
        try {
            if (!empty($is_master)) {
                return $this->fetchAllData("SELECT *, '1' view_right, '1' add_right, '1' edit_right, '1' delete_right, '1' export_right FROM ".$this->tables['admin_menu_master']." WHERE status=1 AND menu_parent=$menu_id ORDER BY menu_priority, menu_id DESC");
            } else {
                return $this->fetchAllData("SELECT MM.*, UR.view_right, UR.add_right, UR.edit_right, UR.delete_right, UR.export_right FROM ".$this->tables['admin_menu_master']." MM INNER JOIN admin_users_rights UR ON (UR.page_id = MM.menu_id) WHERE MM.status=1 AND MM.menu_parent=$menu_id AND UR.user_id = $user_id AND UR.view_right=1 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()];
        }
    }
}