using Microsoft.AspNetCore.Http;
using OpenAuth.App.Request;

namespace OpenAuth.WebApi.Controllers.ServerController;

#region 一、接口入参DTO（所有请求参数，对应Controller接收的参数）

/// <summary>
/// 发起流程请求参数
/// </summary>
public class InitiateFlowRequestDto
{
    /// <summary>
    /// 流程编码（唯一标识流程模板，如：IllegalConstructionFlow_2026）
    /// </summary>
    public string FlowCode { get; set; } = string.Empty;

    /// <summary>
    /// 业务编号（唯一标识该笔业务，如：WJ20260205001、XZ20260205002）
    /// </summary>
    public string BusinessNo { get; set; } = string.Empty;

    /// <summary>
    /// 类型 耕地破坏鉴定
    /// </summary>
    public int? type { get; set; }

    /// <summary>
    /// 流程标题（用于展示，如："XX区域违法建设认定申请"）
    /// </summary>
    public string Title { get; set; } = string.Empty;

    /// <summary>
    /// 上传附件列表（业务相关证明材料、表单等）
    /// </summary>
    public List<string> Attachments { get; set; } = new();
}

/// <summary>
/// 处理工作项请求参数
/// </summary>
public class HandleWorkitemRequestDto
{
    /// <summary>
    /// 工作项ID（待处理事项的唯一标识，从待办查询接口获取）
    /// </summary>
    public long WorkitemId { get; set; }

    /// <summary>
    /// 处理备注（可选，记录处理意见、流转说明等）
    /// </summary>
    public string? Comment { get; set; }

    /// <summary>
    /// 审核结果（仅会签节点必填，可选值：Pass（通过）/Reject（驳回））
    /// </summary>
    public string? AuditResult { get; set; }
}

/// <summary>
/// 分页查询通用请求参数（所有查询接口共用）
/// </summary>
public class PageQueryRequestDto : PageReq
{
    /*/// <summary>
    /// 当前页码（默认1，从1开始计数）
    /// </summary>
    public int PageIndex { get; set; } = 1;

    /// <summary>
    /// 每页显示条数（默认10，可自定义，建议不超过50）
    /// </summary>
    public int PageSize { get; set; } = 10;*/
}

#endregion

#region 二、接口出参DTO（所有返回结果，对应Controller返回的数据）

/// <summary>
/// 流程查询单条结果返回值（所有查询接口的单条数据格式）
/// </summary>
public class FlowQuerySingleResultDto
{
    public long workitemId;

    /// <summary>
    /// 流程实例ID（唯一标识该流程实例，用于后续操作）
    /// </summary>
    public long InstanceId { get; set; }

    /// <summary>
    /// 业务编号（对应发起流程时的BusinessNo）
    /// </summary>
    public string BusinessNo { get; set; } = string.Empty;

    /// <summary>
    /// 流程标题（对应发起流程时的Title）
    /// </summary>
    public string Title { get; set; } = string.Empty;

    /// <summary>
    /// 当前节点名称（如："区县提交"、"政策法规科审核"、"汇总归档"）
    /// </summary>
    public string NodeName { get; set; } = string.Empty;

    /// <summary>
    /// 流程状态（枚举值：Draft（拟办）、Submitted（已提交）、Forwarded（已转发）、Auditing（审核中）、Summarized（已汇总）、Completed（已完成）、Rejected（已驳回））
    /// </summary>
    public string Status { get; set; } = string.Empty;

    /// <summary>
    /// 流程发起时间
    /// </summary>
    public DateTime? CreateTime { get; set; }

    /// <summary>
    /// 发起人姓名
    /// </summary>
    public string InitiatorName { get; set; } = string.Empty;

    public int? Type { get; set; }
    public string WorkStatus { get; set; }
}

/// <summary>
/// 分页查询通用返回值（所有分页查询接口共用，泛型适配不同数据列表）
/// </summary>
/// <typeparam name="T">数据列表的泛型类型（如：FlowQuerySingleResultDto）</typeparam>
public class PageQueryResultDto<T>
{
    /// <summary>
    /// 当前页码（与请求参数的PageIndex对应）
    /// </summary>
    public int Page { get; set; }

    /// <summary>
    /// 每页显示条数（与请求参数的PageSize对应）
    /// </summary>
    public int Limit { get; set; }

    /// <summary>
    /// 总记录数（符合查询条件的所有数据条数）
    /// </summary>
    public long Total { get; set; }

    /// <summary>
    /// 总页数（自动计算：TotalCount / PageSize，向上取整）
    /// </summary>
    public int TotalPages { get; set; }

    /// <summary>
    /// 当前页的数据列表
    /// </summary>
    public List<T> Items { get; set; } = new List<T>();
}

/// <summary>
/// 接口全局统一响应格式（所有接口返回结果的统一封装，提高前端对接效率）
/// </summary>
/// <typeparam name="T">响应数据的泛型类型（如：long、bool、PageQueryResultDto<FlowQuerySingleResultDto>）</typeparam>
public class ApiResponseDto<T>
{
    /// <summary>
    /// 响应状态码（200：操作成功，500：操作失败，400：参数错误/未登录，404：资源不存在）
    /// </summary>
    public int Code { get; set; } = 200;

    /// <summary>
    /// 响应消息（成功时返回"操作成功"，失败时返回具体错误信息）
    /// </summary>
    public string Message { get; set; } = "操作成功";

    /// <summary>
    /// 响应数据（成功时返回具体业务数据，失败时可返回null或附加说明数据）
    /// </summary>
    public T? Result { get; set; }

    /// <summary>
    /// 构建成功响应（静态方法，简化Controller调用）
    /// </summary>
    /// <param name="data">成功时的业务数据</param>
    /// <param name="message">自定义成功消息（可选，默认"操作成功"）</param>
    /// <returns>统一响应格式对象</returns>
    public static ApiResponseDto<T> Success(T? data = default, string message = "操作成功")
    {
        return new ApiResponseDto<T>
        {
            Code = 200,
            Message = message,
            Result = data
        };
    }

    /// <summary>
    /// 构建失败响应（静态方法，简化Controller调用）
    /// </summary>
    /// <param name="message">具体错误消息</param>
    /// <param name="data">失败时的附加数据（可选，默认null）</param>
    /// <returns>统一响应格式对象</returns>
    public static ApiResponseDto<T> Fail(string message = "操作失败", T? data = default)
    {
        return new ApiResponseDto<T>
        {
            Code = 500,
            Message = message,
            Result = data
        };
    }

    /// <summary>
    /// 构建参数错误/未登录响应（静态方法，适配400状态码场景）
    /// </summary>
    /// <param name="message">具体错误消息</param>
    /// <param name="data">附加数据（可选）</param>
    /// <returns>统一响应格式对象</returns>
    public static ApiResponseDto<T> BadRequest(string message = "参数错误或未登录", T? data = default)
    {
        return new ApiResponseDto<T>
        {
            Code = 400,
            Message = message,
            Result = data
        };
    }
}

#endregion