package com.tourism.webadmin.back.dto;

import com.tourism.common.core.validator.UpdateGroup;
import com.tourism.common.core.validator.ConstDictRef;
import com.tourism.webadmin.app.wechat.dto.PageInfo;
import com.tourism.webadmin.back.model.constant.IsSaleByLandlord;
import com.tourism.webadmin.back.model.constant.IsOnSale;
import com.tourism.webadmin.back.model.constant.IsSoleDwelling;

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

import jakarta.validation.constraints.*;

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

/**
 * 买卖房屋信息管理Dto对象。
 *
 * @author 吃饭睡觉
 * @date 2024-09-06
 */
@Schema(description = "买卖房屋信息管理Dto对象")
@Data
public class TourHouseSaleInfoDto extends PageInfo {


    private Long sort;

    /**
     * 主键。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "主键。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，主键不能为空！", groups = {UpdateGroup.class})
    private Long id;

    /**
     * 所属地区类型。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "所属地区类型。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，所属地区类型不能为空！")
    private Long areaId;

    /**
     * 是否房东自售 0不是 1是。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "是否房东自售 0不是 1是。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，是否房东自售 0不是 1是不能为空！")
    @ConstDictRef(constDictClass = IsSaleByLandlord.class, message = "数据验证失败，是否房东自售 0不是 1是为无效值！")
    private Integer isSaleByLandlord;

    /**
     * 房源类型 0新房 1二手房。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "房源类型 0新房 1二手房。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，房源类型 0新房 1二手房不能为空！")
    private Integer houseSourceType;

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

    /**
     * 厅室类型。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "厅室类型。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，厅室类型不能为空！")
    private Integer officeType;

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

    /**
     * 房屋类型 别墅、公寓...。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "房屋类型 别墅、公寓...。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，房屋类型 别墅、公寓...不能为空！")
    private Integer houseType;

    /**
     * 朝向类型。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "朝向类型。可支持等于操作符的列表数据过滤。")
    private Integer orientation;

    /**
     * 所在楼层。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "所在楼层。可支持等于操作符的列表数据过滤。")
    private Integer currentFloor;

    /**
     * 装修类型。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "装修类型。可支持等于操作符的列表数据过滤。")
    private Integer decoration;

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

    /**
     * 楼盘名称/所属小区。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "楼盘名称/所属小区。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，楼盘名称/所属小区不能为空！")
    private String communityName;

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

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

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

    /**
     * 所属区域。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "所属区域。可支持等于操作符的列表数据过滤。")
    private String region;

    /**
     * 首页封面图。
     */
    @Schema(description = "首页封面图。")
    private String coverUrl;

    /**
     * 是否在售 0待售 1在售。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "是否在售 0待售 1在售。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，是否在售 0待售 1在售不能为空！")
    @ConstDictRef(constDictClass = IsOnSale.class, message = "数据验证失败，是否在售 0待售 1在售为无效值！")
    private Integer isOnSale;

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

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

    /**
     * 建造年份。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "建造年份。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，建造年份不能为空！")
    private Date yearOfBuild;

    /**
     * 房屋标签。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "房屋标签。可支持等于操作符的列表数据过滤。")
    private String tag;

    /**
     * 竣工年份。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "竣工年份。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，竣工年份不能为空！")
    private Date yearOfFinish;

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

    /**
     * 二维码。
     */
    @Schema(description = "二维码。")
    private String code;

    /**
     * 联系电话。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "联系电话。可支持等于操作符的列表数据过滤。")
    private String mobile;

    /**
     * 产权性质。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "产权性质。可支持等于操作符的列表数据过滤。")
    private String propertyRightNature;

    /**
     * 产权年限。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "产权年限。可支持等于操作符的列表数据过滤。")
    private String termOfOwnership;

    /**
     * 物业类型。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "物业类型。可支持等于操作符的列表数据过滤。")
    private String propertyType;

    /**
     * 房本年限。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "房本年限。可支持等于操作符的列表数据过滤。")
    private String housePrincipalLife;

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

    /**
     * 发布公司。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "发布公司。可支持等于操作符的列表数据过滤。")
    private String publishingCompany;

    /**
     * 营业执照。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "营业执照。可支持等于操作符的列表数据过滤。")
    private String businessLicense;

    /**
     * 发布日期。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "发布日期。可支持等于操作符的列表数据过滤。")
    private Date releaseDate;

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

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

    /**
     * 周边配套描述。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "周边配套描述。可支持等于操作符的列表数据过滤。")
    private String surroundingSupport;

    /**
     * 小区介绍。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "小区介绍。可支持等于操作符的列表数据过滤。")
    private String plotIntroduction;

    /**
     * 房屋图集。
     */
    @Schema(description = "房屋图集。")
    private String houseUrl;

    /**
     * 周边配套图集。
     */
    @Schema(description = "周边配套图集。")
    private String surroundingsUrl;

    /**
     * 小区介绍图集。
     */
    @Schema(description = "小区介绍图集。")
    private String introductionUrl;

    /**
     * 热度值。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "热度值。可支持等于操作符的列表数据过滤。")
    private Integer hotValue;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    private String areaIds;

}
