package com.tourism.webadmin.app.website.dto;

import com.tourism.common.core.validator.ConstDictRef;
import com.tourism.common.core.validator.UpdateGroup;
import com.tourism.webadmin.back.dto.TourismTravelNotesContentWriteDto;
import com.tourism.webadmin.back.model.constant.*;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.util.Date;
import java.util.List;

/**
 * 发布游记Dto对象。
 *
 * @author 吃饭睡觉
 * @date 2024-09-06
 */
@Schema(description = "发布游记Dto对象")
@Data
public class TourismProjectTravelNotesWriteToWebDto {

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

    /**
     * 项目标题。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "项目标题。可支持等于操作符的列表数据过滤。")
    private String projectTitle;

    /**
     * 出发时间。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "出发时间。可支持等于操作符的列表数据过滤。")
    private Date departureTime;

    /**
     * 总天数。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "总天数。可支持等于操作符的列表数据过滤。")
    private String countTimes;

    /**
     * 人物关系。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "人物关系。可支持等于操作符的列表数据过滤。")
    private String role;

    /**
     * 推荐指数。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "推荐指数。可支持等于操作符的列表数据过滤。")
    private Integer recommendationRate;

    /**
     * 人均费用。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "人均费用。可支持等于操作符的列表数据过滤。")
    private String averageCost;

    /**
     * 审核状态(0,未审核;1,审核通过;2、审核不通过)。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "审核状态(0,未审核;1,审核通过;2、审核不通过)。可支持等于操作符的列表数据过滤。")
    @ConstDictRef(constDictClass = AuditState.class, message = "数据验证失败，审核状态(0,未审核;1,审核通过;2、审核不通过)为无效值！")
    private Integer state;

    /**
     * 审核不通过的原因。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "审核不通过的原因。可支持等于操作符的列表数据过滤。")
    private String reason;

    /**
     * 发布游记的banner图。
     */
    @Schema(description = "发布游记的banner图。")
    private String travelNotesBanner;

    /**
     * 游记内容中的图片。
     */
    @Schema(description = "游记内容中的图片。")
    private String tourismTavelNotesUrl;

    /**
     * 上下架状态(0,下架;1,上架)。
     */
    @Schema(description = "上下架状态(0,下架;1,上架)。")
    @ConstDictRef(constDictClass = UnmountState.class, message = "数据验证失败，上下架状态(0,下架;1,上架)为无效值！")
    private Integer unmountState;

    /**
     * 项目展示图片。
     */
    @Schema(description = "项目展示图片。")
    private String tourismUrl;

    /**
     * 项目简述。
     */
    @Schema(description = "项目简述。")
    private String remarks;

    /**
     * 是否热点，0非热点，1热点。
     */
    @Schema(description = "是否热点，0非热点，1热点。")
    @ConstDictRef(constDictClass = Hotspot.class, message = "数据验证失败，是否热点，0非热点，1热点为无效值！")
    private Integer isHotspot;

    /**
     * 标签。
     */
    @Schema(description = "标签。")
    private String noteLabel;

    /**
     * 点赞数。
     */
    @Schema(description = "点赞数。")
    private Integer likeCount;

    /**
     * 浏览量。
     */
    @Schema(description = "浏览量。")
    private Integer pageViewCount;

    /**
     * 热度值。
     */
    @Schema(description = "热度值。")
    private Integer hotValue;

    /**
     * 是否原创(0:非原创;1:原创)。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "是否原创(0:非原创;1:原创)。可支持等于操作符的列表数据过滤。")
    @ConstDictRef(constDictClass = IsOriginal.class, message = "数据验证失败，是否原创(0:非原创;1:原创)为无效值！")
    private Integer isOriginal;

    /**
     * 目的地。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "目的地。可支持等于操作符的列表数据过滤。")
    @NotNull(message = "目的地为必填项，请选择目的地！", groups = {UpdateGroup.class})
    private Long endPlace;

    /**
     * 自动审核结果1：通过，2未通过。
     */
    @Schema(description = "自动审核结果1：通过，2未通过。")
    @ConstDictRef(constDictClass = AudioState.class, message = "数据验证失败，自动审核结果1：通过，2未通过为无效值！")
    private Integer autoAuditStatus;

    /**
     * 自动审核未通过原因。
     */
    @Schema(description = "自动审核未通过原因。")
    private String autoRejectReason;

    /**
     * departureTime 范围过滤起始值(>=)。
     * NOTE: 可支持范围操作符的列表数据过滤。
     */
    @Schema(description = "departureTime 范围过滤起始值(>=)。可支持范围操作符的列表数据过滤。")
    private String departureTimeStart;

    /**
     * departureTime 范围过滤结束值(<=)。
     * NOTE: 可支持范围操作符的列表数据过滤。
     */
    @Schema(description = "departureTime 范围过滤结束值(<=)。可支持范围操作符的列表数据过滤。")
    private String departureTimeEnd;

    /**
     * createTime 范围过滤起始值(>=)。
     * NOTE: 可支持范围操作符的列表数据过滤。
     */
    @Schema(description = "createTime 范围过滤起始值(>=)。可支持范围操作符的列表数据过滤。")
    private String createTimeStart;

    /**
     * createTime 范围过滤结束值(<=)。
     * NOTE: 可支持范围操作符的列表数据过滤。
     */
    @Schema(description = "createTime 范围过滤结束值(<=)。可支持范围操作符的列表数据过滤。")
    private String createTimeEnd;

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

    /**
     * 游记内容。
     */
    @Schema(description = "游记内容。")
//    @NotNull(message = "游记内容不能为空！", groups = {UpdateGroup.class})
    private List<TourismTravelNotesContentWriteDto> travelNotesContent;

    /**
     * 出行方式。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "出行方式。可支持等于操作符的列表数据过滤。")
    private Integer travelMode;

    /**
     * 游玩人数。
     */
    @Schema(description = "游玩人数。")
    private String travelNumber;
}
