/**
 * 动物控制器
 * @file animalController.js
 * @description 处理动物相关的请求
 */

const { Animal, Farm } = require('../models');

/**
 * 获取所有动物
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.getAllAnimals = async (req, res) => {
  try {
    const animals = await Animal.findAll({
      include: [{ model: Farm, as: 'farm', attributes: ['id', 'name', 'location'] }]
    });
    res.status(200).json({
      success: true,
      data: animals
    });
  } catch (error) {
    console.error('获取动物列表失败:', error);
    res.status(500).json({
      success: false,
      message: '获取动物列表失败',
      error: error.message
    });
  }
};

/**
 * 根据养殖场名称搜索动物
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.searchAnimalsByFarmName = async (req, res) => {
  try {
    const { farmName } = req.query;
    
    if (!farmName) {
      return res.status(400).json({
        success: false,
        message: '请提供养殖场名称参数'
      });
    }
    
    console.log(`开始搜索养殖场名称包含 "${farmName}" 的动物...`);
    
    // 首先找到匹配的养殖场
    const farms = await Farm.findAll({
      where: {
        name: {
          [require('sequelize').Op.like]: `%${farmName}%`
        }
      },
      attributes: ['id', 'name']
    });
    
    if (farms.length === 0) {
      return res.status(200).json({
        success: true,
        data: [],
        message: '未找到匹配的养殖场'
      });
    }
    
    const farmIds = farms.map(farm => farm.id);
    
    // 根据养殖场ID查找动物
    const animals = await Animal.findAll({
      where: {
        farm_id: {
          [require('sequelize').Op.in]: farmIds
        }
      },
      include: [{ model: Farm, as: 'farm', attributes: ['id', 'name', 'location'] }],
      order: [['created_at', 'DESC']]
    });
    
    console.log(`找到 ${animals.length} 个匹配的动物`);
    
    res.status(200).json({
      success: true,
      data: animals,
      message: `找到 ${animals.length} 个养殖场名称包含 "${farmName}" 的动物`
    });
  } catch (error) {
    console.error('根据养殖场名称搜索动物失败:', error);
    res.status(500).json({
      success: false,
      message: '搜索动物失败',
      error: error.message
    });
  }
};

/**
 * 获取单个动物
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.getAnimalById = async (req, res) => {
  try {
    const { id } = req.params;
    const animal = await Animal.findByPk(id, {
      include: [{ model: Farm, as: 'farm', attributes: ['id', 'name'] }]
    });
    
    if (!animal) {
      return res.status(404).json({
        success: false,
        message: '动物不存在'
      });
    }
    
    res.status(200).json({
      success: true,
      data: animal
    });
  } catch (error) {
    console.error(`获取动物(ID: ${req.params.id})失败:`, error);
    res.status(500).json({
      success: false,
      message: '获取动物详情失败',
      error: error.message
    });
  }
};

/**
 * 创建动物
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.createAnimal = async (req, res) => {
  try {
    const { type, count, farm_id, health_status, last_inspection, notes } = req.body;
    
    // 验证必填字段
    if (!type || !count || !farm_id) {
      return res.status(400).json({
        success: false,
        message: '类型、数量和养殖场ID为必填项'
      });
    }
    
    // 验证养殖场是否存在
    const farm = await Farm.findByPk(farm_id);
    if (!farm) {
      return res.status(404).json({
        success: false,
        message: '指定的养殖场不存在'
      });
    }
    
    const animal = await Animal.create({
      type,
      count,
      farm_id,
      health_status: health_status || 'healthy',
      last_inspection: last_inspection || new Date(),
      notes
    });
    
    res.status(201).json({
      success: true,
      message: '动物创建成功',
      data: animal
    });
  } catch (error) {
    console.error('创建动物失败:', error);
    res.status(500).json({
      success: false,
      message: '创建动物失败',
      error: error.message
    });
  }
};

/**
 * 更新动物
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.updateAnimal = async (req, res) => {
  try {
    const { id } = req.params;
    const { type, count, farm_id, health_status, last_inspection, notes } = req.body;
    
    console.log('=== 动物更新请求 ===');
    console.log('动物ID:', id);
    console.log('请求数据:', { type, count, health_status, farm_id, last_inspection, notes });
    
    const animal = await Animal.findByPk(id);
    
    if (!animal) {
      console.log('动物不存在, ID:', id);
      return res.status(404).json({
        success: false,
        message: '动物不存在'
      });
    }
    
    console.log('更新前的动物数据:', animal.toJSON());
    
    // 如果更新了养殖场ID，验证养殖场是否存在
    if (farm_id && farm_id !== animal.farm_id) {
      const farm = await Farm.findByPk(farm_id);
      if (!farm) {
        console.log('养殖场不存在, farm_id:', farm_id);
        return res.status(404).json({
          success: false,
          message: '指定的养殖场不存在'
        });
      }
      console.log('养殖场验证通过, farm_id:', farm_id);
    }
    
    console.log('准备更新动物数据...');
    const updateResult = await animal.update({
      type,
      count,
      farm_id,
      health_status,
      last_inspection,
      notes
    });
    console.log('更新操作结果:', updateResult ? '成功' : '失败');

    // 重新获取更新后的数据
    await animal.reload();
    console.log('更新后的动物数据:', animal.toJSON());

    res.status(200).json({
      success: true,
      message: '动物更新成功',
      data: animal
    });
    
    console.log('响应发送成功');
  } catch (error) {
    console.error(`更新动物(ID: ${req.params.id})失败:`, error);
    res.status(500).json({
      success: false,
      message: '更新动物失败',
      error: error.message
    });
  }
};

/**
 * 删除动物
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.deleteAnimal = async (req, res) => {
  try {
    const { id } = req.params;
    const animal = await Animal.findByPk(id);
    
    if (!animal) {
      return res.status(404).json({
        success: false,
        message: '动物不存在'
      });
    }
    
    await animal.destroy();
    
    res.status(200).json({
      success: true,
      message: '动物删除成功'
    });
  } catch (error) {
    console.error(`删除动物(ID: ${req.params.id})失败:`, error);
    res.status(500).json({
      success: false,
      message: '删除动物失败',
      error: error.message
    });
  }
};

/**
 * 按类型统计动物数量
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.getAnimalStatsByType = async (req, res) => {
  try {
    const { sequelize } = require('../config/database-simple');
    const stats = await Animal.findAll({
      attributes: [
        'type',
        [sequelize.fn('SUM', sequelize.col('count')), 'total']
      ],
      group: ['type']
    });
    
    res.status(200).json({
      success: true,
      data: stats
    });
  } catch (error) {
    console.error('获取动物类型统计失败:', error);
    res.status(500).json({
      success: false,
      message: '获取动物类型统计失败',
      error: error.message
    });
  }
};