package models

import (
	"gorm.io/gorm"
	"time"

	"github.com/google/uuid"
)

// RoyaltyRecord enregistrement d'une royalty dans la base de données
type RoyaltyRecord struct {
	ID            uuid.UUID  `json:"id" gorm:"type:uuid;primaryKey"`
	ContentID     uuid.UUID  `json:"content_id" gorm:"type:uuid;not null;index"`
	CreatorID     uuid.UUID  `json:"creator_id" gorm:"type:uuid;not null;index"`
	Period        string     `json:"period" gorm:"not null;index"`
	Plays         int64      `json:"plays" gorm:"not null"`
	Revenue       float64    `json:"revenue" gorm:"not null"`
	RoyaltyAmount float64    `json:"royalty_amount" gorm:"not null"`
	RoyaltyRate   float64    `json:"royalty_rate" gorm:"not null"`
	Status        string     `json:"status" gorm:"not null;default:'calculated'"`
	CalculatedAt  time.Time  `json:"calculated_at" gorm:"not null"`
	PaidAt        *time.Time `json:"paid_at,omitempty"`
	CreatedAt     time.Time  `json:"created_at" gorm:"autoCreateTime"`
	UpdatedAt     time.Time  `json:"updated_at" gorm:"autoUpdateTime"`
}

// RoyaltyPayout paiement de royalties dans la base de données
type RoyaltyPayout struct {
	ID               uuid.UUID `json:"id" gorm:"type:uuid;primaryKey"`
	PayoutID         string    `json:"payout_id" gorm:"uniqueIndex;not null"`
	CreatorID        uuid.UUID `json:"creator_id" gorm:"type:uuid;not null;index"`
	Amount           float64   `json:"amount" gorm:"not null"`
	Currency         string    `json:"currency" gorm:"not null;default:'EUR'"`
	Period           string    `json:"period" gorm:"not null;index"`
	Status           string    `json:"status" gorm:"not null;default:'pending'"`
	PaymentMethod    string    `json:"payment_method" gorm:"not null"`
	TransactionID    string    `json:"transaction_id,omitempty"`
	ProcessedAt      time.Time `json:"processed_at" gorm:"not null"`
	EstimatedArrival time.Time `json:"estimated_arrival" gorm:"not null"`
	Notes            string    `json:"notes,omitempty"`
	CreatedAt        time.Time `json:"created_at" gorm:"autoCreateTime"`
	UpdatedAt        time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}

// RoyaltyRate taux de royalty par type de contenu
type RoyaltyRate struct {
	ID          uuid.UUID `json:"id" gorm:"type:uuid;primaryKey"`
	ContentType string    `json:"content_type" gorm:"uniqueIndex;not null"`
	Rate        float64   `json:"rate" gorm:"not null"`
	Description string    `json:"description,omitempty"`
	IsActive    bool      `json:"is_active" gorm:"not null;default:true"`
	CreatedAt   time.Time `json:"created_at" gorm:"autoCreateTime"`
	UpdatedAt   time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}

// CreatorRoyaltyRate taux de royalty personnalisé par créateur
type CreatorRoyaltyRate struct {
	ID        uuid.UUID `json:"id" gorm:"type:uuid;primaryKey"`
	CreatorID uuid.UUID `json:"creator_id" gorm:"type:uuid;not null;uniqueIndex"`
	Rate      float64   `json:"rate" gorm:"not null"`
	Reason    string    `json:"reason,omitempty"`
	IsActive  bool      `json:"is_active" gorm:"not null;default:true"`
	CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
	UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}

// RoyaltyConfig configuration des royalties
type RoyaltyConfig struct {
	ID                  uuid.UUID `json:"id" gorm:"type:uuid;primaryKey"`
	PlatformFeeRate     float64   `json:"platform_fee_rate" gorm:"not null;default:0.15"`
	MinimumPayoutAmount float64   `json:"minimum_payout_amount" gorm:"not null;default:50.0"`
	PayoutSchedule      string    `json:"payout_schedule" gorm:"not null;default:'monthly'"`
	ProcessingDelay     int       `json:"processing_delay" gorm:"not null;default:3"`
	Currency            string    `json:"currency" gorm:"not null;default:'EUR'"`
	IsActive            bool      `json:"is_active" gorm:"not null;default:true"`
	CreatedAt           time.Time `json:"created_at" gorm:"autoCreateTime"`
	UpdatedAt           time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}

// TableName spécifie le nom de la table pour RoyaltyRecord
func (RoyaltyRecord) TableName() string {
	return "royalty_records"
}

// TableName spécifie le nom de la table pour RoyaltyPayout
func (RoyaltyPayout) TableName() string {
	return "royalty_payouts"
}

// TableName spécifie le nom de la table pour RoyaltyRate
func (RoyaltyRate) TableName() string {
	return "royalty_rates"
}

// TableName spécifie le nom de la table pour CreatorRoyaltyRate
func (CreatorRoyaltyRate) TableName() string {
	return "creator_royalty_rates"
}

// TableName spécifie le nom de la table pour RoyaltyConfig
func (RoyaltyConfig) TableName() string {
	return "royalty_config"
}

// BeforeCreate hook GORM pour générer UUID si non défini
func (m *RoyaltyRecord) BeforeCreate(tx *gorm.DB) error {
	if m.ID == uuid.Nil {
		m.ID = uuid.New()
	}
	return nil
}

// BeforeCreate hook GORM pour générer UUID si non défini
func (m *RoyaltyPayout) BeforeCreate(tx *gorm.DB) error {
	if m.ID == uuid.Nil {
		m.ID = uuid.New()
	}
	return nil
}

// BeforeCreate hook GORM pour générer UUID si non défini
func (m *RoyaltyRate) BeforeCreate(tx *gorm.DB) error {
	if m.ID == uuid.Nil {
		m.ID = uuid.New()
	}
	return nil
}

// BeforeCreate hook GORM pour générer UUID si non défini
func (m *CreatorRoyaltyRate) BeforeCreate(tx *gorm.DB) error {
	if m.ID == uuid.Nil {
		m.ID = uuid.New()
	}
	return nil
}

// BeforeCreate hook GORM pour générer UUID si non défini
func (m *RoyaltyConfig) BeforeCreate(tx *gorm.DB) error {
	if m.ID == uuid.Nil {
		m.ID = uuid.New()
	}
	return nil
}
