package org.example.Impl;

import org.example.Entity.BaseResponse.BaseResponse;
import org.example.Entity.System.SystemMenu;
import org.example.Utils.IPublicUtil;
import org.example.Utils.JSON;
import org.example.Utils.NativeExtensionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

import static org.example.Utils.NativeExtensionUtils.isNullOrEmpty;

@Service
public class SystemImpl extends OptBaseImpl {

    @Autowired
    DataImpl dataImpl;
    @Autowired
    IPublicUtil util;

    /**
     * 获取可用的系统列表
     *
     * @param id 系统ID
     * @return 包含系统列表的响应对象
     */
    public BaseResponse GetSystems(int id) {
        // 从数据实现类获取系统列表（Java中用List<Map>模拟DataTable）
        List<Map<String, Object>> systemList = dataImpl.GetSystems(id);

        // 转换为SystemMenuEntity列表（对应C#的SystemMenu）
        List<SystemMenu> systemMenuList = systemList.stream()
                .map(row -> new SystemMenu(row, getUser())) // 使用对应的构造函数
                .collect(Collectors.toList());

        // 构建并返回响应对象
        BaseResponse response = new BaseResponse();
        response.setData(systemMenuList);
        response.setSuccess(true);
        return response;
    }

    public BaseResponse GetSystemInfo() {
        BaseResponse _response = new BaseResponse();
        _response.setData(dataImpl.GetSystemInfo());
        _response.setSuccess(true);
        return _response;
    }

    /// <summary>
    /// 获取设备宝配置
    /// </summary>
    /// <returns></returns>
    public BaseResponse GetEmaUrl() {
        BaseResponse _response = new BaseResponse();
        _response.setData(dataImpl.GetEmaUrl());
        _response.setSuccess(true);
        return _response;
    }

    /**
     * 获取系统菜单
     *
     * @param parentid   系统父集ID
     * @param targetMode 目标模式（可选）
     * @return 系统菜单列表
     */
    public Object GetSysMenus(String parentid, String targetMode) {
        // 从数据实现类获取菜单数据（DataTable对应List<Map>）
        log.debug(String.valueOf("aaaaaa"+parentid+getUser().SeriesId+"_"+targetMode));
        List<Map<String, Object>> dtval = dataImpl.GetSysMenus(parentid, getUser().SeriesId, targetMode);
        List<SystemMenu> menus = new ArrayList<>();
        List<SystemMenu> retMenus = new ArrayList<>();
        // 获取菜单类型
        int menuType = GetSystemMenuType();
        // 处理父ID为空的情况
        if (parentid == null || parentid.isEmpty()) {
            // 处理parentid为空的情况
            if (menuType == 3 || menuType == 4 || menuType == 0) {
                // 复杂条件筛选：level不等于2 或 targetMode包含"4" 或 有权限
                menus = dtval.stream()
                        .filter(row -> {
                            // 转换row["level"]为字符串并判断是否不等于"2"
                            boolean levelNot2 = Objects.toString(row.get("level"), "") != "2";
                            // 判断targetMode是否包含"4"
                            boolean targetModeHas4 = targetMode.indexOf("4") > -1;
                            // 检查权限（不为空则有权限）
                            boolean hasPurview = !isNullOrEmpty(util.CheckPurview(getUser().PurviewStr, Objects.toString(row.get("MenuId"), "")));
                            return levelNot2 || targetModeHas4 || hasPurview;
                        })
                        // 符合条件的行转换为SystemMenu对象
                        .map(row -> new SystemMenu(row, getUser()))
                        .collect(Collectors.toList());
            } else {
                // 无筛选条件，所有行都转换为SystemMenu
                menus = dtval.stream()
                        .map(row -> new SystemMenu(row, getUser()))
                        .collect(Collectors.toList());
            }
        }
        for (SystemMenu menu : menus) {
            if (menu.getLevel() >= 2 ||
                    (menu.getLevel() == 1 && hasChildMenus(menus, menu))) {
                retMenus.add(menu);
            }
        }
//out.println("reMenus111 : " + retMenus);
        // 第二个循环：处理Level < 1且有符合条件的子菜单的菜单
        for (SystemMenu menu : menus) {
            if (menu.getLevel() < 1 && hasLevel1ChildMenus(retMenus, menu)) {
                retMenus.add(menu);
            }
        }
        return retMenus;
    }

    // 检查是否有子菜单（对应C#的LINQ查询）
    private boolean hasChildMenus(List<SystemMenu> menus, SystemMenu menu) {
        return menus.stream()
                .anyMatch(m -> m.getParentId().equals(menu.getMenuStruct()));
    }

    // 检查是否有Level=1的子菜单（对应C#的LINQ查询）
    private boolean hasLevel1ChildMenus(List<SystemMenu> retMenus, SystemMenu menu) {
        return retMenus.stream()
                .anyMatch(m -> m.getLevel() == 1 && m.getParentId().equals(menu.getMenuStruct()));
    }

    private int GetSystemMenuType() {
        // 从数据实现类获取系统信息（DataTable对应List<Map>）
        List<Map<String, Object>> systemInfoList = dataImpl.GetSystemInfo();
        // 如果没有数据，返回4
        if (systemInfoList == null || systemInfoList.isEmpty()) {
            return 4;
        }

        // 获取第一条数据的"mainmenutype"字段并转换为int
        Map<String, Object> firstRow = systemInfoList.get(0);
        Object mainMenuTypeObj = firstRow.get("mainmenutype");
        return NativeExtensionUtils.ToInt32(mainMenuTypeObj);
    }

    /**
     * 获取系统登录信息
     *
     * @return 包含登录相关配置的Map
     */
    public Map<String, Object> GetSystemLoginInfo() {
        // 获取系统信息并取第一条记录转换为Map
        List<Map<String, Object>> systemInfo = dataImpl.GetSystemInfo();
        Map<String, Object> sysTab = systemInfo.isEmpty() ? new HashMap<>() : systemInfo.get(0);

        Map<String, Object> retTab = new HashMap<>();

        // 转换登录弹窗标识
        retTab.put("uftype", toInt32(sysTab.get("loginpopupflag") + ""));
        // 获取系统类型
        retTab.put("systype", GetProSysType().getData());
        // 获取数据库服务器信息
        retTab.put("dbserver", dataImpl.GetDbserverInfo(getUser().UserId, getUser().UserName));
        // 获取客户端下载地址
        retTab.put("cslink", sysTab.get("downloadaddress"));

        // 版本号大于1020时添加登录配置
        if (UpdateImpl.getVersion() > 1020) {
            retTab.put("logincfg", dataImpl.GetLoginCfg());
        }

        return retTab;
    }

    /**
     * 获取系统类型信息
     *
     * @return 包含系统类型数据的响应对象
     */
    public BaseResponse GetProSysType() {
        BaseResponse resp = new BaseResponse();

        List<Map<String, Object>> typeList = dataImpl.GetProSysType();
        if (typeList == null) {
            resp.setData(false);
        } else {
            resp.setData(typeList);
        }

        resp.setSuccess(true);
        return resp;
    }

    /**
     * 获取数据库服务器信息
     *
     * @return 包含数据库服务器信息的响应对象
     */
    public BaseResponse GetDbServer() {
        BaseResponse response = new BaseResponse();
        response.setData(dataImpl.GetDbserverInfo(getUser().UserId, getUser().UserName));
        response.setSuccess(true);
        return response;
    }

    /**
     * 获取Web更新信息
     *
     * @param code   版本代码
     * @param sysRec 系统记录JSON字符串
     * @return 包含更新信息的BaseResponse
     */
    public BaseResponse GetWebUpdateInfo(int code, String sysRec) {
        BaseResponse response = new BaseResponse();
        response.setSuccess(true);

        // 查询Web更新信息
        List<Map<String, Object>> dtVal = dataImpl.GetWebUpdateInfo(code);
        if (dtVal != null && !dtVal.isEmpty()) {
            // 将第一条记录转换为Hashtable存入data
            Map<String, Object> firstRow = dtVal.get(0);
            Map<String, Object> dataMap = new HashMap<>();
            for (Map.Entry<String, Object> entry : firstRow.entrySet()) {
                dataMap.put(entry.getKey(), entry.getValue());
            }
            response.setData(dataMap);
        }

        // 处理系统记录并插入历史表
        if (sysRec != null && !sysRec.isEmpty()) {
            try {
                // 解析JSON为Hashtable
                Map<String, Object> sysRecMap = (Map<String, Object>) JSON.Decode(sysRec);
                if (sysRecMap != null) {
                    // 构建SQL（使用参数化查询防止注入）
                    String sql = "insert into dbo.P_SystemWebUpdateHisTab(version, oaurl, webver, sysinfo) " +
                            "values(?, ?, ?, ?)";

                    // 执行插入操作
                    jdbcTemplate.update(sql,
                            code,
                            sysRecMap.getOrDefault("oaurl", ""),
                            sysRecMap.getOrDefault("webversion", ""),
                            sysRec);
                }
            } catch (Exception e) {
                // 异常处理（根据实际需求调整，此处保持原逻辑不抛出）
                log.error("Exception caught", e);
            }
        }

        return response;
    }
}
