package com.tourism.webadmin.back.dto;

import com.tourism.common.core.validator.UpdateGroup;
import com.tourism.common.core.validator.ConstDictRef;
import com.tourism.webadmin.back.model.constant.VisaOrderState;
import com.tourism.webadmin.back.model.constant.VisaPayState;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import jakarta.validation.constraints.*;

/**
 * 签证订单类型信息Dto对象。
 *
 * @author 吃饭睡觉
 * @date 2024-09-06
 */
@Schema(description = "签证订单类型信息Dto对象")
@Data
public class TourVisaOrderDto {

    /**
     * 签证类型id。
     */
    @Schema(description = "签证类型id。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，签证类型id不能为空！", groups = {UpdateGroup.class})
    private Long id;

    /**
     * 文件列表json。
     */
    @Schema(description = "文件列表json。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，文件列表json不能为空！")
    private String file;

    /**
     * 下单人姓名。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "下单人姓名。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，下单人姓名不能为空！")
    private String orderName;

    /**
     * 下单人电话。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "下单人电话。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，下单人电话不能为空！")
    private String orderPhone;

    /**
     * 下单身份证。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "下单身份证。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，下单身份证不能为空！")
    private String orderIdCard;

    /**
     * 签证商品id。
     */
    @Schema(description = "签证商品id。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，签证商品id不能为空！")
    private Long visaId;

    /**
     * 订单状态 0待审核。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "订单状态 0待审核。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，订单状态 0待审核不能为空！", groups = {UpdateGroup.class})
    @ConstDictRef(constDictClass = VisaOrderState.class, message = "数据验证失败，订单状态 0待审核为无效值！")
    private Integer state;

    /**
     * 支付状态 0未支付 1已支付。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "支付状态 0未支付 1已支付。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，支付状态 0未支付 1已支付不能为空！", groups = {UpdateGroup.class})
    @ConstDictRef(constDictClass = VisaPayState.class, message = "数据验证失败，支付状态 0未支付 1已支付为无效值！")
    private Integer payState;

    /**
     * 订单价格。
     */
    @Schema(description = "订单价格。")
    private String orderPrice;

    /**
     * 负责顾问。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "负责顾问。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，负责顾问不能为空！")
    private Long counselorId;

    /**
     * 订单地址。
     */
    @Schema(description = "订单地址。")
    private String orderAddress;

    /**
     * 服务费。
     */
    @Schema(description = "服务费。")
    private String servicePrice;

    /**
     * 税费。
     */
    @Schema(description = "税费。")
    private String price;

    /**
     * order_name / order_phone / order_id_card LIKE搜索字符串。
     * NOTE: 可支持LIKE操作符的列表数据过滤。
     */
    @Schema(description = "LIKE模糊搜索字符串")
    private String searchString;
}
