package marketplace

import (
	"time"

	"github.com/google/uuid"
	"gorm.io/gorm"
)

// LicenseType définit le type de licence (Basic, Premium, Exclusive)
type LicenseType string

const (
	LicenseBasic     LicenseType = "basic"
	LicensePremium   LicenseType = "premium"
	LicenseExclusive LicenseType = "exclusive"
)

// ProductStatus définit le statut d'un produit (Draft, Active, Archived)
type ProductStatus string

const (
	ProductStatusDraft    ProductStatus = "draft"
	ProductStatusActive   ProductStatus = "active"
	ProductStatusArchived ProductStatus = "archived"
)

// Product représente un produit vendable sur la marketplace (Track, Sample Pack, Service)
type Product struct {
	ID          uuid.UUID     `gorm:"type:uuid;primaryKey" json:"id"`
	SellerID    uuid.UUID     `gorm:"type:uuid;not null" json:"seller_id"`
	Title       string        `gorm:"not null;size:255" json:"title"`
	Description string        `gorm:"type:text" json:"description"`
	Price       float64       `gorm:"not null;type:decimal(10,2)" json:"price"`
	Currency    string        `gorm:"default:'EUR';size:3" json:"currency"`
	Status      ProductStatus `gorm:"default:'draft'" json:"status"`
	ProductType string        `gorm:"not null" json:"product_type"` // "track", "pack", "service"

	// Liaison optionnelle avec un Track (si ProductType == "track")
	TrackID     *uuid.UUID  `gorm:"type:uuid" json:"track_id,omitempty"`
	LicenseType LicenseType `gorm:"size:50" json:"license_type,omitempty"`

	CreatedAt time.Time      `gorm:"autoCreateTime" json:"created_at"`
	UpdatedAt time.Time      `gorm:"autoUpdateTime" json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
}

func (p *Product) BeforeCreate(tx *gorm.DB) (err error) {
	if p.ID == uuid.Nil {
		p.ID = uuid.New()
	}
	return
}

// License représente une licence achetée par un utilisateur pour un Track
type License struct {
	ID        uuid.UUID `gorm:"type:uuid;primaryKey" json:"id"`
	BuyerID   uuid.UUID `gorm:"type:uuid;not null" json:"buyer_id"`
	TrackID   uuid.UUID `gorm:"type:uuid;not null" json:"track_id"`
	ProductID uuid.UUID `gorm:"type:uuid;not null" json:"product_id"`
	OrderID   uuid.UUID `gorm:"type:uuid;not null" json:"order_id"`

	Type          LicenseType `gorm:"not null" json:"type"`
	Rights        string      `gorm:"type:jsonb" json:"rights"` // Détails des droits (JSON)
	DownloadsLeft int         `gorm:"default:3" json:"downloads_left"`

	CreatedAt time.Time  `gorm:"autoCreateTime" json:"created_at"`
	ExpiresAt *time.Time `json:"expires_at,omitempty"`
}

func (l *License) BeforeCreate(tx *gorm.DB) (err error) {
	if l.ID == uuid.Nil {
		l.ID = uuid.New()
	}
	return
}

// Order représente une commande/transaction
type Order struct {
	ID            uuid.UUID `gorm:"type:uuid;primaryKey" json:"id"`
	BuyerID       uuid.UUID `gorm:"type:uuid;not null" json:"buyer_id"`
	TotalAmount   float64   `gorm:"not null;type:decimal(10,2)" json:"total_amount"`
	Currency      string    `gorm:"default:'EUR'" json:"currency"`
	Status        string    `gorm:"default:'pending'" json:"status"` // pending, paid, failed, refunded
	PaymentIntent string    `json:"payment_intent,omitempty"`        // Stripe PaymentIntent ID

	Items []OrderItem `gorm:"foreignKey:OrderID" json:"items"`

	CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
	UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`
}

func (o *Order) BeforeCreate(tx *gorm.DB) (err error) {
	if o.ID == uuid.Nil {
		o.ID = uuid.New()
	}
	return
}

// OrderItem représente une ligne dans une commande
type OrderItem struct {
	ID        uuid.UUID `gorm:"type:uuid;primaryKey" json:"id"`
	OrderID   uuid.UUID `gorm:"type:uuid;not null" json:"order_id"`
	ProductID uuid.UUID `gorm:"type:uuid;not null" json:"product_id"`
	Price     float64   `gorm:"not null;type:decimal(10,2)" json:"price"`
}

func (oi *OrderItem) BeforeCreate(tx *gorm.DB) (err error) {
	if oi.ID == uuid.Nil {
		oi.ID = uuid.New()
	}
	return
}
