package com.sundot.airport.web.controller.score;

import com.sundot.airport.common.core.controller.BaseController;
import com.sundot.airport.common.core.domain.AjaxResult;
import com.sundot.airport.ledger.dto.DeptMemberDistributionDTO;
import com.sundot.airport.ledger.dto.DeptMemberDTO;
import com.sundot.airport.ledger.dto.DeptPortraitQueryDTO;
import com.sundot.airport.ledger.dto.GroupPortraitDTO;
import com.sundot.airport.ledger.dto.StationTeamStatsDTO;
import com.sundot.airport.ledger.service.IDeptPortraitService;
import com.sundot.airport.ledger.service.IGroupPortraitService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <b>功能名：</b>DeptPortraitController<br>
 * <b>说明：</b> 部门画像Controller（团队成员展示）<br>
 * <b>著作权：</b> Copyright (C) 2025 SUNDOT CORPORATION<br>
 *
 * @author Claude
 */
@Api(tags = "部门画像-团队成员")
@RestController
@RequestMapping("/score/dept-portrait")
public class DeptPortraitController extends BaseController {

    @Autowired
    private IDeptPortraitService deptPortraitService;

    @Autowired
    private IGroupPortraitService groupPortraitService;

    /**
     * 获取部门内所有成员列表（部门画像-团队成员展示）
     * <p>
     * 查询指定部门及其所有下级部门的成员信息，包括：
     * 姓名、年龄、工龄、性别、民族、政治面貌、职务、职业资格等级、开机年限、综合得分
     * </p>
     *
     * @param query 查询参数对象
     * @return 部门成员列表
     */
    @ApiOperation("获取部门内所有成员列表")
    @PostMapping("/members")
    public AjaxResult getDeptMembers(@RequestBody DeptPortraitQueryDTO query) {
        try {
            // 参数校验
            if (query == null || query.getDeptId() == null) {
                return error("部门ID不能为空");
            }

            // 如果没有传日期范围,则默认为91天
            if (query.getStartDate() == null || query.getEndDate() == null) {
                java.time.LocalDate today = java.time.LocalDate.now();
                query.setEndDate(today.toString());
                query.setStartDate(today.minusDays(91).toString());
            }

            List<DeptMemberDTO> members = deptPortraitService.getDeptMembers(query);

            return success(members);
        } catch (Exception e) {
            logger.error("获取部门成员列表失败", e);
            return error("获取部门成员列表失败：" + e.getMessage());
        }
    }

    /**
     * 获取部门成员基本情况分布（用于饼图展示）
     * <p>
     * 统计指定部门及其下级部门成员的：
     * 1. 性别分布
     * 2. 民族分布
     * 3. 政治面貌分布
     * </p>
     *
     * @param query 查询参数对象
     * @return 成员基本情况分布数据
     */
    @ApiOperation("获取部门成员基本情况分布")
    @PostMapping("/distribution")
    public AjaxResult getMemberDistribution(@RequestBody DeptPortraitQueryDTO query) {
        try {
            // 参数校验
            if (query == null || query.getDeptId() == null) {
                return error("部门ID不能为空");
            }

            // 如果没有传日期范围,则默认为91天
            if (query.getStartDate() == null || query.getEndDate() == null) {
                java.time.LocalDate today = java.time.LocalDate.now();
                query.setEndDate(today.toString());
                query.setStartDate(today.minusDays(91).toString());
            }

            DeptMemberDistributionDTO distribution = deptPortraitService.getMemberDistribution(query);

            return success(distribution);
        } catch (Exception e) {
            logger.error("获取部门成员分布失败", e);
            return error("获取部门成员分布失败：" + e.getMessage());
        }
    }

    /**
     * 获取部门成员职位情况分布（用于柱状图展示）
     * <p>
     * 统计指定部门及其下级部门成员的：
     * 1. 职业资格等级分布（等级1-等级5）
     * 2. 开机年限分布（0-3年、4-7年、8-11年、12-15年、15-18年）
     * 3. 岗位资质分布（前传、操机、人身、验证、开箱包、开机）
     * </p>
     *
     * @param query 查询参数对象
     * @return 成员职位情况分布数据
     */
    @ApiOperation("获取部门成员职位情况分布")
    @PostMapping("/position-distribution")
    public AjaxResult getPositionDistribution(@RequestBody DeptPortraitQueryDTO query) {
        try {
            // 参数校验
            if (query == null || query.getDeptId() == null) {
                return error("部门ID不能为空");
            }

            // 如果没有传日期范围,则默认为91天
            if (query.getStartDate() == null || query.getEndDate() == null) {
                java.time.LocalDate today = java.time.LocalDate.now();
                query.setEndDate(today.toString());
                query.setStartDate(today.minusDays(91).toString());
            }

            DeptMemberDistributionDTO distribution = deptPortraitService.getPositionDistribution(query);

            return success(distribution);
        } catch (Exception e) {
            logger.error("获取部门成员职位分布失败", e);
            return error("获取部门成员职位分布失败：" + e.getMessage());
        }
    }

    /**
     * 维度得分一览
     * 计算规则：
     * 1. 根据员工配分表，计算小组六维度均值
     * 2. 小组各维度最终分值 = 基础分 + 员工维度均值 + 小组特有合计分值
     * 3. 综合评分 = Σ(各维度最终分值 × 权重 / 100)
     * </p>
     *
     * @param query 查询参数对象
     * @return 组织画像数据
     */
    @ApiOperation("维度得分一览")
    @PostMapping("/group-portrait")
    public AjaxResult getGroupPortrait(@RequestBody DeptPortraitQueryDTO query) {
        try {
            // 参数校验
            if (query == null || query.getDeptId() == null) {
                return error("部门ID不能为空");
            }

            // 如果没有传日期范围,则默认为91天
            if (query.getStartDate() == null || query.getEndDate() == null) {
                java.time.LocalDate today = java.time.LocalDate.now();
                query.setEndDate(today.toString());
                query.setStartDate(today.minusDays(91).toString());
            }

            GroupPortraitDTO portrait = groupPortraitService.getGroupPortrait(query);

            return success(portrait);
        } catch (Exception e) {
            logger.error("获取组织画像失败", e);
            return error("获取组织画像失败：" + e.getMessage());
        }
    }

    /**
     * 获取站级别下所有部门的团队画像统计
     * <p>
     * 展示站下各部门的：
     * 部门名称、员工数量、党员数量、平均年龄、平均工龄、
     * 职业资格证书等级、平均升级年龄、综合得分
     * </p>
     *
     * @param query 查询参数对象
     * @return 站下各部门的团队画像统计列表
     */
    @ApiOperation("获取站级别下所有部门的团队画像统计")
    @PostMapping("/station-team-stats")
    public AjaxResult getStationTeamStats(@RequestBody DeptPortraitQueryDTO query) {
        try {
            // 参数校验
            if (query == null || query.getDeptId() == null) {
                return error("部门ID不能为空");
            }

            // 如果没有传日期范围,则默认为91天
            if (query.getStartDate() == null || query.getEndDate() == null) {
                java.time.LocalDate today = java.time.LocalDate.now();
                query.setEndDate(today.toString());
                query.setStartDate(today.minusDays(91).toString());
            }

            List<StationTeamStatsDTO> stats = deptPortraitService.getStationTeamStats(query);

            return success(stats);
        } catch (Exception e) {
            logger.error("获取站团队画像统计失败", e);
            return error("获取站团队画像统计失败：" + e.getMessage());
        }
    }


    @ApiOperation("获取部门的团队画像统计")
    @PostMapping("/team-stats")
    public AjaxResult getTeamStats(@RequestBody DeptPortraitQueryDTO query) {
        try {
            // 参数校验
            if (query == null || query.getDeptId() == null) {
                return error("部门ID不能为空");
            }

            // 如果没有传日期范围,则默认为91天
            if (query.getStartDate() == null || query.getEndDate() == null) {
                java.time.LocalDate today = java.time.LocalDate.now();
                query.setEndDate(today.toString());
                query.setStartDate(today.minusDays(91).toString());
            }

            StationTeamStatsDTO stats = deptPortraitService.getTeamStats(query);

            return success(stats);
        } catch (Exception e) {
            logger.error("获取团队画像统计失败", e);
            return error("获取团队画像统计失败：" + e.getMessage());
        }
    }
}
