package dto

import (
	"encoding/json"
	"time"

	"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
)

// --- SensorData ---

// ListSensorDataRequest 定义了获取传感器数据列表的请求参数
type ListSensorDataRequest struct {
	Page       int        `json:"page" query:"page"`
	PageSize   int        `json:"page_size" query:"page_size"`
	DeviceID   *uint32    `json:"device_id" query:"device_id"`
	SensorType *string    `json:"sensor_type" query:"sensor_type"`
	StartTime  *time.Time `json:"start_time" query:"start_time"`
	EndTime    *time.Time `json:"end_time" query:"end_time"`
	OrderBy    string     `json:"order_by" query:"order_by"`
}

// SensorDataDTO 是用于API响应的传感器数据结构
type SensorDataDTO struct {
	Time             time.Time         `json:"time"`
	DeviceID         uint32            `json:"device_id"`
	AreaControllerID uint32            `json:"area_controller_id"`
	SensorType       models.SensorType `json:"sensor_type"`
	Data             json.RawMessage   `json:"data"`
}

// ListSensorDataResponse 是获取传感器数据列表的响应结构
type ListSensorDataResponse struct {
	List       []SensorDataDTO `json:"list"`
	Pagination PaginationDTO   `json:"pagination"`
}

// --- DeviceCommandLog ---

// ListDeviceCommandLogRequest 定义了获取设备命令日志列表的请求参数
type ListDeviceCommandLogRequest struct {
	Page            int        `json:"page" query:"page"`
	PageSize        int        `json:"page_size" query:"page_size"`
	DeviceID        *uint32    `json:"device_id" query:"device_id"`
	ReceivedSuccess *bool      `json:"received_success" query:"received_success"`
	StartTime       *time.Time `json:"start_time" query:"start_time"`
	EndTime         *time.Time `json:"end_time" query:"end_time"`
	OrderBy         string     `json:"order_by" query:"order_by"`
}

// DeviceCommandLogDTO 是用于API响应的设备命令日志结构
type DeviceCommandLogDTO struct {
	MessageID       string     `json:"message_id"`
	DeviceID        uint32     `json:"device_id"`
	SentAt          time.Time  `json:"sent_at"`
	AcknowledgedAt  *time.Time `json:"acknowledged_at"`
	ReceivedSuccess bool       `json:"received_success"`
}

// ListDeviceCommandLogResponse 是获取设备命令日志列表的响应结构
type ListDeviceCommandLogResponse struct {
	List       []DeviceCommandLogDTO `json:"list"`
	Pagination PaginationDTO         `json:"pagination"`
}

// --- PlanExecutionLog ---

// ListPlanExecutionLogRequest 定义了获取计划执行日志列表的请求参数
type ListPlanExecutionLogRequest struct {
	Page      int        `json:"page" query:"page"`
	PageSize  int        `json:"page_size" query:"page_size"`
	PlanID    *uint32    `json:"plan_id" query:"plan_id"`
	Status    *string    `json:"status" query:"status"`
	StartTime *time.Time `json:"start_time" query:"start_time"`
	EndTime   *time.Time `json:"end_time" query:"end_time"`
	OrderBy   string     `json:"order_by" query:"order_by"`
}

// PlanExecutionLogDTO 是用于API响应的计划执行日志结构
type PlanExecutionLogDTO struct {
	ID        uint32                 `json:"id"`
	CreatedAt time.Time              `json:"created_at"`
	UpdatedAt time.Time              `json:"updated_at"`
	PlanID    uint32                 `json:"plan_id"`
	PlanName  string                 `json:"plan_name"`
	Status    models.ExecutionStatus `json:"status"`
	StartedAt time.Time              `json:"started_at"`
	EndedAt   time.Time              `json:"ended_at"`
	Error     string                 `json:"error"`
}

// ListPlanExecutionLogResponse 是获取计划执行日志列表的响应结构
type ListPlanExecutionLogResponse struct {
	List       []PlanExecutionLogDTO `json:"list"`
	Pagination PaginationDTO         `json:"pagination"`
}

// --- TaskExecutionLog ---

// ListTaskExecutionLogRequest 定义了获取任务执行日志列表的请求参数
type ListTaskExecutionLogRequest struct {
	Page               int        `json:"page" query:"page"`
	PageSize           int        `json:"page_size" query:"page_size"`
	PlanExecutionLogID *uint32    `json:"plan_execution_log_id" query:"plan_execution_log_id"`
	TaskID             *int       `json:"task_id" query:"task_id"`
	Status             *string    `json:"status" query:"status"`
	StartTime          *time.Time `json:"start_time" query:"start_time"`
	EndTime            *time.Time `json:"end_time" query:"end_time"`
	OrderBy            string     `json:"order_by" query:"order_by"`
}

// TaskDTO 是用于API响应的简化版任务结构
type TaskDTO struct {
	ID          uint32 `json:"id"`
	Name        string `json:"name"`
	Description string `json:"description"`
}

// TaskExecutionLogDTO 是用于API响应的任务执行日志结构
type TaskExecutionLogDTO struct {
	ID                 uint32                 `json:"id"`
	CreatedAt          time.Time              `json:"created_at"`
	UpdatedAt          time.Time              `json:"updated_at"`
	PlanExecutionLogID uint32                 `json:"plan_execution_log_id"`
	TaskID             int                    `json:"task_id"`
	Task               TaskDTO                `json:"task"` // 嵌套的任务信息
	Status             models.ExecutionStatus `json:"status"`
	Output             string                 `json:"output"`
	StartedAt          time.Time              `json:"started_at"`
	EndedAt            time.Time              `json:"ended_at"`
}

// ListTaskExecutionLogResponse 是获取任务执行日志列表的响应结构
type ListTaskExecutionLogResponse struct {
	List       []TaskExecutionLogDTO `json:"list"`
	Pagination PaginationDTO         `json:"pagination"`
}

// --- PendingCollection ---

// ListPendingCollectionRequest 定义了获取待采集请求列表的请求参数
type ListPendingCollectionRequest struct {
	Page      int        `json:"page" query:"page"`
	PageSize  int        `json:"page_size" query:"page_size"`
	DeviceID  *uint32    `json:"device_id" query:"device_id"`
	Status    *string    `json:"status" query:"status"`
	StartTime *time.Time `json:"start_time" query:"start_time"`
	EndTime   *time.Time `json:"end_time" query:"end_time"`
	OrderBy   string     `json:"order_by" query:"order_by"`
}

// PendingCollectionDTO 是用于API响应的待采集请求结构
type PendingCollectionDTO struct {
	CorrelationID   string                         `json:"correlation_id"`
	DeviceID        uint32                         `json:"device_id"`
	CommandMetadata models.UintArray               `json:"command_metadata"`
	Status          models.PendingCollectionStatus `json:"status"`
	FulfilledAt     *time.Time                     `json:"fulfilled_at"`
	CreatedAt       time.Time                      `json:"created_at"`
}

// ListPendingCollectionResponse 是获取待采集请求列表的响应结构
type ListPendingCollectionResponse struct {
	List       []PendingCollectionDTO `json:"list"`
	Pagination PaginationDTO          `json:"pagination"`
}

// --- UserActionLog ---

// ListUserActionLogRequest 定义了获取用户操作日志列表的请求参数
type ListUserActionLogRequest struct {
	Page       int        `json:"page" query:"page"`
	PageSize   int        `json:"page_size" query:"page_size"`
	UserID     *uint32    `json:"user_id" query:"user_id"`
	Username   *string    `json:"username" query:"username"`
	ActionType *string    `json:"action_type" query:"action_type"`
	Status     *string    `json:"status" query:"status"`
	StartTime  *time.Time `json:"start_time" query:"start_time"`
	EndTime    *time.Time `json:"end_time" query:"end_time"`
	OrderBy    string     `json:"order_by" query:"order_by"`
}

// UserActionLogDTO 是用于API响应的用户操作日志结构
type UserActionLogDTO struct {
	ID             uint32             `json:"id"`
	Time           time.Time          `json:"time"`
	UserID         uint32             `json:"user_id"`
	Username       string             `json:"username"`
	SourceIP       string             `json:"source_ip"`
	ActionType     string             `json:"action_type"`
	TargetResource json.RawMessage    `json:"target_resource"`
	Description    string             `json:"description"`
	Status         models.AuditStatus `json:"status"`
	HTTPPath       string             `json:"http_path"`
	HTTPMethod     string             `json:"http_method"`
	ResultDetails  string             `json:"result_details"`
}

// ListUserActionLogResponse 是获取用户操作日志列表的响应结构
type ListUserActionLogResponse struct {
	List       []UserActionLogDTO `json:"list"`
	Pagination PaginationDTO      `json:"pagination"`
}

// --- MedicationLog ---

// ListMedicationLogRequest 定义了获取用药记录列表的请求参数
type ListMedicationLogRequest struct {
	Page         int        `json:"page" query:"page"`
	PageSize     int        `json:"page_size" query:"page_size"`
	PigBatchID   *uint32    `json:"pig_batch_id" query:"pig_batch_id"`
	MedicationID *uint32    `json:"medication_id" query:"medication_id"`
	Reason       *string    `json:"reason" query:"reason"`
	OperatorID   *uint32    `json:"operator_id" query:"operator_id"`
	StartTime    *time.Time `json:"start_time" query:"start_time"`
	EndTime      *time.Time `json:"end_time" query:"end_time"`
	OrderBy      string     `json:"order_by" query:"order_by"`
}

// MedicationDTO 是用于API响应的简化版药品结构
type MedicationDTO struct {
	ID   uint32 `json:"id"`
	Name string `json:"name"`
}

// MedicationLogDTO 是用于API响应的用药记录结构
type MedicationLogDTO struct {
	ID           uint32                      `json:"id"`
	PigBatchID   uint32                      `json:"pig_batch_id"`
	MedicationID uint32                      `json:"medication_id"`
	Medication   MedicationDTO               `json:"medication"`
	DosageUsed   float32                     `json:"dosage_used"`
	TargetCount  int                         `json:"target_count"`
	Reason       models.MedicationReasonType `json:"reason"`
	Description  string                      `json:"description"`
	OperatorID   uint32                      `json:"operator_id"`
	HappenedAt   time.Time                   `json:"happened_at"`
}

// ListMedicationLogResponse 是获取用药记录列表的响应结构
type ListMedicationLogResponse struct {
	List       []MedicationLogDTO `json:"list"`
	Pagination PaginationDTO      `json:"pagination"`
}

// --- PigBatchLog ---

// ListPigBatchLogRequest 定义了获取猪批次日志列表的请求参数
type ListPigBatchLogRequest struct {
	Page       int        `json:"page" query:"page"`
	PageSize   int        `json:"page_size" query:"page_size"`
	PigBatchID *uint32    `json:"pig_batch_id" query:"pig_batch_id"`
	ChangeType *string    `json:"change_type" query:"change_type"`
	OperatorID *uint32    `json:"operator_id" query:"operator_id"`
	StartTime  *time.Time `json:"start_time" query:"start_time"`
	EndTime    *time.Time `json:"end_time" query:"end_time"`
	OrderBy    string     `json:"order_by" query:"order_by"`
}

// PigBatchLogDTO 是用于API响应的猪批次日志结构
type PigBatchLogDTO struct {
	ID          uint32               `json:"id"`
	CreatedAt   time.Time            `json:"created_at"`
	UpdatedAt   time.Time            `json:"updated_at"`
	PigBatchID  uint32               `json:"pig_batch_id"`
	ChangeType  models.LogChangeType `json:"change_type"`
	ChangeCount int                  `json:"change_count"`
	Reason      string               `json:"reason"`
	BeforeCount int                  `json:"before_count"`
	AfterCount  int                  `json:"after_count"`
	OperatorID  uint32               `json:"operator_id"`
	HappenedAt  time.Time            `json:"happened_at"`
}

// ListPigBatchLogResponse 是获取猪批次日志列表的响应结构
type ListPigBatchLogResponse struct {
	List       []PigBatchLogDTO `json:"list"`
	Pagination PaginationDTO    `json:"pagination"`
}

// --- WeighingBatch ---

// ListWeighingBatchRequest 定义了获取批次称重记录列表的请求参数
type ListWeighingBatchRequest struct {
	Page       int        `json:"page" query:"page"`
	PageSize   int        `json:"page_size" query:"page_size"`
	PigBatchID *uint32    `json:"pig_batch_id" query:"pig_batch_id"`
	StartTime  *time.Time `json:"start_time" query:"start_time"`
	EndTime    *time.Time `json:"end_time" query:"end_time"`
	OrderBy    string     `json:"order_by" query:"order_by"`
}

// WeighingBatchDTO 是用于API响应的批次称重记录结构
type WeighingBatchDTO struct {
	ID           uint32    `json:"id"`
	CreatedAt    time.Time `json:"created_at"`
	UpdatedAt    time.Time `json:"updated_at"`
	WeighingTime time.Time `json:"weighing_time"`
	Description  string    `json:"description"`
	PigBatchID   uint32    `json:"pig_batch_id"`
}

// ListWeighingBatchResponse 是获取批次称重记录列表的响应结构
type ListWeighingBatchResponse struct {
	List       []WeighingBatchDTO `json:"list"`
	Pagination PaginationDTO      `json:"pagination"`
}

// --- WeighingRecord ---

// ListWeighingRecordRequest 定义了获取单次称重记录列表的请求参数
type ListWeighingRecordRequest struct {
	Page            int        `json:"page" query:"page"`
	PageSize        int        `json:"page_size" query:"page_size"`
	WeighingBatchID *uint32    `json:"weighing_batch_id" query:"weighing_batch_id"`
	PenID           *uint32    `json:"pen_id" query:"pen_id"`
	OperatorID      *uint32    `json:"operator_id" query:"operator_id"`
	StartTime       *time.Time `json:"start_time" query:"start_time"`
	EndTime         *time.Time `json:"end_time" query:"end_time"`
	OrderBy         string     `json:"order_by" query:"order_by"`
}

// WeighingRecordDTO 是用于API响应的单次称重记录结构
type WeighingRecordDTO struct {
	ID              uint32    `json:"id"`
	CreatedAt       time.Time `json:"created_at"`
	UpdatedAt       time.Time `json:"updated_at"`
	Weight          float32   `json:"weight"`
	WeighingBatchID uint32    `json:"weighing_batch_id"`
	PenID           uint32    `json:"pen_id"`
	OperatorID      uint32    `json:"operator_id"`
	Remark          string    `json:"remark"`
	WeighingTime    time.Time `json:"weighing_time"`
}

// ListWeighingRecordResponse 是获取单次称重记录列表的响应结构
type ListWeighingRecordResponse struct {
	List       []WeighingRecordDTO `json:"list"`
	Pagination PaginationDTO       `json:"pagination"`
}

// --- PigTransferLog ---

// ListPigTransferLogRequest 定义了获取猪只迁移日志列表的请求参数
type ListPigTransferLogRequest struct {
	Page          int        `json:"page" query:"page"`
	PageSize      int        `json:"page_size" query:"page_size"`
	PigBatchID    *uint32    `json:"pig_batch_id" query:"pig_batch_id"`
	PenID         *uint32    `json:"pen_id" query:"pen_id"`
	TransferType  *string    `json:"transfer_type" query:"transfer_type"`
	OperatorID    *uint32    `json:"operator_id" query:"operator_id"`
	CorrelationID *string    `json:"correlation_id" query:"correlation_id"`
	StartTime     *time.Time `json:"start_time" query:"start_time"`
	EndTime       *time.Time `json:"end_time" query:"end_time"`
	OrderBy       string     `json:"order_by" query:"order_by"`
}

// PigTransferLogDTO 是用于API响应的猪只迁移日志结构
type PigTransferLogDTO struct {
	ID            uint32                 `json:"id"`
	CreatedAt     time.Time              `json:"created_at"`
	UpdatedAt     time.Time              `json:"updated_at"`
	TransferTime  time.Time              `json:"transfer_time"`
	PigBatchID    uint32                 `json:"pig_batch_id"`
	PenID         uint32                 `json:"pen_id"`
	Quantity      int                    `json:"quantity"`
	Type          models.PigTransferType `json:"type"`
	CorrelationID string                 `json:"correlation_id"`
	OperatorID    uint32                 `json:"operator_id"`
	Remarks       string                 `json:"remarks"`
}

// ListPigTransferLogResponse 是获取猪只迁移日志列表的响应结构
type ListPigTransferLogResponse struct {
	List       []PigTransferLogDTO `json:"list"`
	Pagination PaginationDTO       `json:"pagination"`
}

// --- PigSickLog ---

// ListPigSickLogRequest 定义了获取病猪日志列表的请求参数
type ListPigSickLogRequest struct {
	Page              int        `json:"page" query:"page"`
	PageSize          int        `json:"page_size" query:"page_size"`
	PigBatchID        *uint32    `json:"pig_batch_id" query:"pig_batch_id"`
	PenID             *uint32    `json:"pen_id" query:"pen_id"`
	Reason            *string    `json:"reason" query:"reason"`
	TreatmentLocation *string    `json:"treatment_location" query:"treatment_location"`
	OperatorID        *uint32    `json:"operator_id" query:"operator_id"`
	StartTime         *time.Time `json:"start_time" query:"start_time"`
	EndTime           *time.Time `json:"end_time" query:"end_time"`
	OrderBy           string     `json:"order_by" query:"order_by"`
}

// PigSickLogDTO 是用于API响应的病猪日志结构
type PigSickLogDTO struct {
	ID                uint32                                  `json:"id"`
	CreatedAt         time.Time                               `json:"created_at"`
	UpdatedAt         time.Time                               `json:"updated_at"`
	PigBatchID        uint32                                  `json:"pig_batch_id"`
	PenID             uint32                                  `json:"pen_id"`
	ChangeCount       int                                     `json:"change_count"`
	Reason            models.PigBatchSickPigReasonType        `json:"reason"`
	BeforeCount       int                                     `json:"before_count"`
	AfterCount        int                                     `json:"after_count"`
	Remarks           string                                  `json:"remarks"`
	TreatmentLocation models.PigBatchSickPigTreatmentLocation `json:"treatment_location"`
	OperatorID        uint32                                  `json:"operator_id"`
	HappenedAt        time.Time                               `json:"happened_at"`
}

// ListPigSickLogResponse 是获取病猪日志列表的响应结构
type ListPigSickLogResponse struct {
	List       []PigSickLogDTO `json:"list"`
	Pagination PaginationDTO   `json:"pagination"`
}

// --- PigPurchase ---

// ListPigPurchaseRequest 定义了获取猪只采购记录列表的请求参数
type ListPigPurchaseRequest struct {
	Page       int        `json:"page" query:"page"`
	PageSize   int        `json:"page_size" query:"page_size"`
	PigBatchID *uint32    `json:"pig_batch_id" query:"pig_batch_id"`
	Supplier   *string    `json:"supplier" query:"supplier"`
	OperatorID *uint32    `json:"operator_id" query:"operator_id"`
	StartTime  *time.Time `json:"start_time" query:"start_time"`
	EndTime    *time.Time `json:"end_time" query:"end_time"`
	OrderBy    string     `json:"order_by" query:"order_by"`
}

// PigPurchaseDTO 是用于API响应的猪只采购记录结构
type PigPurchaseDTO struct {
	ID           uint32    `json:"id"`
	CreatedAt    time.Time `json:"created_at"`
	UpdatedAt    time.Time `json:"updated_at"`
	PigBatchID   uint32    `json:"pig_batch_id"`
	PurchaseDate time.Time `json:"purchase_date"`
	Supplier     string    `json:"supplier"`
	Quantity     int       `json:"quantity"`
	UnitPrice    float32   `json:"unit_price"`
	TotalPrice   float32   `json:"total_price"`
	Remarks      string    `json:"remarks"`
	OperatorID   uint32    `json:"operator_id"`
}

// ListPigPurchaseResponse 是获取猪只采购记录列表的响应结构
type ListPigPurchaseResponse struct {
	List       []PigPurchaseDTO `json:"list"`
	Pagination PaginationDTO    `json:"pagination"`
}

// --- PigSale ---

// ListPigSaleRequest 定义了获取猪只销售记录列表的请求参数
type ListPigSaleRequest struct {
	Page       int        `json:"page" query:"page"`
	PageSize   int        `json:"page_size" query:"page_size"`
	PigBatchID *uint32    `json:"pig_batch_id" query:"pig_batch_id"`
	Buyer      *string    `json:"buyer" query:"buyer"`
	OperatorID *uint32    `json:"operator_id" query:"operator_id"`
	StartTime  *time.Time `json:"start_time" query:"start_time"`
	EndTime    *time.Time `json:"end_time" query:"end_time"`
	OrderBy    string     `json:"order_by" query:"order_by"`
}

// PigSaleDTO 是用于API响应的猪只销售记录结构
type PigSaleDTO struct {
	ID         uint32    `json:"id"`
	CreatedAt  time.Time `json:"created_at"`
	UpdatedAt  time.Time `json:"updated_at"`
	PigBatchID uint32    `json:"pig_batch_id"`
	SaleDate   time.Time `json:"sale_date"`
	Buyer      string    `json:"buyer"`
	Quantity   int       `json:"quantity"`
	UnitPrice  float32   `json:"unit_price"`
	TotalPrice float32   `json:"total_price"`
	Remarks    string    `json:"remarks"`
	OperatorID uint32    `json:"operator_id"`
}

// ListPigSaleResponse 是获取猪只销售记录列表的响应结构
type ListPigSaleResponse struct {
	List       []PigSaleDTO  `json:"list"`
	Pagination PaginationDTO `json:"pagination"`
}
