package domain

import (
	"database/sql/driver"
	"fmt"
	"time"
)

type ReferralStatus string

const (
	ReferralPending   ReferralStatus = "PENDING"
	ReferralCompleted ReferralStatus = "COMPLETED"
	ReferralExpired   ReferralStatus = "EXPIRED"
	ReferralCancelled ReferralStatus = "CANCELLED"
)

func (rs *ReferralStatus) Scan(src interface{}) error {
	switch s := src.(type) {
	case []byte:
		*rs = ReferralStatus(s)
	case string:
		*rs = ReferralStatus(s)
	default:
		return fmt.Errorf("unsupported scan type for ReferralStatus: %T", src)
	}
	return nil
}

func (rs ReferralStatus) Value() (driver.Value, error) {
	return string(rs), nil
}

type ReferralStats struct {
	TotalReferrals     int
	CompletedReferrals int
	TotalRewardEarned  float64
	PendingRewards     float64
}

type ReferralSettings struct {
	ID                         int64
	ReferralRewardAmount       float64
	CashbackPercentage         float64
	BetReferralBonusPercentage float64
	MaxReferrals               int32
	ExpiresAfterDays           int32
	UpdatedBy                  string
	CreatedAt                  time.Time
	UpdatedAt                  time.Time
	Version                    int32
}

type Referral struct {
	ID             int64
	ReferralCode   string
	ReferrerID     string
	ReferredID     *string
	Status         ReferralStatus
	RewardAmount   float64
	CashbackAmount float64
	CreatedAt      time.Time
	UpdatedAt      time.Time
	ExpiresAt      time.Time
}
