package com.erp.customer.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 客户实体类
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("customers")
public class Customer {
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    /**
     * 租户ID
     */
    private Long tenantId;
    
    /**
     * 客户编码（唯一）
     */
    private String customerCode;
    
    /**
     * 客户名称
     */
    private String customerName;
    
    /**
     * 客户简称
     */
    private String shortName;
    
    /**
     * 客户等级：VIP/POTENTIAL/NORMAL
     * VIP - VIP客户
     * POTENTIAL - 潜在客户
     * NORMAL - 普通客户
     */
    private String level;
    
    /**
     * 客户类型：COMPANY/INDIVIDUAL
     * COMPANY - 企业客户
     * INDIVIDUAL - 个人客户
     */
    private String customerType;
    
    /**
     * 所属行业
     */
    private String industry;
    
    /**
     * 联系电话
     */
    private String phone;
    
    /**
     * 备用联系电话
     */
    private String backupPhone;
    
    /**
     * 电子邮箱
     */
    private String email;
    
    /**
     * 官方网站
     */
    private String website;
    
    /**
     * 统一社会信用代码
     */
    private String businessLicense;
    
    /**
     * 注册资本
     */
    private BigDecimal registeredCapital;
    
    /**
     * 客户来源：MARKETING/REFERRAL/EXHIBITION/ONLINE/OTHER
     */
    private String source;
    
    /**
     * 客户状态：ACTIVE/INACTIVE/BLACKLISTED
     * ACTIVE - 活跃
     * INACTIVE - 不活跃
     * BLACKLISTED - 黑名单
     */
    private String status;
    
    /**
     * 客户评分（1-5星）
     */
    private Integer rating;
    
    /**
     * 客户余额
     */
    private BigDecimal balance;
    
    /**
     * 信用额度
     */
    private BigDecimal creditLimit;
    
    /**
     * 已用信用额度
     */
    private BigDecimal creditUsed;
    
    /**
     * 客户等级ID（关联customer_levels表）
     */
    private Long levelId;
    
    /**
     * 负责销售ID
     */
    private Long salesId;
    
    /**
     * 负责销售姓名
     */
    private String salesName;
    
    /**
     * 客户分类标签（JSON格式，如：["重点客户","战略伙伴"]）
     */
    private String tags;
    
    /**
     * 客户简介
     */
    private String description;
    
    /**
     * 备注
     */
    private String remark;
    
    // ==================== 8级客户关系字段 ====================
    
    /**
     * 关系级别：1-8级
     * 1级：总店/总部
     * 2-8级：分店/分支机构
     */
    private Integer relationshipLevel;
    
    /**
     * 父客户ID（NULL表示顶级/总店）
     */
    private Long parentId;
    
    /**
     * 所属集团/连锁名称
     */
    private String groupName;
    
    /**
     * 是否为总店：true/false
     */
    private Boolean isHeadquarters;
    
    /**
     * 层级路径（如：/1/5/12/，便于查询某客户的所有上下游关系）
     */
    private String levelPath;
    
    // ==================== 时间戳字段 ====================
    
    /**
     * 首次成交时间
     */
    private LocalDateTime firstDealAt;
    
    /**
     * 最近成交时间
     */
    private LocalDateTime lastDealAt;
    
    /**
     * 最近联系时间
     */
    private LocalDateTime lastContactAt;
    
    /**
     * 建档时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
    
    /**
     * 删除时间
     */
    @TableLogic
    private LocalDateTime deletedAt;
    
    /**
     * 创建人ID
     */
    private Long creatorId;
    
    /**
     * 创建人姓名
     */
    private String creatorName;
    
    // ==================== 辅助方法 ====================
    
    /**
     * 判断是否为VIP客户
     */
    public boolean isVip() {
        return "VIP".equalsIgnoreCase(level);
    }
    
    /**
     * 判断是否为潜在客户
     */
    public boolean isPotential() {
        return "POTENTIAL".equalsIgnoreCase(level);
    }
    
    /**
     * 判断是否为普通客户
     */
    public boolean isNormal() {
        return "NORMAL".equalsIgnoreCase(level);
    }
    
    /**
     * 判断是否活跃
     */
    public boolean isActive() {
        return "ACTIVE".equals(status);
    }
    
    /**
     * 判断是否为总店
     */
    public boolean isHeadquarters() {
        return Boolean.TRUE.equals(isHeadquarters);
    }
    
    /**
     * 获取剩余信用额度
     */
    public BigDecimal getRemainingCredit() {
        if (creditLimit == null) {
            return BigDecimal.ZERO;
        }
        if (creditUsed == null) {
            return creditLimit;
        }
        return creditLimit.subtract(creditUsed);
    }
    
    /**
     * 判断信用额度是否充足
     */
    public boolean hasEnoughCredit(BigDecimal amount) {
        return getRemainingCredit().compareTo(amount) >= 0;
    }
}
