package com.erp.tenant.entity;

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

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 租户实体类
 */
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
@TableName("tenants")
public class Tenant {
    
    // ==================== 常量定义 ====================

    /** 状态：正常 */
    public static final int STATUS_ACTIVE = 1;

    /** 状态：禁用 */
    public static final int STATUS_INACTIVE = 0;

    /** 状态：暂停 */
    public static final int STATUS_SUSPENDED = -1;

    /** 状态：待审核 */
    public static final int STATUS_PENDING_REVIEW = 2;
    
    // ==================== 主键字段 ====================
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    // ==================== 基本信息 ====================
    
    /**
     * 租户名称
     */
    private String name;
    
    /**
     * 租户编码（唯一标识）
     */
    private String code;
    
    /**
     * 域名
     */
    private String domain;
    
    /**
     * 状态：0-禁用，1-正常，-1-暂停
     */
    private Integer status;
    
    /**
     * 套餐ID
     */
    @TableField("package_id")
    private Long packageId;
    
    /**
     * 管理员用户ID
     */
    @TableField("admin_user_id")
    private Long adminUserId;
    
    /**
     * 管理员邮箱
     */
    @TableField("admin_email")
    private String adminEmail;
    
    /**
     * 管理员手机号
     */
    @TableField("admin_phone")
    private String adminPhone;
    
    /**
     * 到期时间
     */
    @TableField("expire_time")
    private LocalDateTime expireTime;
    
    // ==================== 扩展信息 ====================
    
    /**
     * 租户配置（JSON格式）
     */
    private String settings;
    
    /**
     * 备注
     */
    private String remark;
    
    // ==================== 关联对象 ====================
    
    /**
     * 套餐对象（非数据库字段）
     */
    @TableField(exist = false)
    private Package pkg;
    
    // ==================== 时间戳字段 ====================
    
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
    
    /**
     * 删除时间
     */
    @TableLogic
    private LocalDateTime deletedAt;
    
    // ==================== 辅助方法 ====================
    
    /**
     * 判断租户是否正常
     */
    public boolean isActive() {
        return STATUS_ACTIVE == status;
    }
    
    /**
     * 判断租户是否已过期
     */
    public boolean isExpired() {
        return expireTime != null && LocalDateTime.now().isAfter(expireTime);
    }
    
    /**
     * 判断是否即将到期（7天内）
     */
    public boolean isExpiringSoon() {
        if (expireTime == null) {
            return false;
        }
        return expireTime.isBefore(LocalDateTime.now().plusDays(7)) && !isExpired();
    }
    
    /**
     * 获取状态标签
     */
    public String getStatusLabel() {
        return switch (status) {
            case STATUS_ACTIVE -> "正常";
            case STATUS_INACTIVE -> "禁用";
            case STATUS_SUSPENDED -> "暂停";
            case STATUS_PENDING_REVIEW -> "待审核";
            default -> "未知";
        };
    }
    
    /**
     * 获取套餐名称
     */
    public String getPackageName() {
        return pkg != null ? pkg.getName() : null;
    }
    
    /**
     * 获取套餐编码
     */
    public String getPackageCode() {
        return pkg != null ? pkg.getCode() : null;
    }
}
