package com.agri.generator.dto;

import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.List;

/**
 * 接口配置接收模型（含参数校验）
 */
@Data
public class ApiConfigDTO {
    /**
     * 请求路径（必填，格式以/开头，仅含字母、数字、/、_）
     */
    @NotBlank(message = "请求路径不能为空")
    @Pattern(regexp = "^/[a-zA-Z0-9/_]+$", message = "请求路径格式错误，需以/开头，仅含字母、数字、/、_")
    @Length(max = 500, message = "请求路径长度不能超过500字符")
    private String requestPath;

    /**
     * 接口类型（厂家）（必填）
     */
    @NotBlank(message = "接口类型（厂家）不能为空")
    @Length(max = 100, message = "接口类型（厂家）长度不能超过100字符")
    private String apiVendor;

    /**
     * 接口说明（必填）
     */
    @NotBlank(message = "接口说明不能为空")
    @Length(max = 1000, message = "接口说明长度不能超过1000字符")
    private String apiDesc;

    /**
     * 接口备注（选填）
     */
    @Length(max = 2000, message = "接口备注长度不能超过2000字符")
    private String apiRemark;


    /**
     * 是否生成实体（选填，默认false）
     */
    @NotNull(message = "是否生成实体不能为空") // 确保传值（true/false）
    private Boolean isGenRequest = false;

    /**
     * 是否生成实体（选填，默认false）
     */
    @NotNull(message = "是否生成实体不能为空") // 确保传值（true/false）
    private Boolean isGenResponse = false;


    /**
     * 入参列表（必填，至少一个）
     */
    @NotEmpty(message = "入参列表不能为空")
    @Valid // 级联校验子对象
    private List<ApiParamDTO> requestParams;

    /**
     * 出参列表（必填，至少一个）
     */
    @NotEmpty(message = "出参列表不能为空")
    @Valid // 级联校验子对象
    private List<ApiParamDTO> responseParams;

    /**
     * 参数子模型（含级联校验）
     */
    @Data
    public static class ApiParamDTO {
        /**
         * 参数名（必填）
         */
        @NotBlank(message = "参数名不能为空")
        @Pattern(regexp = "^[a-zA-Z0-9_]+$", message = "参数名格式错误，仅含字母、数字、_")
        @Length(max = 200, message = "参数名长度不能超过200字符")
        private String paramName;

        /**
         * 是否必选（仅入参有效，选填，默认false）
         */
        private Boolean required = false;

        /**
         * 参数类型（必填，仅支持指定类型）
         */
        @NotBlank(message = "参数类型不能为空")
        @Pattern(regexp = "^(String|Integer|Long|Boolean|Double|Date)$",
                message = "参数类型仅支持：String、Integer、Long、Boolean、Double、Date")
        private String paramType;

        /**
         * 参数说明/注释（必填）
         */
        @NotBlank(message = "参数说明/注释不能为空")
        @Length(max = 500, message = "参数说明/注释长度不能超过500字符")
        private String paramDesc;

    }
}