package contract

import (
	"time"

	"github.com/google/uuid"
)

type CreateProductRequest struct {
	CategoryID      uuid.UUID                     `json:"category_id" validate:"required"`
	SKU             *string                       `json:"sku,omitempty"`
	Name            string                        `json:"name" validate:"required,min=1,max=255"`
	Description     *string                       `json:"description,omitempty"`
	Price           float64                       `json:"price" validate:"required,min=0"`
	Cost            *float64                      `json:"cost,omitempty" validate:"omitempty,min=0"`
	BusinessType    *string                       `json:"business_type,omitempty"`
	ImageURL        *string                       `json:"image_url,omitempty" validate:"omitempty,max=500"`
	PrinterType     *string                       `json:"printer_type,omitempty" validate:"omitempty,max=50"`
	Metadata        map[string]interface{}        `json:"metadata,omitempty"`
	IsActive        *bool                         `json:"is_active,omitempty"`
	Variants        []CreateProductVariantRequest `json:"variants,omitempty"`
	InitialStock    *int                          `json:"initial_stock,omitempty" validate:"omitempty,min=0"` // Initial stock quantity for all outlets
	ReorderLevel    *int                          `json:"reorder_level,omitempty" validate:"omitempty,min=0"` // Reorder level for all outlets
	CreateInventory bool                          `json:"create_inventory,omitempty"`                         // Whether to create inventory records for all outlets
}

type UpdateProductRequest struct {
	CategoryID   *uuid.UUID             `json:"category_id,omitempty"`
	SKU          *string                `json:"sku,omitempty"`
	Name         *string                `json:"name,omitempty" validate:"omitempty,min=1,max=255"`
	Description  *string                `json:"description,omitempty"`
	Price        *float64               `json:"price,omitempty" validate:"omitempty,min=0"`
	Cost         *float64               `json:"cost,omitempty" validate:"omitempty,min=0"`
	BusinessType *string                `json:"business_type,omitempty"`
	ImageURL     *string                `json:"image_url,omitempty" validate:"omitempty,max=500"`
	PrinterType  *string                `json:"printer_type,omitempty" validate:"omitempty,max=50"`
	Metadata     map[string]interface{} `json:"metadata,omitempty"`
	IsActive     *bool                  `json:"is_active,omitempty"`
	// Stock management fields
	ReorderLevel *int `json:"reorder_level,omitempty" validate:"omitempty,min=0"` // Update reorder level for all existing inventory records
}

type CreateProductVariantRequest struct {
	ProductID     uuid.UUID              `json:"product_id" validate:"required"`
	Name          string                 `json:"name" validate:"required,min=1,max=255"`
	PriceModifier float64                `json:"price_modifier" validate:"required"`
	Cost          float64                `json:"cost" validate:"min=0"`
	Metadata      map[string]interface{} `json:"metadata,omitempty"`
}

type UpdateProductVariantRequest struct {
	Name          *string                `json:"name,omitempty" validate:"omitempty,min=1,max=255"`
	PriceModifier *float64               `json:"price_modifier,omitempty"`
	Cost          *float64               `json:"cost,omitempty" validate:"omitempty,min=0"`
	Metadata      map[string]interface{} `json:"metadata,omitempty"`
}

type ProductResponse struct {
	ID             uuid.UUID                `json:"id"`
	OrganizationID uuid.UUID                `json:"organization_id"`
	CategoryID     uuid.UUID                `json:"category_id"`
	SKU            *string                  `json:"sku"`
	Name           string                   `json:"name"`
	Description    *string                  `json:"description"`
	Price          float64                  `json:"price"`
	Cost           float64                  `json:"cost"`
	BusinessType   string                   `json:"business_type"`
	ImageURL       *string                  `json:"image_url"`
	PrinterType    string                   `json:"printer_type"`
	Metadata       map[string]interface{}   `json:"metadata"`
	IsActive       bool                     `json:"is_active"`
	CreatedAt      time.Time                `json:"created_at"`
	UpdatedAt      time.Time                `json:"updated_at"`
	Category       *CategoryResponse        `json:"category,omitempty"`
	Variants       []ProductVariantResponse `json:"variants,omitempty"`
}

type ProductVariantResponse struct {
	ID            uuid.UUID              `json:"id"`
	ProductID     uuid.UUID              `json:"product_id"`
	Name          string                 `json:"name"`
	PriceModifier float64                `json:"price_modifier"`
	Cost          float64                `json:"cost"`
	Metadata      map[string]interface{} `json:"metadata"`
	CreatedAt     time.Time              `json:"created_at"`
	UpdatedAt     time.Time              `json:"updated_at"`
}

type ListProductsRequest struct {
	OrganizationID *uuid.UUID `json:"organization_id,omitempty"`
	CategoryID     *uuid.UUID `json:"category_id,omitempty"`
	BusinessType   string     `json:"business_type,omitempty"`
	IsActive       *bool      `json:"is_active,omitempty"`
	Search         string     `json:"search,omitempty"`
	MinPrice       *float64   `json:"min_price,omitempty" validate:"omitempty,min=0"`
	MaxPrice       *float64   `json:"max_price,omitempty" validate:"omitempty,min=0"`
	Page           int        `json:"page" validate:"required,min=1"`
	Limit          int        `json:"limit" validate:"required,min=1,max=100"`
}

type ListProductsResponse struct {
	Products   []ProductResponse `json:"products"`
	TotalCount int               `json:"total_count"`
	Page       int               `json:"page"`
	Limit      int               `json:"limit"`
	TotalPages int               `json:"total_pages"`
}
