package com.sundot.airport.exam.service;

import com.sundot.airport.exam.dto.*;

import java.util.List;

/**
 * <b>功能名：</b>IDashboardService<br>
 * <b>说明：</b> 大屏统计Service <br>
 * <b>著作权：</b> Copyright (C) 2025 SUNDOT CORPORATION<br>
 * <b>修改履历：
 *
 * @author 2025-01-19
 */
public interface IDashboardService {

    /**
     * 获取大屏概览数据
     *
     * @param query 查询参数
     * @return 概览数据
     */
    DashboardOverviewDTO getOverview(DashboardQueryDTO query);

    /**
     * 获取任务趋势数据
     *
     * @param query 查询参数
     * @return 趋势数据
     */
    DashboardTrendDTO getTrend(DashboardQueryDTO query);

    /**
     * 获取部门任务完成排行
     *
     * @param query 查询参数
     * @return 部门排行列表
     */
    List<DashboardDeptRankingDTO> getDeptRanking(DashboardQueryDTO query);

    /**
     * 获取角色维度统计数据
     *
     * @param query 查询参数
     * @return 角色统计列表
     */
    List<DashboardRoleStatsDTO> getRoleStats(DashboardQueryDTO query);

    /**
     * 获取逾期任务分析数据
     *
     * @param query 查询参数
     * @return 逾期任务分析
     */
    DashboardExpiredAnalysisDTO getExpiredAnalysis(DashboardQueryDTO query);

    /**
     * 获取个人任务完成排行榜
     *
     * @param query 查询参数
     * @return 个人排行列表
     */
    List<DashboardUserRankingDTO> getUserRanking(DashboardQueryDTO query);

    /**
     * 获取当天所有用户的统计数据（支持分页）
     * 返回当天所有用户的任务统计数据，不限制数量
     *
     * @param query 查询参数
     * @return 所有用户排行列表
     */
    List<DashboardUserRankingDTO> getAllUsersRanking(DashboardQueryDTO query);

    /**
     * 获取最新完成的任务流水
     *
     * @param query 查询参数
     * @return 任务流水列表
     */
    List<DashboardRecentTaskDTO> getRecentTasks(DashboardQueryDTO query);

    /**
     * 用户模糊搜索
     *
     * @param query 查询参数 (包含keyword)
     * @return 用户列表
     */
    List<UserSearchResultDTO> searchUsers(DashboardQueryDTO query);

    /**
     * 获取筛选条件选项
     *
     * @return 筛选选项数据
     */
    FilterOptionsDTO getFilterOptions();

    /**
     * 用户搜索结果DTO
     */
    class UserSearchResultDTO {
        private Long userId;
        private String userName;
        private String userCode;
        private String deptName;
        private String roleName;

        public Long getUserId() {
            return userId;
        }

        public void setUserId(Long userId) {
            this.userId = userId;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public String getUserCode() {
            return userCode;
        }

        public void setUserCode(String userCode) {
            this.userCode = userCode;
        }

        public String getDeptName() {
            return deptName;
        }

        public void setDeptName(String deptName) {
            this.deptName = deptName;
        }

        public String getRoleName() {
            return roleName;
        }

        public void setRoleName(String roleName) {
            this.roleName = roleName;
        }
    }

    /**
     * 筛选选项DTO
     */
    class FilterOptionsDTO {
        private List<DeptOption> depts;
        private List<RoleOption> roles;

        public List<DeptOption> getDepts() {
            return depts;
        }

        public void setDepts(List<DeptOption> depts) {
            this.depts = depts;
        }

        public List<RoleOption> getRoles() {
            return roles;
        }

        public void setRoles(List<RoleOption> roles) {
            this.roles = roles;
        }

        public static class DeptOption {
            private Long deptId;
            private String deptName;

            public Long getDeptId() {
                return deptId;
            }

            public void setDeptId(Long deptId) {
                this.deptId = deptId;
            }

            public String getDeptName() {
                return deptName;
            }

            public void setDeptName(String deptName) {
                this.deptName = deptName;
            }
        }

        public static class RoleOption {
            private String roleCode;
            private String roleName;

            public String getRoleCode() {
                return roleCode;
            }

            public void setRoleCode(String roleCode) {
                this.roleCode = roleCode;
            }

            public String getRoleName() {
                return roleName;
            }

            public void setRoleName(String roleName) {
                this.roleName = roleName;
            }
        }
    }
}
