package domain

import (
	"time"

	"github.com/google/uuid"
	"github.com/lib/pq"
	"github.com/shopspring/decimal"
)

// Plan represents a subscription plan in the system
type Plan struct {
	ID              uuid.UUID           `json:"id" db:"id"`
	Name            string              `json:"name" db:"name"`
	Slug            string              `json:"slug" db:"slug"`
	Description     string              `json:"description" db:"description"`
	MinUsers        int                 `json:"min_users" db:"min_users"`
	MaxUsers        int                 `json:"max_users" db:"max_users"` // -1 means unlimited
	MonthlyPrice    *decimal.Decimal    `json:"monthly_price" db:"monthly_price"`
	AnnualPrice     *decimal.Decimal    `json:"annual_price" db:"annual_price"`
	Features        pq.StringArray      `json:"features" db:"features"`
	Differentiators pq.StringArray      `json:"differentiators" db:"differentiators"`
	StorageGB       int                 `json:"storage_gb" db:"storage_gb"`
	IsActive        bool                `json:"is_active" db:"is_active"`
	CreatedAt       time.Time           `json:"created_at" db:"created_at"`
	UpdatedAt       time.Time           `json:"updated_at" db:"updated_at"`
}

// CreatePlanRequest represents the request to create a new plan
type CreatePlanRequest struct {
	Name            string     `json:"name" validate:"required"`
	Slug            string     `json:"slug" validate:"required"`
	Description     string     `json:"description"`
	MinUsers        int        `json:"min_users" validate:"required,min=1"`
	MaxUsers        int        `json:"max_users" validate:"required"` // -1 for unlimited
	MonthlyPrice    *float64   `json:"monthly_price"`
	AnnualPrice     *float64   `json:"annual_price"`
	Features        []string   `json:"features"`
	Differentiators []string   `json:"differentiators"`
	StorageGB       int        `json:"storage_gb" validate:"required,min=1"`
	IsActive        bool       `json:"is_active"`
}

// UpdatePlanRequest represents the request to update a plan
type UpdatePlanRequest struct {
	Name            *string    `json:"name"`
	Slug            *string    `json:"slug"`
	Description     *string    `json:"description"`
	MinUsers        *int       `json:"min_users"`
	MaxUsers        *int       `json:"max_users"`
	MonthlyPrice    *float64   `json:"monthly_price"`
	AnnualPrice     *float64   `json:"annual_price"`
	Features        []string   `json:"features"`
	Differentiators []string   `json:"differentiators"`
	StorageGB       *int       `json:"storage_gb"`
	IsActive        *bool      `json:"is_active"`
}

// Subscription represents an agency's subscription to a plan
type Subscription struct {
	ID          uuid.UUID `json:"id" db:"id"`
	AgencyID    uuid.UUID `json:"agency_id" db:"agency_id"`
	PlanID      uuid.UUID `json:"plan_id" db:"plan_id"`
	BillingType string    `json:"billing_type" db:"billing_type"` // monthly or annual
	CurrentUsers int      `json:"current_users" db:"current_users"`
	Status      string    `json:"status" db:"status"` // active, suspended, cancelled
	StartDate   time.Time `json:"start_date" db:"start_date"`
	RenewalDate time.Time `json:"renewal_date" db:"renewal_date"`
	CreatedAt   time.Time `json:"created_at" db:"created_at"`
	UpdatedAt   time.Time `json:"updated_at" db:"updated_at"`
}

// CreateSubscriptionRequest represents the request to create a subscription
type CreateSubscriptionRequest struct {
	AgencyID    uuid.UUID `json:"agency_id" validate:"required"`
	PlanID      uuid.UUID `json:"plan_id" validate:"required"`
	BillingType string    `json:"billing_type" validate:"required,oneof=monthly annual"`
}
