package contract

import (
	"time"

	"github.com/google/uuid"
)

type CreateOrderIngredientTransactionRequest struct {
	OrderID          uuid.UUID  `json:"order_id" validate:"required"`
	OrderItemID      *uuid.UUID `json:"order_item_id,omitempty"`
	ProductID        uuid.UUID  `json:"product_id" validate:"required"`
	ProductVariantID *uuid.UUID `json:"product_variant_id,omitempty"`
	IngredientID     uuid.UUID  `json:"ingredient_id" validate:"required"`
	GrossQty         float64    `json:"gross_qty" validate:"required,gt=0"`
	NetQty           float64    `json:"net_qty" validate:"required,gt=0"`
	WasteQty         float64    `json:"waste_qty" validate:"min=0"`
	Unit             string     `json:"unit" validate:"required,max=50"`
	TransactionDate  *time.Time `json:"transaction_date,omitempty"`
}

type UpdateOrderIngredientTransactionRequest struct {
	GrossQty        *float64   `json:"gross_qty,omitempty" validate:"omitempty,gt=0"`
	NetQty          *float64   `json:"net_qty,omitempty" validate:"omitempty,gt=0"`
	WasteQty        *float64   `json:"waste_qty,omitempty" validate:"min=0"`
	Unit            *string    `json:"unit,omitempty" validate:"omitempty,max=50"`
	TransactionDate *time.Time `json:"transaction_date,omitempty"`
}

type OrderIngredientTransactionResponse struct {
	ID               uuid.UUID  `json:"id"`
	OrganizationID   uuid.UUID  `json:"organization_id"`
	OutletID         *uuid.UUID `json:"outlet_id"`
	OrderID          uuid.UUID  `json:"order_id"`
	OrderItemID      *uuid.UUID `json:"order_item_id"`
	ProductID        uuid.UUID  `json:"product_id"`
	ProductVariantID *uuid.UUID `json:"product_variant_id"`
	IngredientID     uuid.UUID  `json:"ingredient_id"`
	GrossQty         float64    `json:"gross_qty"`
	NetQty           float64    `json:"net_qty"`
	WasteQty         float64    `json:"waste_qty"`
	Unit             string     `json:"unit"`
	TransactionDate  time.Time  `json:"transaction_date"`
	CreatedBy        uuid.UUID  `json:"created_by"`
	CreatedAt        time.Time  `json:"created_at"`
	UpdatedAt        time.Time  `json:"updated_at"`

	// Relations - these would be populated by the service layer
	Organization   interface{} `json:"organization,omitempty"`
	Outlet         interface{} `json:"outlet,omitempty"`
	Order          interface{} `json:"order,omitempty"`
	OrderItem      interface{} `json:"order_item,omitempty"`
	Product        interface{} `json:"product,omitempty"`
	ProductVariant interface{} `json:"product_variant,omitempty"`
	Ingredient     interface{} `json:"ingredient,omitempty"`
	CreatedByUser  interface{} `json:"created_by_user,omitempty"`
}

type ListOrderIngredientTransactionsRequest struct {
	OrderID          *uuid.UUID `json:"order_id,omitempty"`
	OrderItemID      *uuid.UUID `json:"order_item_id,omitempty"`
	ProductID        *uuid.UUID `json:"product_id,omitempty"`
	ProductVariantID *uuid.UUID `json:"product_variant_id,omitempty"`
	IngredientID     *uuid.UUID `json:"ingredient_id,omitempty"`
	StartDate        *time.Time `json:"start_date,omitempty"`
	EndDate          *time.Time `json:"end_date,omitempty"`
	Page             int        `json:"page" validate:"min=1"`
	Limit            int        `json:"limit" validate:"min=1,max=100"`
}

type OrderIngredientTransactionSummary struct {
	IngredientID    uuid.UUID `json:"ingredient_id"`
	IngredientName  string    `json:"ingredient_name"`
	TotalGrossQty   float64   `json:"total_gross_qty"`
	TotalNetQty     float64   `json:"total_net_qty"`
	TotalWasteQty   float64   `json:"total_waste_qty"`
	WastePercentage float64   `json:"waste_percentage"`
	Unit            string    `json:"unit"`
}
