<template>
  <el-dialog
    title="跨群调栏"
    :model-value="visible"
    @update:model-value="$emit('update:visible', $event)"
    width="40%"
    @close="resetForm"
  >
    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
      <el-form-item label="源猪群批次">
        <span>{{ batch.batch_number }}</span>
      </el-form-item>
      <el-form-item label="源猪栏" prop="fromPenID">
        <el-select v-model="form.fromPenID" placeholder="请选择源猪栏" style="width: 100%;">
          <el-option
            v-for="pen in sourcePens"
            :key="pen.id"
            :label="`${pen.pen_number} (存栏: ${pen.current_pig_count})`"
            :value="pen.id"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="目标猪群批次" prop="destBatchID">
        <el-select v-model="form.destBatchID" placeholder="请选择目标猪群" style="width: 100%;" @change="onDestBatchChange">
          <el-option
            v-for="b in availableBatches"
            :key="b.id"
            :label="b.batch_number"
            :value="b.id"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="目标猪栏" prop="toPenID">
        <el-select v-model="form.toPenID" placeholder="请选择目标猪栏" style="width: 100%;">
          <el-option
            v-for="pen in destinationPens"
            :key="pen.id"
            :label="`${pen.pen_number} (容量: ${pen.capacity})`"
            :value="pen.id"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="调栏数量" prop="quantity">
        <el-input-number v-model="form.quantity" :min="1" :max="maxTransferQuantity" />
      </el-form-item>
      <el-form-item label="备注" prop="remarks">
        <el-input v-model="form.remarks" type="textarea" :rows="2" placeholder="请输入备注" />
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="$emit('update:visible', false)">取 消</el-button>
        <el-button type="primary" @click="handleConfirm">确 定</el-button>
      </span>
    </template>
  </el-dialog>
</template>

<script>
import { getPigBatches, transferPigsAcrossBatches } from '@/api/pigBatch';
import { getPens } from '@/api/pen';

export default {
  name: 'TransferPigsAcrossBatchesModal',
  props: {
    visible: {
      type: Boolean,
      required: true
    },
    batch: {
      type: Object,
      required: true // 源猪群批次信息
    }
  },
  emits: ['update:visible', 'success'],
  data() {
    return {
      form: {
        fromPenID: null,
        destBatchID: null,
        toPenID: null,
        quantity: 1,
        remarks: ''
      },
      rules: {
        fromPenID: [{ required: true, message: '请选择源猪栏', trigger: 'change' }],
        destBatchID: [{ required: true, message: '请选择目标猪群批次', trigger: 'change' }],
        toPenID: [{ required: true, message: '请选择目标猪栏', trigger: 'change' }],
        quantity: [
          { required: true, message: '请输入调栏数量', trigger: 'blur' },
          { type: 'integer', message: '请输入整数', trigger: 'blur' },
          { validator: this.validateQuantity, trigger: 'blur' }
        ]
      },
      sourcePens: [], // 源猪群的猪栏列表
      availableBatches: [], // 可用的目标猪群列表
      destinationPens: [], // 目标猪群的猪栏列表
      maxTransferQuantity: 1 // 最大可调栏数量
    };
  },
  watch: {
    visible(newVal) {
      if (newVal) {
        this.initData();
      }
    },
    'form.fromPenID': function(newVal) {
      if (newVal) {
        const selectedPen = this.sourcePens.find(pen => pen.id === newVal);
        this.maxTransferQuantity = selectedPen ? selectedPen.current_pig_count : 1;
        // 如果当前数量大于最大值，重置数量
        if (this.form.quantity > this.maxTransferQuantity) {
          this.form.quantity = this.maxTransferQuantity;
        }
      }
    }
  },
  methods: {
    async initData() {
      this.resetForm();
      this.sourcePens = this.batch.pens.filter(pen => pen.current_pig_count > 0); // 过滤掉没有猪的猪栏
      await this.fetchAvailableBatchesAndPens();
    },
    async fetchAvailableBatchesAndPens() {
      try {
        const [batchesResponse, pensResponse] = await Promise.all([
          getPigBatches({ is_active: true }), // 获取所有活跃猪群
          getPens() // 获取所有猪栏
        ]);

        const allBatches = batchesResponse.data || [];
        const allPens = pensResponse.data || [];

        // 过滤掉源猪群自身，以及非活跃的猪群
        this.availableBatches = allBatches.filter(b => b.id !== this.batch.id && b.is_active);

        // 将所有猪栏按批次ID分组，方便后续查找
        const pensByBatch = allPens.reduce((acc, pen) => {
          if (pen.pig_batch_id) {
            if (!acc[pen.pig_batch_id]) {
              acc[pen.pig_batch_id] = [];
            }
            acc[pen.pig_batch_id].push(pen);
          }
          return acc;
        }, {});
        this.pensByBatch = pensByBatch; // 存储起来，以便 onDestBatchChange 使用

      } catch (error) {
        console.error("Error fetching batches or pens:", error);
        this.$message.error("获取猪群或猪栏信息失败");
      }
    },
    onDestBatchChange(batchId) {
      this.form.toPenID = null; // 重置目标猪栏选择
      // 过滤出目标批次下，且未满的猪栏
      this.destinationPens = (this.pensByBatch[batchId] || []).filter(pen => pen.current_pig_count < pen.capacity);
    },
    validateQuantity(rule, value, callback) {
      if (value > this.maxTransferQuantity) {
        callback(new Error(`调栏数量不能超过源猪栏存栏数量 (${this.maxTransferQuantity})`));
      } else {
        callback();
      }
    },
    handleConfirm() {
      this.$refs.form.validate(async valid => {
        if (valid) {
          try {
            await transferPigsAcrossBatches(this.batch.id, {
              fromPenID: this.form.fromPenID,
              destBatchID: this.form.destBatchID,
              toPenID: this.form.toPenID,
              quantity: this.form.quantity,
              remarks: this.form.remarks
            });
            this.$message.success('跨群调栏成功');
            this.$emit('success');
            this.$emit('update:visible', false);
          } catch (error) {
            console.error('Error transferring pigs across batches:', error);
            this.$message.error('跨群调栏失败: ' + (error.response?.data?.message || error.message || '未知错误'));
          }
        }
      });
    },
    resetForm() {
      this.$refs.form?.resetFields();
      this.form.fromPenID = null;
      this.form.destBatchID = null;
      this.form.toPenID = null;
      this.form.quantity = 1;
      this.form.remarks = '';
      this.sourcePens = [];
      this.availableBatches = [];
      this.destinationPens = [];
      this.maxTransferQuantity = 1;
    }
  }
};
</script>

<style scoped>
</style>
