<?php

namespace App\Model;

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

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

    public function getAdminUser($where)
    {
        try {
            return $this->fetchSingleData("SELECT * FROM acc_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 getClientUser($comp_id, String $where, Bool $single)
    {
        try {
            $sql = "CALL " . $this->procedures['GetUserDetail'] . "(:comp_id, :searchstr, :single)";
            $params = [':comp_id'=>$comp_id, ':searchstr'=>$where, ':single'=>$single ? 1 : 0];
            $countrs = $this->fetchMultiSetData($sql, $params);
            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];
            }
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function getUser(String $where, Bool $single)
    {
        try {
            $sql = "CALL " . $this->procedures['GetClientUserDetail'] . "(:searchstr, :single)";
            $params = [':searchstr'=>$where, ':single'=>$single ? 1 : 0];
            $countrs = $this->fetchMultiSetData($sql, $params);
            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];
            }
        } 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->fetchSingleData("SELECT * FROM client_user_login_log WHERE user_id = $where");
        } 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("client_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("client_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 * FROM acc_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 * FROM acc_menu_master WHERE menu_id in (SELECT MM.menu_parent FROM acc_menu_master MM JOIN acc_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 status='1' UNION (SELECT MM.* FROM acc_menu_master MM JOIN acc_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 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 getAdminChildMenuList($is_master, $user_id, $menu_id)
    {
        try {
            if (!empty($is_master)) {
                return $this->fetchAllData("SELECT * FROM acc_menu_master WHERE status=1 AND menu_parent=$menu_id ORDER BY menu_priority, menu_id DESC");
            } else {
                return $this->fetchAllData("SELECT MM.* FROM acc_menu_master MM INNER JOIN acc_users_rights CUR ON (CUR.page_id = MM.menu_id) WHERE MM.status=1 AND MM.menu_parent=$menu_id AND CUR.user_id = $user_id AND CUR.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()];
        }
    }


    public function getClientMenuList($is_master, $user_id, $profile_id = 0)
    {
        try {
            $sql = "CALL " . $this->procedures['GetClientMenus'] . "(:is_master, :user_id, :profile_id)";
            $params = [
                ':is_master' => $is_master,
                ':user_id' => $user_id,
                ':profile_id' => $profile_id
            ];
            $result = $this->fetchMultiSetData($sql, $params);
            if ($result['status']) {
                // Extract parent and child menus
                $parentMenus =  $result['data'][0] ?: [];
                $childMenus = $result['data'][1] ?: [];
                // Create a map of child menus by menu_parent
                $childMenusMap = [];
                foreach ($childMenus as $child) {
                    $childMenusMap[$child['menu_parent']][] = $child;
                }
                // Group parent menus with their respective child menus
                foreach ($parentMenus as &$parent) {
                    // Assign child_menus directly to parent
                    $parent['child_menus'] = $childMenusMap[$parent['menu_id']] ?? [];
                }
                // Return grouped data with no additional 'has_child_menus' key
                return $parentMenus;
            }
            return $result;
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    public function insertLog(array $log,$comp_id)
    {
        try {
            $db = $this->client_db_prefix.$comp_id;
            return $this->insert("`$db`.`api_user_logs`", $log);
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }
}
