/**
 * Product 模型定义
 * @file Product.js
 * @description 定义产品模型，用于数据库操作
 */
const { DataTypes } = require('sequelize');
const BaseModel = require('./BaseModel');
const { sequelize } = require('../config/database-simple');

/**
 * 产品模型
 * @typedef {Object} Product
 * @property {number} id - 产品唯一标识
 * @property {string} name - 产品名称
 * @property {string} description - 产品描述
 * @property {number} price - 产品价格（单位：分）
 * @property {number} stock - 库存数量
 * @property {string} status - 产品状态
 * @property {Date} created_at - 创建时间
 * @property {Date} updated_at - 更新时间
 */
class Product extends BaseModel {
  /**
   * 获取激活的产品列表
   * @param {Object} options 查询选项
   * @returns {Promise<Array>} 产品列表
   */
  static async getActiveProducts(options = {}) {
    return await this.findAll({
      where: { status: 'active' },
      ...options
    });
  }

  /**
   * 更新产品库存
   * @param {Number} quantity 变更数量，正数增加库存，负数减少库存
   * @returns {Promise<Boolean>} 更新结果
   */
  async updateStock(quantity) {
    try {
      // 使用事务和乐观锁确保库存操作的原子性
      const result = await sequelize.transaction(async (t) => {
        const product = await Product.findByPk(this.id, { transaction: t, lock: true });
        
        if (!product) {
          throw new Error('产品不存在');
        }
        
        const newStock = product.stock + quantity;
        
        if (newStock < 0) {
          throw new Error('库存不足');
        }
        
        product.stock = newStock;
        await product.save({ transaction: t });
        
        return true;
      });
      
      return result;
    } catch (error) {
      console.error('更新库存失败:', error);
      return false;
    }
  }

  /**
   * 检查产品库存是否充足
   * @param {Number} quantity 需要的数量
   * @returns {Boolean} 是否充足
   */
  hasEnoughStock(quantity) {
    return this.stock >= quantity;
  }
}

// 初始化Product模型
Product.init({
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  name: {
    type: DataTypes.STRING(100),
    allowNull: false
  },
  description: {
    type: DataTypes.TEXT,
    allowNull: true
  },
  price: {
    type: DataTypes.DECIMAL(10, 2),
    allowNull: false
  },
  stock: {
    type: DataTypes.INTEGER,
    allowNull: true,
    defaultValue: 0
  },
  status: {
    type: DataTypes.ENUM('active', 'inactive'),
    allowNull: true,
    defaultValue: 'active'
  }
}, {
  sequelize,
  tableName: 'products',
  modelName: 'Product',
  timestamps: true
});

/**
 * 导出产品模型
 * @exports Product
 */
module.exports = Product;