package models

import (
	"time"
)

/*
	和猪只、猪群本身相关的模型
*/

// PigBatchStatus 定义了猪批次所处的不同阶段或状态
type PigBatchStatus string

const (
	BatchStatusActive   PigBatchStatus = "生产中" // 饲养中
	BatchStatusForSale  PigBatchStatus = "待售"  // 达到出栏标准
	BatchStatusSold     PigBatchStatus = "已出售"
	BatchStatusArchived PigBatchStatus = "已归档" // 批次结束（如全群淘汰等）
)

// PigBatchOriginType 定义了猪批次的来源
type PigBatchOriginType string

const (
	OriginTypeSelfFarrowed PigBatchOriginType = "自繁"
	OriginTypePurchased    PigBatchOriginType = "外购"
)

// PigBatch 是猪批次的核心模型，代表了一群被共同管理的猪
type PigBatch struct {
	Model
	BatchNumber  string             `gorm:"size:50;not null;comment:批次编号,如 2024-W25-A01"`
	OriginType   PigBatchOriginType `gorm:"size:20;not null;comment:批次来源 (自繁, 外购)"`
	StartDate    time.Time          `gorm:"not null;comment:批次开始日期 (如转入日或购买日)"`
	EndDate      time.Time          `gorm:"not null;comment:批次结束日期 (全部淘汰或售出)"`
	InitialCount int                `gorm:"not null;comment:初始数量"`
	Status       PigBatchStatus     `gorm:"size:20;not null;index;comment:批次状态"`
}

func (PigBatch) TableName() string {
	return "pig_batches"
}

// IsActive 判断猪批次是否处于活跃状态
func (pb PigBatch) IsActive() bool {
	return pb.Status != BatchStatusSold && pb.Status != BatchStatusArchived
}

// LogChangeType 定义了猪批次数量变更的类型
type LogChangeType string

const (
	ChangeTypeDeath       LogChangeType = "死亡"
	ChangeTypeCull        LogChangeType = "淘汰"
	ChangeTypeSale        LogChangeType = "销售"
	ChangeTypeBuy         LogChangeType = "购买"
	ChangeTypeTransferIn  LogChangeType = "转入"
	ChangeTypeTransferOut LogChangeType = "转出"
	ChangeTypeCorrection  LogChangeType = "盘点校正"
)

// PigBatchLog 记录了猪批次数量或状态的每一次变更
type PigBatchLog struct {
	Model
	PigBatchID  uint32        `gorm:"not null;index;comment:关联的猪批次ID"`
	ChangeType  LogChangeType `gorm:"size:20;not null;comment:变更类型"`
	ChangeCount int           `gorm:"not null;comment:数量变化,负数表示减少"`
	Reason      string        `gorm:"size:255;comment:变更原因描述"`
	BeforeCount int           `gorm:"not null;comment:变更前总数"`
	AfterCount  int           `gorm:"not null;comment:变更后总数"`
	OperatorID  uint32        `gorm:"comment:操作员ID"`
	HappenedAt  time.Time     `gorm:"primaryKey;comment:事件发生时间"`
}

func (PigBatchLog) TableName() string {
	return "pig_batch_logs"
}

// WeighingBatch 记录了一次批次称重的信息
type WeighingBatch struct {
	Model
	WeighingTime time.Time `gorm:"primaryKey;comment:称重时间"`
	Description  string    `gorm:"size:255;comment:批次称重描述"`
	PigBatchID   uint32    `gorm:"not null;index;comment:关联的猪批次ID"`
}

func (WeighingBatch) TableName() string {
	return "weighing_batches"
}

// WeighingRecord 记录了单次称重信息
type WeighingRecord struct {
	Model
	Weight          float32   `gorm:"not null;comment:单只猪重量 (kg)"`
	WeighingBatchID uint32    `gorm:"not null;index;comment:关联的批次称重ID"`
	PenID           uint32    `gorm:"not null;index;comment:所在猪圈ID"`
	OperatorID      uint32    `gorm:"not null;comment:操作员ID"`
	Remark          string    `gorm:"size:255;comment:备注"`
	WeighingTime    time.Time `gorm:"primaryKey;comment:称重时间"`
}

func (WeighingRecord) TableName() string {
	return "weighing_records"
}
