package com.erp.inventory.entity;

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

import java.time.LocalDateTime;

/**
 * 库存流水实体
 * 对应PHP StockLog模型
 * 记录所有库存变动操作
 * 
 * @author ERP Migration
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = false)
@TableName("stock_logs")
public class StockLog {

    /**
     * 主键ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * SKU编码
     */
    private String skuCode;

    /**
     * 仓库ID
     */
    private Long warehouseId;

    /**
     * 变化数量（正数为入库，负数为出库）
     */
    private Integer changeQuantity;

    /**
     * 类型：
     * - inbound: 入库
     * - outbound: 出库
     * - lock: 锁定/占用
     * - unlock: 释放占用
     * - ship: 发货出库
     * - defective_inbound: 残次品入库
     * - adjust: 手动调整
     * - reserve: 预扣库存
     * - confirm: 确认预扣
     * - cancel: 取消预扣
     */
    private String type;

    /**
     * 关联单号（如采购单号、发货单号、盘点单号）
     */
    private String relatedNo;

    /**
     * 订单ID（可选）
     */
    private Long orderId;

    /**
     * 运单号（可选）
     */
    private String deliveryNo;

    /**
     * 备注
     */
    private String remark;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;

    // ==================== 枚举和常量 ====================

    /**
     * 库存流水类型枚举
     */
    public enum Type {
        INBOUND("inbound", "入库"),
        OUTBOUND("outbound", "出库"),
        LOCK("lock", "占用"),
        UNLOCK("unlock", "释放占用"),
        SHIP("ship", "发货出库"),
        DEFECTIVE_INBOUND("defective_inbound", "残次品入库"),
        ADJUST("adjust", "手动调整"),
        RESERVE("reserve", "预扣库存"),
        CONFIRM("confirm", "确认预扣"),
        CANCEL("cancel", "取消预扣");

        private final String code;
        private final String label;

        Type(String code, String label) {
            this.code = code;
            this.label = label;
        }

        public String getCode() {
            return code;
        }

        public String getLabel() {
            return label;
        }

        public static Type fromCode(String code) {
            for (Type type : values()) {
                if (type.code.equals(code)) {
                    return type;
                }
            }
            return null;
        }
    }

    /**
     * 获取类型标签（中文）
     */
    public String getTypeLabel() {
        Type typeEnum = Type.fromCode(this.type);
        return typeEnum != null ? typeEnum.getLabel() : this.type;
    }
}
