package com.ruoyi.oa.domain.dto;

import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.oa.domain.OaProjectScheduleStep;
import com.ruoyi.oa.domain.SysOaProject;
import com.ruoyi.oa.domain.SysOaTask;
import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 个人报表顶层返回结果类
 */
@Data
public class PersonalReportDTO {
    /** 用户基本信息 */
    private SysUser userInfo;

    /** 用户负责的项目列表 */
    private List<SysOaProject> responsibleProjects;

    /** 进度统计信息 */
    private ProgressStats progressStats;
    /** 用户负责的进度步骤列表 */
    private List<OaProjectScheduleStep> userSteps;

    //nickname和projectId关联的任务
    private List<SysOaTask> tasks;

    /** 活跃天数 */
    private Integer activeDays;

    /** 报工统计 */
    private PersonalReportDTO.WorkReportStats workReportStats;

    /** 出差统计 */
    private PersonalReportDTO.BusinessTripStats businessTripStats;

    /** 项目统计 */
    private PersonalReportDTO.ProjectStats projectStats;

//    /** 进度统计 */
//    private PersonalReportDTO.ProgressStats progressStats;

    /** 任务统计 */
    private PersonalReportDTO.TaskStats taskStats;

    /** 工程异常统计 */
    private PersonalReportDTO.EngineeringExceptionStats exceptionStats;

    /** 关键采购任务统计 */
    private PersonalReportDTO.ProcurementTaskStats procurementStats;
    /**
     * 进度统计内部类（封装total、completed等字段）
     */
    @Data
    public static class ProgressStats {
        /** 总进度数 */
        private Long total;
        /** 已完成进度数 */
        private Long completed;
        /** 待验收进度数 */
        private Long pendingAcceptance;
        /** 延期进度数 */
        private Long delayed;
    }



    /**
     * 报工统计
     */
    @Data
    public static class WorkReportStats {
        /** 总报工天数 */
        private BigDecimal totalWorkDays;
        /** 有效报工天数 */
        private BigDecimal validWorkDays;
        /** 报工项目数量 */
        private Integer reportProjectCount;
    }

    /**
     * 出差统计
     */
    @Data
    public static class BusinessTripStats {
        /** 总出差天数 */
        private BigDecimal totalTripDays;
        /** 国内出差天数 */
        private BigDecimal domesticTripDays;
        /** 国外出差天数 */
        private BigDecimal foreignTripDays;
        /** 出差项目数量 */
        private Integer tripProjectCount;
    }

    /**
     * 项目统计
     */
    @Data
    public static class ProjectStats {
        /** 涉及项目总数 */
        private Integer totalProjects;
        /** 负责项目数量 */
        private Integer responsibleProjects;
        /** 参与项目数量 */
        private Integer participatedProjects;
        /** 项目清单 */
        private List<PersonalReportDTO.ProjectSummary> projectList;
    }

    /**
     * 项目摘要
     */
    @Data
    public static class ProjectSummary {
        private Long projectId;
        /** 项目状态 */
        private String status;
        /** 项目名称 */
        private String projectName;
        /** 项目编号 */
        private String projectNum;
        //类型
        private String type;
        //优先级
        private String priority;
        // 设置项目时间信息
        private Date beginTime;
        private Date finishTime;
        // 设置项目负责人
        private String functionary;
        // 设置项目总款
        private BigDecimal funds;
        /** 参与角色 */
        private String role;
        /** 参与天数 */
        private BigDecimal participationDays;
    }

//    /**
//     * 进度统计
//     */
//    @Data
//    public static class ProgressStats {
//        /** 涉及进度总数 */
//        private Integer totalProgress;
//        /** 已完成进度数 */
//        private Integer completedProgress;
//        /** 进行中进度数 */
//        private Integer inProgressCount;
//        /** 延期进度数 */
//        private Integer delayedProgress;
//        /** 进度清单 */
//        private List<PersonalReportDTO.ProgressSummary> progressList;
//    }

    /**
     * 进度摘要
     */
    @Data
    public static class ProgressSummary {
        /** 进度ID */
        private Long trackId;
        /** 步骤名称 */
        private String stepName;
        /** 项目名称 */
        private String projectName;
        /** 进度状态 */
        private Long status;
        /** 是否延期 */
        private Boolean isDelayed;
    }

    /**
     * 任务统计
     */
    @Data
    public static class TaskStats {
        /** 发放任务数量 */
        private Integer assignedTasks;
        /** 承担任务数量 */
        private Integer undertakenTasks;
        /** 已完成任务数量 */
        private Integer completedTasks;
        /** 设置进行中任务数量 */
        private Integer underwayTasks;
        /** 待完成任务数量 */
        private Integer unfinishedTasks;
        /** 延期任务数量 */
        private Integer delayedTasks;
        /** 发放任务清单 */
        private List<PersonalReportDTO.TaskSummary> assignedTaskList;
        /** 承担任务清单 */
        private List<PersonalReportDTO.TaskSummary> undertakenTaskList;
    }

    /**
     * 任务摘要
     */
    @Data
    public static class TaskSummary {
        /** 任务ID */
        private Long taskId;
        /** 任务主题 */
        private String taskTitle;
        /** 项目名称 */
        private String projectName;
        /** 任务状态 */
        private Long state;
        /** 是否延期 */
        private Boolean isDelayed;
        /** 延期次数 */
        private Long postponements;
    }

    /**
     * 工程异常统计
     */
    @Data
    public static class EngineeringExceptionStats {
        /** 承担异常数量 */
        private Integer totalExceptions;
        /** 延期异常数量 */
        private Integer delayedExceptions;
        /** 已解决异常数量 */
        private Integer resolvedExceptions;
        /** 异常清单 */
        private List<PersonalReportDTO.ExceptionSummary> exceptionList;
    }

    /**
     * 异常摘要
     */
    @Data
    public static class ExceptionSummary {
        /** 异常ID */
        private Long exceptionId;
        /** 异常描述 */
        private String description;
        /** 项目名称 */
        private String projectName;
        /** 异常状态 */
        private String status;
        /** 是否延期 */
        private Boolean isDelayed;
    }

    /**
     * 关键采购任务统计
     */
    @Data
    public static class ProcurementTaskStats {
        /** 关键采购任务总数 */
        private Integer totalProcurementTasks;
        /** 已完成采购任务数 */
        private Integer completedProcurementTasks;
        /** 延期采购任务数 */
        private Integer delayedProcurementTasks;
        /** 采购任务清单 */
        private List<PersonalReportDTO.ProcurementTaskSummary> procurementTaskList;
    }

    /**
     * 采购任务摘要
     */
    @Data
    public static class ProcurementTaskSummary {
        /** 采购任务ID */
        private Long procurementId;
        /** 采购内容 */
        private String procurementContent;
        /** 项目名称 */
        private String projectName;
        /** 采购状态 */
        private String status;
        /** 是否延期 */
        private Boolean isDelayed;
    }
}