package com.yuchen.saas.park.api.dto.property;

import com.thinkunion.park.service.common.utils.AmtUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;

@Data
@ApiModel(value = "收费标准",description = "")
public class PropertyFeeStandardSaveDto {
    public interface Cycle {}

    public interface Meter {}

    public interface Quantity {}
    public interface Fixed {}

    @ApiModelProperty(value = "id",notes = "")
    private Long id;
    /** 园区id */
    @NotNull(message = "园区不能为空")
    @ApiModelProperty(value = "园区id",notes = "")
    private Long parkId ;
    /** 收费项目id */
    @NotNull(message = "收费项目不能为空")
    @ApiModelProperty(value = "收费项目id",notes = "")
    private Long feeItemId ;
    /** 收费标准名称 */
    @NotNull(message = "收费标准名称不能为空")
    @ApiModelProperty(value = "收费标准名称",notes = "")
    private String feeName ;
    /** 费用标识;费用标识：1-周期性收费，2-用量收费，3-数量收费，4-固定金额收费，5-指定金额收费 */
    @NotNull(message = "费用标识不能为空")
    @ApiModelProperty(value = "费用标识",notes = "费用标识：1-周期性收费，2-用量收费，3-数量收费，4-固定金额收费，5-指定金额收费")
    private Integer feeMark ;

    /** 周期性收费-计费周期：1-按月，2-按天 */
    @NotNull(message = "计费周期不能为空",groups = Cycle.class)
    @ApiModelProperty(value = "周期性收费-计费周期：1-按月，2-按天",notes = "")
    private Integer cycleType ;
    /** 周期性收费-按月情况，不整月时：1-按天，2-按月 */
    @NotNull(message = "不整月时参数不能为空",groups = Cycle.class)
    @ApiModelProperty(value = "周期性收费-按月情况，不整月时：1-按月，2-按天",notes = "")
    private Integer cycleMonthType ;
    /** 计算规则（针对费用标识为1，2，3情况）：1-按单价（默认，目前只有该场景），2-自定义 */
    @ApiModelProperty(value = "计算规则（针对费用标识为1，2，3情况）：1-按单价（默认，目前只有该场景），2-自定义",notes = "")
    private Integer calcRule ;
    /** CalcTypeEnum 计量方式：1-建筑面积，2-使用面积，3-定额计算，4-电表，5-水表，6-气表*/
    @NotNull(message = "计量方式不能为空",groups = {Cycle.class})
    @ApiModelProperty(value = "计量方式：1-建筑面积，2-使用面积，3-定额计算，4-电表，5-水表，6-气表",notes = "")
    private Integer calcType ;
    /**仪表id*/
    @NotNull(message = "计量方式不能为空",groups = {Meter.class})
    private Long meterId;
    /** 价格;单位分（指定金额收费情况不会有这个价格） */
    @NotNull(message = "价格不能为空",groups = {Cycle.class, Meter.class, Quantity.class, Fixed.class})
    @ApiModelProperty(value = "价格",notes = "单位分（指定金额收费情况不会有这个价格）")
    private BigDecimal price ;
    private Long priceFen ;
    public Long getPriceFen() {
        return AmtUtil.yuanToFenObj(price);
    }
    /** 周期性收费-按月情况：折合天单价 */
    @NotNull(message = "折合天单价不能为空",groups = {Cycle.class})
    @ApiModelProperty(value = "周期性收费-按月情况：折合天单价",notes = "")
    private BigDecimal priceDay ;
    private Long priceDayFen ;
    public Long getPriceDayFen() {
        return AmtUtil.yuanToFenObj(priceDay);
    }
    /** PriceUnitTypeEnum 计算单位：1-m2/月，2-月，3-m2/天，4-天，5-度，6-m3，7-m2，8-个，9-时  */
    @NotNull(message = "价格不能为空",groups = {Cycle.class, Quantity.class})
    @ApiModelProperty(value = "计算单位：1-m2/月，2-月，3-m2/天，4-天，5-度，6-m3，7-m2，8-个，9-时",notes = "")
    private Integer priceUnitType ;

    /** 账单周期 */
    @NotNull(message = "账单周期不能为空",groups = {Cycle.class})
    @ApiModelProperty(value = "账单周期",notes = "")
    private Integer billCycle ;
    /** 账单周期单位：1-月，2-天 */
    @NotNull(message = "账单周期单位不能为空",groups = {Cycle.class})
    @ApiModelProperty(value = "账单周期单位：1-月，2-天",notes = "")
    private Integer billUnit ;
    /** 账单划分 */
    @NotNull(message = "账单划分不能为空",groups = {Cycle.class})
    @ApiModelProperty(value = "账单划分",notes = "")
    private Integer billStage ;
    /** 提前X日生成账单 */
    @NotNull(message = "起始日提前参数不能为空",groups = {Cycle.class})
    @ApiModelProperty(value = "提前X日生成账单",notes = "")
    private Integer billGenerateVal ;
    /** 提前X日生成账单-单位：1-月，2-天 */
    @NotNull(message = "起始日提前单位不能为空",groups = {Cycle.class})
    @ApiModelProperty(value = "提前X日生成账单-单位：1-月，2-天",notes = "")
    private Integer billGenerateUnit ;

    /** 应收月份：1-账单起始日当月，2-账单截止日当月 */
    @ApiModelProperty(value = "应收月份：1-账单起始日当月，2-账单截止日当月",notes = "")
    private Integer receivableMonth ;
    /** 应收月份之后第X月 */
    @ApiModelProperty(value = "应收月份之后第X月",notes = "")
    private Integer receivableMonthAfter ;
    /** 应收日期：1-应收月份当前的月末，2-应收月份当前的第X天，3-月份为应收月份，日期为X日同日之后的第X天 */
    @ApiModelProperty(value = "应收日期：1-应收月份当前的月末，2-应收月份当前的第X天，3-月份为应收月份，日期为X日同日之后的第X天",notes = "")
    private Integer receivableType ;
    /** 应收月份当前的第X天 */
    @ApiModelProperty(value = "应收月份当前的第X天",notes = "")
    private Integer receivableArg1 ;
    /** 应收日期类型：1-账单开始日，2-账单截止日 */
    @ApiModelProperty(value = "应收日期类型：1-账单开始日，2-账单截止日",notes = "")
    private Integer receivableArg2 ;
    /** 账单日期之后第X天 */
    @ApiModelProperty(value = "账单日期之后第X天",notes = "")
    private Integer receivableArg3 ;

    /** 违约金开启状态：1-开，0-关 */
    @ApiModelProperty(value = "违约金开启状态：1-开，0-关",notes = "")
    private Integer breachStatue ;
    /** 违约金起算日期类型：1-应收日期，2-账单开始日期，3-账单截止日期 */
    @ApiModelProperty(value = "违约金起算日期类型：1-应收日期，2-账单开始日期，3-账单截止日期",notes = "")
    private Integer breachDateType ;
    /** 违约金第X日之后算起 */
    @ApiModelProperty(value = "违约金第X日之后算起",notes = "")
    private Integer breachDateVal ;
    /** 违约金每天收取比例 */
    @ApiModelProperty(value = "违约金每天收取比例",notes = "")
    private BigDecimal breachRate ;
    /** 违约金计算方式：1-计算方式，2-利滚利 */
    @ApiModelProperty(value = "违约金计算方式：1-计算方式，2-利滚利",notes = "")
    private Integer breachCalcType ;

    /** 备注 */
    @ApiModelProperty(value = "备注",notes = "")
    private String remark;
}
