package com.pusong.business.domain.bo;

import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pusong.business.domain.PsCompanyInfo;
import com.pusong.common.core.validate.QueryGroup;
import com.pusong.common.mybatis.core.domain.BaseEntity;
import com.pusong.common.core.validate.AddGroup;
import com.pusong.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 公司信息业务对象 ps_company_info
 *
 * @author wls
 * @date 2024-07-29
 */
@Data
@EqualsAndHashCode
@AutoMapper(target = PsCompanyInfo.class)
public class PsCompanyInfoBo {

    /**
     * 公司ID
     */
    @NotNull(message = "公司ID不能为空",groups = {EditGroup.class})
    private Long id;
    /**
     * 客户id
     */
    @NotNull(message = "客户id不能为空",groups = {EditGroup.class, AddGroup.class, QueryGroup.class})
    private Long customId;

    /**
     * 公司名称
     */
    @NotBlank(message = "公司名称不能为空",groups = {EditGroup.class, AddGroup.class})
    private String companyName;

    /**
     * 公司地址
     */
    private String companyAdress;

    /**
     * 公司开户行
     */
    private String companyAccountBank;
    /**
     * 公司开户行地址
     */
    private String companyAccountBankAdress;

    /**
     * 法人姓名
     */
    private String legalPersonName;

    /**
     * 法人证件号
     */
    private String legalPersonIdcard;

    /**
     * 法人电话号
     */
    private String legalPersonPhone;

    /**
     * 纳税人识别号
     */
    private String customerNum;
    /**
     * 纳税人资格
     */
    private String customerCert;
    /**
     * 个税密码
     */
    private String companyPersonPassword;
    /**
     * 税务密码
     */
    private String companyTaxPassword;
    /**
     * 开户行客户经理电话
     */
    private String companyBankManagerPhone;
    /**
     * 刻章公司名称
     */
    private String madeSignCompanyName;
    /**
     * 公司地址详情
     */
    private String companyAdressDetail;
    /**
     * 账套号
     */
    private String financeAccountNo;
    /**
     * 社保开户时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date socialStartDate;
    /**
     * 公积金开户时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date providentStartDate;
    /**
     * 营业执照开始时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date licenseStartDate;
    /**
     * 营业执照结束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date licenseEndDate;
    /**
     * 经营范围
     */
    private String companyScope;
    /**
     * 注册资金
     */
    private BigDecimal registerAmount;

    /**
     * 发票类型
     */
    private String billType;
    /**
     * 公司类型1签约公司 2服务公司
     */
    private String companyType;

    /**
     * 合同服务类别
     */
    @NotEmpty(message = "合同服务类别不能为空")
    private List<PsContractBusinessBo> businessList;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startServiceDate;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endServiceDate;

    /**
     * 是否代账
     */
    private String isProxy;
    /**
     * 是否老账新接
     */
    private String isOld;

    /**
     * 服务总金额
     */
    BigDecimal businessAmount;


    /**
     * 注册类型
     */
    private String registerType;


    /**
     * 公司设立时间
     */
    private String establishmentTime;
    /**
     * 税务登记时间
     */
    private String taxRegTime;
    /**
     * 是否进出口 0否1是
     */
    private String inoutType;
    /**
     * 是否申请发票 0否1是
     */
    private String applyInvoice;
    /**
     * 是否关联三方 0否1是
     */
    private String tripartite;

    /**
     * 开户时间
     */
    private String accountOpeningTime;
    /**
     * 开户行经理姓名
     */
    private String bankManager;
    /**
     * 社保是否开户 0否1是
     */
    private String socialSecurity;
    /**
     * 公积金是否开户0否1是
     */
    private String accumulationFund;
    /**
     * 备注
     */
    private String remark;


    public BigDecimal getContractAmount(){
        this.businessAmount = businessList == null ? new BigDecimal(0) : businessList.stream().map(PsContractBusinessBo::getBusinessAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
        return this.businessAmount;
    }
}
