package com.gci.boot.modules.vehicles.vo;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.gci.boot.common.util.ValidatorUtil;
import lombok.Data;

import java.util.List;
import java.util.stream.Collectors;

@Data
public class UpkeepImportVO {
    // 基本信息:  车牌号	实际保养开始时间	实际保养完成时间	实际保养里程	保养内容
    // 保养信息:  维修厂	保养分类	保养内容	数量	材料单价	工时	工时单价	内容说明
    @ValidatorUtil.NotEmpty(message = "车牌号不能为空")
    @ExcelProperty({"基本信息", "车牌号"})
    private String plateNumber;
    @ValidatorUtil.NotEmpty(message = "实际保养开始时间不能为空")
    @ValidatorUtil.DateValue(format = "yyyy-MM-dd HH:mm:ss", message = "实际保养开始时间格式错误:格式为'yyyy-MM-dd HH:mm:ss'")
    @ExcelProperty({"基本信息", "实际保养开始时间"})
    private String startTime;
    @ValidatorUtil.NotEmpty(message = "实际保养完成时间不能为空")
    @ValidatorUtil.DateValue(format = "yyyy-MM-dd HH:mm:ss", message = "实际保养完成时间格式错误:格式为'yyyy-MM-dd HH:mm:ss'")
    @ExcelProperty({"基本信息", "实际保养完成时间"})
    private String endTime;
    @ValidatorUtil.NotEmpty(message = "实际保养里程不能为空")
    @ValidatorUtil.IntValue(minValue= 0, maxValue = 99999999,  message = "实际保养里程必须为数字:且范围在[0,99999999]")
    @ExcelProperty({"基本信息", "实际保养里程"})
    private String realMileage;
    @ValidatorUtil.NotEmpty(message = "保养内容不能为空")
    @ValidatorUtil.StrMaxLength(strMaxLength = 200, message = "保养内容长度不能超过200位", fieldNameCN = "保养内容")
    @ExcelProperty({"基本信息", "保养内容"})
    private String content;

    @ValidatorUtil.NotEmpty(message = "维修厂不能为空")
    @ExcelProperty({"保养信息", "维修厂"})
    private String repairShop;
    @ValidatorUtil.NotEmpty(message = "保养分类不能为空")
    @ExcelProperty({"保养信息", "保养分类"})
    private String repairClass;
    @ValidatorUtil.NotEmpty(message = "保养内容（保养明细）不能为空")
    @ValidatorUtil.StrMaxLength(strMaxLength = 100, message = "保养内容（保养明细）长度不能超过100位", fieldNameCN = "保养内容（保养明细）")
    @ExcelProperty({"保养信息", "保养内容（保养明细）"})
    private String repairContent;
    @ValidatorUtil.NotEmpty(message = "数量不能为空")
    @ValidatorUtil.IntValue(minValue= 0, maxValue = 99999999,  message = "数量必须为整数:且范围在[0,99999999]")
    @ExcelProperty({"保养信息", "数量"})
    private String quantity;
    @ValidatorUtil.NotEmpty(message = "材料单价不能为空")
    @ValidatorUtil.NumericValue(minValue= 0, maxValue = 99999999,  message = "材料单价必须为数字:且范围在[0,99999999]")
    @ExcelProperty({"保养信息", "材料单价"})
    private String unitPrice;
    @ValidatorUtil.NotEmpty(message = "工时不能为空")
    @ValidatorUtil.NumericValue(minValue= 0, maxValue = 99999999,  message = "工时必须为数字:且范围在[0,99999999]")
    @ExcelProperty({"保养信息", "工时"})
    private String workHours;
    @ValidatorUtil.NotEmpty(message = "工时单价不能为空")
    @ValidatorUtil.NumericValue(minValue= 0, maxValue = 99999999,  message = "工时单价必须为数字:且范围在[0,99999999]")
    @ExcelProperty({"保养信息", "工时单价"})
    private String workHoursCost;
    @ValidatorUtil.NotEmpty(message = "内容说明不能为空")
    @ValidatorUtil.StrMaxLength(strMaxLength = 100, message = "内容说明长度不能超过100位", fieldNameCN = "内容说明")
    @ExcelProperty({"保养信息", "内容说明"})
    private String offerContent;

    // 用于记录校验异常信息
    @ExcelIgnore
    private List<String> validationErrors;
    @ExcelProperty({"异常信息", "异常信息"})
    private String validationErrorsStr;
    // 用于记录所在行数
    @ExcelIgnore
    private Integer row;
    //字典值
    @ExcelIgnore
    private String repairClassValue;
    //维修厂信息
    @ExcelIgnore
    private String repairShopId;
    @ExcelIgnore
    private String contact;
    @ExcelIgnore
    private String contactPhone;
    //格式异常的
    @ExcelIgnore
    private String formatErrors;
    //重复的
    @ExcelIgnore
    private String repeatErrors;

    public void validate() {
        ValidatorUtil.trimStringFields(this);
        List<ValidatorUtil.ValidationError> validationErrors = ValidatorUtil.validate(this);
        if(CollectionUtil.isNotEmpty(validationErrors)){
            this.validationErrors  = validationErrors.stream().map(ValidatorUtil.ValidationError::getMessage).collect(Collectors.toList());
            this.validationErrorsStr = this.validationErrors + "";
        }
    }

    public void putErrorMsg(String msg){
        if(CollectionUtil.isNotEmpty(this.validationErrors)){
            this.validationErrors.add(msg);
        }else{
            this.validationErrors = CollectionUtil.newArrayList(msg);
        }
        this.validationErrorsStr = this.validationErrors + "";
    }
}
