package com.czg.order.entity;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 *  实体类。
 *
 * @author zs
 * @since 2025-03-07
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("tb_shop_prod_statistic")
public class ShopProdStatistic implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    @Id(keyType = KeyType.Auto)
    @ExcelIgnore
    private Long id;

    /**
     * 商品id
     */
    @ExcelIgnore
    private Long prodId;

    /**
     * 分类 ID
     */
    @ExcelIgnore
    private Long categoryId;

    /**
     * 商品名称
     */
    @Column(ignore = true)
    @ExcelProperty("商品名称")
    @ColumnWidth(30)
    private String productName;

    /**
     * 销售数量
     */
    @ExcelProperty("销量")
    @ColumnWidth(15)
    private BigDecimal saleCount;

    /**
     * 销售金额
     */
    @ExcelProperty("销售金额")
    @ColumnWidth(15)
    private BigDecimal saleAmount;

    /**
     * 退单量
     */
    @ExcelProperty("退单量")
    @ColumnWidth(15)
    private BigDecimal refundCount;

    /**
     * 退单金额
     */
    @ExcelProperty("退款金额")
    @ColumnWidth(15)
    private BigDecimal refundAmount;

    /**
     * 实际销售数量（过滤掉退单后的数量）
     */
    @ExcelProperty("实际销量")
    @ColumnWidth(15)
    private BigDecimal validSaleCount;

     /**
     * 实际销售金额（过滤掉退单后的金额）
     */
    @ExcelProperty("实际销售额")
    @ColumnWidth(15)
    private BigDecimal validSaleAmount;

    /**
     * 店铺id
     */
    @ExcelIgnore
    private Long shopId;

    /**
     * 创建时间
     */
    @ExcelIgnore
    private Date createDay;


    public void initValidData() {
        // 初始化实际销售数量和金额（过滤退单数据）
        this.validSaleCount = this.saleCount.subtract(this.refundCount);
        this.validSaleAmount = this.saleAmount.subtract(this.refundAmount);
    }

    // 在 ShopProdStatistic.java 中添加以下方法
    /**
     * 判断当前统计数据是否有效（销售数量、金额，退单数量、金额均有值且大于0）
     * @return true=有效，false=无效
     */
    public boolean isValid() {
        // 定义一个方法，统一校验“字段非空且大于0”
        // 避免重复代码，提高可读性
        return isPositive(saleCount) ||
                isPositive(saleAmount) ||
                isPositive(refundCount) ||
                isPositive(refundAmount);
    }

    /**
     * 校验 BigDecimal 字段是否非空且大于0
     * @param value 待校验字段
     * @return true=非空且大于0，false=否则
     */
    private boolean isPositive(BigDecimal value) {
        // 先判断是否非空，再用 compareTo 比较是否大于0（compareTo 返回 >0 表示当前值大）
        return value != null && value.compareTo(BigDecimal.ZERO) > 0;
    }
}
