package domain

import "time"

type ReportTimeFrame string

const (
	Daily   ReportTimeFrame = "daily"
	Weekly  ReportTimeFrame = "weekly"
	Monthly ReportTimeFrame = "monthly"
)

type ReportFrequency string

const (
	ReportDaily   ReportFrequency = "daily"
	ReportWeekly  ReportFrequency = "weekly"
	ReportMonthly ReportFrequency = "monthly"
)

type PaginatedFileResponse struct {
	Response   `json:",inline"`
	Data       []string   `json:"data"`
	Pagination Pagination `json:"pagination"`
}

// type ReportRequest struct {
// 	Frequency ReportFrequency
// 	StartDate time.Time
// 	EndDate   time.Time
// }

// type ReportData struct {
// 	TotalBets        int64
// 	TotalCashIn      float64
// 	TotalCashOut     float64
// 	CashBacks        float64
// 	Withdrawals      float64
// 	Deposits         float64
// 	TotalTickets     int64
// 	VirtualGameStats []VirtualGameStat
// 	CompanyReports   []CompanyStat
// 	BranchReports    []BranchStats
// }

type VirtualGameStat struct {
	GameName         string
	NumBets          int64
	TotalTransaction float64
}

type Report struct {
	ID            string
	TimeFrame     ReportTimeFrame
	PeriodStart   time.Time
	PeriodEnd     time.Time
	TotalBets     int
	TotalCashIn   float64
	TotalCashOut  float64
	TotalCashBack float64
	GeneratedAt   time.Time
}

type LiveMetric struct {
	TotalCashSportsbook float64
	TotalCashSportGames float64
	TotalLiveTickets    int64
	TotalUnsettledCash  float64
	TotalGames          int64
}

type MetricUpdates struct {
	TotalCashSportsbookDelta *float64
	TotalCashSportGamesDelta *float64
	TotalLiveTicketsDelta    *int64
	TotalUnsettledCashDelta  *float64
	TotalGamesDelta          *int64
}

type DashboardSummary struct {
	TotalStakes      Currency `json:"total_stakes"`
	TotalBets        int64    `json:"total_bets"`
	ActiveBets       int64    `json:"active_bets"`
	WinBalance       Currency `json:"win_balance"`
	TotalWins        int64    `json:"total_wins"`
	TotalLosses      int64    `json:"total_losses"`
	CustomerCount    int64    `json:"customer_count"`
	Profit           Currency `json:"profit"`
	WinRate          float64  `json:"win_rate"`
	AverageStake     Currency `json:"average_stake"`
	TotalDeposits    Currency `json:"total_deposits"`
	TotalWithdrawals Currency `json:"total_withdrawals"`
	ActiveCustomers  int64    `json:"active_customers"`
	BranchesCount    int64    `json:"branches_count"`
	ActiveBranches   int64    `json:"active_branches"`

	TotalCashiers    int64 `json:"total_cashiers"`
	ActiveCashiers   int64 `json:"active_cashiers"`
	InactiveCashiers int64 `json:"inactive_cashiers"`

	TotalWallets  int64 `json:"total_wallets"`
	TotalGames    int64 `json:"total_games"`
	ActiveGames   int64 `json:"active_games"`
	InactiveGames int64 `json:"inactive_games"`

	TotalManagers    int64 `json:"total_managers"`
	ActiveManagers   int64 `json:"active_managers"`
	InactiveManagers int64 `json:"inactive_managers"`
	InactiveBranches int64 `json:"inactive_branches"`

	TotalAdmins    int64 `json:"total_admins"`
	ActiveAdmins   int64 `json:"active_admins"`
	InactiveAdmins int64 `json:"inactive_admins"`

	TotalCompanies    int64 `json:"total_companies"`
	ActiveCompanies   int64 `json:"active_companies"`
	InactiveCompanies int64 `json:"inactive_companies"`

	InactiveCustomers int64 `json:"inactive_customers"`

	TotalNotifications  int64 `json:"total_notifications"`
	ReadNotifications   int64 `json:"read_notifications"`
	UnreadNotifications int64 `json:"unread_notifications"`
}
type DashboardSummaryRes struct {
	TotalStakes      float32 `json:"total_stakes"`
	TotalBets        int64   `json:"total_bets"`
	ActiveBets       int64   `json:"active_bets"`
	WinBalance       float32 `json:"win_balance"`
	TotalWins        int64   `json:"total_wins"`
	TotalLosses      int64   `json:"total_losses"`
	CustomerCount    int64   `json:"customer_count"`
	Profit           float32 `json:"profit"`
	WinRate          float64 `json:"win_rate"`
	AverageStake     float32 `json:"average_stake"`
	TotalDeposits    float32 `json:"total_deposits"`
	TotalWithdrawals float32 `json:"total_withdrawals"`
	ActiveCustomers  int64   `json:"active_customers"`
	BranchesCount    int64   `json:"branches_count"`
	ActiveBranches   int64   `json:"active_branches"`

	TotalCashiers    int64 `json:"total_cashiers"`
	ActiveCashiers   int64 `json:"active_cashiers"`
	InactiveCashiers int64 `json:"inactive_cashiers"`

	TotalWallets  int64 `json:"total_wallets"`
	TotalGames    int64 `json:"total_games"`
	ActiveGames   int64 `json:"active_games"`
	InactiveGames int64 `json:"inactive_games"`

	TotalManagers    int64 `json:"total_managers"`
	ActiveManagers   int64 `json:"active_managers"`
	InactiveManagers int64 `json:"inactive_managers"`
	InactiveBranches int64 `json:"inactive_branches"`

	TotalAdmins    int64 `json:"total_admins"`
	ActiveAdmins   int64 `json:"active_admins"`
	InactiveAdmins int64 `json:"inactive_admins"`

	TotalCompanies    int64 `json:"total_companies"`
	ActiveCompanies   int64 `json:"active_companies"`
	InactiveCompanies int64 `json:"inactive_companies"`

	InactiveCustomers int64 `json:"inactive_customers"`

	TotalNotifications  int64 `json:"total_notifications"`
	ReadNotifications   int64 `json:"read_notifications"`
	UnreadNotifications int64 `json:"unread_notifications"`
}

func ConvertDashboardSummaryToRes(summary DashboardSummary) DashboardSummaryRes {
	return DashboardSummaryRes{
		TotalStakes:      summary.TotalStakes.Float32(),
		TotalBets:        summary.TotalBets,
		ActiveBets:       summary.ActiveBets,
		WinBalance:       summary.WinBalance.Float32(),
		TotalWins:        summary.TotalWins,
		TotalLosses:      summary.TotalLosses,
		CustomerCount:    summary.CustomerCount,
		Profit:           summary.Profit.Float32(),
		WinRate:          summary.WinRate,
		AverageStake:     summary.AverageStake.Float32(),
		TotalDeposits:    summary.TotalDeposits.Float32(),
		TotalWithdrawals: summary.TotalWithdrawals.Float32(),
		ActiveCustomers:  summary.ActiveCustomers,
		BranchesCount:    summary.BranchesCount,
		ActiveBranches:   summary.ActiveBranches,

		TotalCashiers:    summary.TotalCashiers,
		ActiveCashiers:   summary.ActiveCashiers,
		InactiveCashiers: summary.InactiveCashiers,

		// TotalWallets:  summary.TotalWallets,
		// TotalGames:    summary.TotalGames,
		// ActiveGames:   summary.ActiveGames,
		// InactiveGames: summary.InactiveGames,

		TotalManagers:    summary.TotalManagers,
		ActiveManagers:   summary.ActiveManagers,
		InactiveManagers: summary.InactiveManagers,
		InactiveBranches: summary.InactiveBranches,

		TotalAdmins:    summary.TotalAdmins,
		ActiveAdmins:   summary.ActiveAdmins,
		InactiveAdmins: summary.InactiveAdmins,

		TotalCompanies:    summary.TotalCompanies,
		ActiveCompanies:   summary.ActiveCompanies,
		InactiveCompanies: summary.InactiveCompanies,

		InactiveCustomers: summary.InactiveCustomers,

		TotalNotifications:  summary.TotalNotifications,
		ReadNotifications:   summary.ReadNotifications,
		UnreadNotifications: summary.UnreadNotifications,
	}

}

type CustomerActivity struct {
	CustomerID     int64     `json:"customer_id"`
	CustomerName   string    `json:"customer_name"`
	TotalBets      int64     `json:"total_bets"`
	TotalStakes    Currency  `json:"total_stakes"`
	TotalWins      int64     `json:"total_wins"`
	TotalPayouts   Currency  `json:"total_payouts"`
	Profit         Currency  `json:"profit"`
	FirstBetDate   time.Time `json:"first_bet_date"`
	LastBetDate    time.Time `json:"last_bet_date"`
	FavoriteSport  string    `json:"favorite_sport"`
	FavoriteMarket string    `json:"favorite_market"`
	AverageStake   Currency  `json:"average_stake"`
	AverageOdds    float64   `json:"average_odds"`
	WinRate        float64   `json:"win_rate"`
	ActivityLevel  string    `json:"activity_level"` // High, Medium, Low
}

type BranchPerformance struct {
	BranchID         int64    `json:"branch_id"`
	BranchName       string   `json:"branch_name"`
	Location         string   `json:"location"`
	ManagerName      string   `json:"manager_name"`
	TotalBets        int64    `json:"total_bets"`
	TotalStakes      Currency `json:"total_stakes"`
	TotalWins        int64    `json:"total_wins"`
	TotalPayouts     Currency `json:"total_payouts"`
	Profit           Currency `json:"profit"`
	CustomerCount    int64    `json:"customer_count"`
	Deposits         Currency `json:"deposits"`
	Withdrawals      Currency `json:"withdrawals"`
	WinRate          float64  `json:"win_rate"`
	AverageStake     Currency `json:"average_stake"`
	PerformanceScore float64  `json:"performance_score"`
}

// type SportPerformance struct {
// 	SportID           string   `json:"sport_id"`
// 	SportName         string   `json:"sport_name"`
// 	TotalBets         int64    `json:"total_bets"`
// 	TotalStakes       Currency `json:"total_stakes"`
// 	TotalWins         int64    `json:"total_wins"`
// 	TotalPayouts      Currency `json:"total_payouts"`
// 	Profit            Currency `json:"profit"`
// 	PopularityRank    int      `json:"popularity_rank"`
// 	WinRate           float64  `json:"win_rate"`
// 	AverageStake      Currency `json:"average_stake"`
// 	AverageOdds       float64  `json:"average_odds"`
// 	MostPopularMarket string   `json:"most_popular_market"`
// }

// type BetAnalysis struct {
// 	Date              time.Time `json:"date"`
// 	TotalBets         int64     `json:"total_bets"`
// 	TotalStakes       Currency  `json:"total_stakes"`
// 	TotalWins         int64     `json:"total_wins"`
// 	TotalPayouts      Currency  `json:"total_payouts"`
// 	Profit            Currency  `json:"profit"`
// 	MostPopularSport  string    `json:"most_popular_sport"`
// 	MostPopularMarket string    `json:"most_popular_market"`
// 	HighestStake      Currency  `json:"highest_stake"`
// 	HighestPayout     Currency  `json:"highest_payout"`
// 	AverageOdds       float64   `json:"average_odds"`
// }

// ReportFilter contains filters for report generation
type ReportFilter struct {
	StartTime   ValidTime   `json:"start_time"`
	EndTime     ValidTime   `json:"end_time"`
	CompanyID   ValidInt64  `json:"company_id"`
	BranchID    ValidInt64  `json:"branch_id"`
	RecipientID ValidInt64  `json:"recipient_id"`
	UserID      ValidInt64  `json:"user_id"`
	SportID     ValidString `json:"sport_id"`
	Status      string      `json:"status"`
}

// BetStat represents aggregated bet statistics
type BetStat struct {
	Date         time.Time
	TotalBets    int64
	TotalStakes  Currency
	TotalWins    int64
	TotalPayouts Currency
	AverageOdds  float64
}

// ExtremeValues represents extreme values in betting
type ExtremeValues struct {
	HighestStake  Currency
	HighestPayout Currency
}

// CustomerBetActivity represents customer betting activity
type CustomerBetActivity struct {
	CustomerID   int64
	TotalBets    int64
	TotalStakes  Currency
	TotalWins    int64
	TotalPayouts Currency
	FirstBetDate time.Time
	LastBetDate  time.Time
	AverageOdds  float64
}

// BranchBetActivity represents branch betting activity
type BranchBetActivity struct {
	BranchID     int64
	TotalBets    int64
	TotalStakes  Currency
	TotalWins    int64
	TotalPayouts Currency
}

// BranchDetail represents branch details
// type BranchDetail struct {
// 	Name        string
// 	Location    string
// 	ManagerName string
// }

// BranchTransactions represents branch transaction totals
type BranchTransactions struct {
	Deposits    Currency
	Withdrawals Currency
}

// SportBetActivity represents sport betting activity
type SportBetActivity struct {
	SportID      string
	TotalBets    int64
	TotalStakes  Currency
	TotalWins    int64
	TotalPayouts Currency
	AverageOdds  float64
}

// CustomerDetail represents customer details
type CustomerDetail struct {
	Name string
}

// BalanceSummary represents wallet balance summary
type BalanceSummary struct {
	TotalBalance       Currency
	ActiveBalance      Currency
	InactiveBalance    Currency
	BettableBalance    Currency
	NonBettableBalance Currency
}

// In your domain package
type CustomerPreferences struct {
	FavoriteSport  string `json:"favorite_sport"`
	FavoriteMarket string `json:"favorite_market"`
}

// type DashboardSummary struct {
// 	TotalStakes      Currency `json:"total_stakes"`
// 	TotalBets        int64    `json:"total_bets"`
// 	ActiveBets       int64    `json:"active_bets"`
// 	WinBalance       Currency `json:"win_balance"`
// 	TotalWins        int64    `json:"total_wins"`
// 	TotalLosses      int64    `json:"total_losses"`
// 	CustomerCount    int64    `json:"customer_count"`
// 	Profit           Currency `json:"profit"`
// 	WinRate          float64  `json:"win_rate"`
// 	AverageStake     Currency `json:"average_stake"`
// 	TotalDeposits    Currency `json:"total_deposits"`
// 	TotalWithdrawals Currency `json:"total_withdrawals"`
// 	ActiveCustomers  int64    `json:"active_customers"`
// 	BranchesCount    int64    `json:"branches_count"`
// 	ActiveBranches   int64    `json:"active_branches"`
// }

type ErrorResponse struct {
	Message string `json:"message"`
	Error   string `json:"error,omitempty"`
}

type NotificationReport struct {
	CountsByType     []NotificationTypeCount       `json:"counts_by_type"`
	DeliveryStats    NotificationDeliveryStats     `json:"delivery_stats"`
	ActiveRecipients []ActiveNotificationRecipient `json:"active_recipients"`
}

type NotificationTypeCount struct {
	Type   string `json:"type"`
	Total  int64  `json:"total"`
	Read   int64  `json:"read"`
	Unread int64  `json:"unread"`
}

type NotificationDeliveryStats struct {
	TotalSent        int64   `json:"total_sent"`
	FailedDeliveries int64   `json:"failed_deliveries"`
	SuccessRate      float64 `json:"success_rate"`
	MostUsedChannel  string  `json:"most_used_channel"`
}

type ActiveNotificationRecipient struct {
	RecipientID          int64     `json:"recipient_id"`
	RecipientName        string    `json:"recipient_name"`
	NotificationCount    int64     `json:"notification_count"`
	LastNotificationTime time.Time `json:"last_notification_time"`
}

type CompanyPerformance struct {
	CompanyID      int64     `json:"company_id"`
	CompanyName    string    `json:"company_name"`
	ContactEmail   string    `json:"contact_email"`
	TotalBets      int64     `json:"total_bets"`
	TotalStakes    Currency  `json:"total_stakes"`
	TotalWins      int64     `json:"total_wins"`
	TotalPayouts   Currency  `json:"total_payouts"`
	Profit         Currency  `json:"profit"`
	WinRate        float64   `json:"win_rate"`
	AverageStake   Currency  `json:"average_stake"`
	TotalBranches  int64     `json:"total_branches"`
	ActiveBranches int64     `json:"active_branches"`
	TotalCashiers  int64     `json:"total_cashiers"`
	ActiveCashiers int64     `json:"active_cashiers"`
	WalletBalance  Currency  `json:"wallet_balance"`
	LastActivity   time.Time `json:"last_activity"`
}

type CashierPerformance struct {
	CashierID            int64     `json:"cashier_id"`
	CashierName          string    `json:"cashier_name"`
	BranchID             int64     `json:"branch_id"`
	BranchName           string    `json:"branch_name"`
	CompanyID            int64     `json:"company_id"`
	TotalBets            int64     `json:"total_bets"`
	TotalStakes          Currency  `json:"total_stakes"`
	TotalWins            int64     `json:"total_wins"`
	TotalPayouts         Currency  `json:"total_payouts"`
	Profit               Currency  `json:"profit"`
	WinRate              float64   `json:"win_rate"`
	AverageStake         Currency  `json:"average_stake"`
	Deposits             Currency  `json:"deposits"`
	Withdrawals          Currency  `json:"withdrawals"`
	NetTransactionAmount Currency  `json:"net_transaction_amount"`
	FirstActivity        time.Time `json:"first_activity"`
	LastActivity         time.Time `json:"last_activity"`
	ActiveDays           int       `json:"active_days"`
}

// type CompanyWalletBalance struct {
// 	CompanyID   int64   `json:"company_id"`
// 	CompanyName string  `json:"company_name"`
// 	Balance     float64 `json:"balance"`
// }

// type BranchWalletBalance struct {
// 	BranchID   int64   `json:"branch_id"`
// 	BranchName string  `json:"branch_name"`
// 	CompanyID  int64   `json:"company_id"`
// 	Balance    float64 `json:"balance"`
// }

// type LiveWalletMetrics struct {
// 	Timestamp       time.Time              `json:"timestamp"`
// 	CompanyBalances []CompanyWalletBalance `json:"company_balances"`
// 	BranchBalances  []BranchWalletBalance  `json:"branch_balances"`
// }

// type CompanyReport struct {
// 	CompanyID int64
// 	Branches  []BranchReport
// }

// type BranchReport struct {
// 	BranchID int64
// 	Rows     []interface{} // replace with the actual row type, e.g., dbgen.GetWalletTransactionsInRangeRow
// }
