package models

import (
	"time"
)

// Asset represents the assets table
type Asset struct {
	ID              uint       `gorm:"primaryKey;autoIncrement" json:"id"`
	AssetCode       string     `gorm:"size:20;not null;unique;index" json:"asset_code"`
	Name            string     `gorm:"size:255;not null" json:"name"`
	Subtitle        string     `gorm:"type:text" json:"subtitle"`
	Description     string     `gorm:"type:text" json:"description"`
	TokenSymbol     string     `gorm:"size:20" json:"token_symbol"`
	Decimals        int        `gorm:"default:18" json:"decimals"`
	ChainID         int        `gorm:"default:97" json:"chain_id"`
	ContractAddress string     `gorm:"size:42" json:"contract_address"`
	DeployBlock     *uint64    `json:"deploy_block"`
	Category        string     `gorm:"size:100" json:"category"`
	CategoryColor       string     `gorm:"size:50" json:"category_color"`
	IconURL             string     `gorm:"type:text" json:"icon_url"`
	UnderlyingAssets    string     `gorm:"size:255" json:"underlying_assets"`
	TargetAPY           float64    `gorm:"type:decimal(10,2)" json:"target_apy"`
	PoolCapUSD          float64    `gorm:"type:decimal(30,2)" json:"pool_cap_usd"`
	RiskLevel           int        `json:"risk_level"`
	RiskLabel           string     `gorm:"size:50" json:"risk_label"`
	TokenRole           string     `gorm:"size:20;default:'product'" json:"token_role"`
	IsActive            bool       `gorm:"default:true" json:"is_active"`
	IsFeatured          bool       `gorm:"default:false" json:"is_featured"`
	CreatedAt           time.Time  `json:"created_at"`
	UpdatedAt           time.Time  `json:"updated_at"`
}

func (Asset) TableName() string {
	return "assets"
}

// AssetPerformance represents the asset_performance table
type AssetPerformance struct {
	ID                  uint      `gorm:"primaryKey;autoIncrement" json:"id"`
	AssetID             uint      `gorm:"not null;index" json:"asset_id"`
	CurrentAPY          float64   `gorm:"type:decimal(10,2)" json:"current_apy"`
	TVLUSD              float64   `gorm:"type:decimal(30,2)" json:"tvl_usd"`
	TotalInvestedUSD    float64   `gorm:"type:decimal(30,2)" json:"total_invested_usd"`
	InvestorCount       int       `gorm:"default:0" json:"investor_count"`
	CumulativeYieldUSD  float64   `gorm:"type:decimal(30,2)" json:"cumulative_yield_usd"`
	Yield24hUSD         float64   `gorm:"type:decimal(30,2)" json:"yield_24h_usd"`
	PoolCapacityPercent float64   `gorm:"type:decimal(10,4)" json:"pool_capacity_percent"`
	CirculatingSupply   float64   `gorm:"type:decimal(30,18)" json:"circulating_supply"`
	YTPrice             float64   `gorm:"column:yt_price;type:decimal(30,18);default:0" json:"yt_price"`
	Volume24hUSD        float64   `gorm:"column:volume_24h_usd;type:decimal(30,2);default:0" json:"volume_24h_usd"`
	SnapshotDate        time.Time `gorm:"not null" json:"snapshot_date"`
	CreatedAt           time.Time `json:"created_at"`
}

func (AssetPerformance) TableName() string {
	return "asset_performance"
}



// ProductResponse is the response format for fund market products
type ProductResponse struct {
	ID                  int     `json:"id"`
	Name                string  `json:"name"`
	TokenSymbol         string  `json:"tokenSymbol"`
	Decimals            int     `json:"decimals"`
	ContractAddress     string  `json:"contractAddress"`
	ChainID             int     `json:"chainId"`
	TokenRole           string  `json:"token_role"`
	Category            string  `json:"category"`
	CategoryColor       string  `json:"categoryColor"`
	IconURL             string  `json:"iconUrl"`
	YieldAPY            string  `json:"yieldAPY"`
	PoolCap             string  `json:"poolCap"`
	Risk                string  `json:"risk"`
	RiskLevel           int     `json:"riskLevel"`
	CirculatingSupply   string  `json:"circulatingSupply"`
	PoolCapacityPercent float64 `json:"poolCapacityPercent"`
}

// StatsResponse is the response format for fund market stats
type StatsResponse struct {
	Label      string `json:"label"`
	Value      string `json:"value"`
	Change     string `json:"change"`
	IsPositive bool   `json:"isPositive"`
}

// AssetCustody represents the asset_custody table
type AssetCustody struct {
	ID               uint      `gorm:"primaryKey;autoIncrement" json:"id"`
	AssetID          uint      `gorm:"not null;index" json:"asset_id"`
	CustodianName    string    `gorm:"size:255" json:"custodian_name"`
	CustodianAddress string    `gorm:"type:text" json:"custodian_address"`
	CustodianLicense string    `gorm:"size:255" json:"custodian_license"`
	CustodyType      string    `gorm:"size:100" json:"custody_type"`
	CustodyLocation  string    `gorm:"size:255" json:"custody_location"`
	AuditorName      string    `gorm:"size:255" json:"auditor_name"`
	LastAuditDate    NullTime   `json:"last_audit_date"`
	AuditReportURL   string    `gorm:"type:text" json:"audit_report_url"`
	AdditionalInfo   string    `gorm:"type:json" json:"additional_info"`
	CreatedAt        time.Time `json:"created_at"`
	UpdatedAt        time.Time `json:"updated_at"`
}

func (AssetCustody) TableName() string {
	return "asset_custody"
}

// AssetAuditReport represents the asset_audit_reports table
type AssetAuditReport struct {
	ID           uint      `gorm:"primaryKey;autoIncrement" json:"id"`
	AssetID      uint      `gorm:"not null;index" json:"asset_id"`
	ReportType   string    `gorm:"size:50;not null" json:"report_type"`
	ReportTitle  string    `gorm:"size:255;not null" json:"report_title"`
	ReportDate   time.Time `gorm:"not null" json:"report_date"`
	ReportURL    string    `gorm:"type:text" json:"report_url"`
	AuditorName  string    `gorm:"size:255" json:"auditor_name"`
	Summary      string    `gorm:"type:text" json:"summary"`
	IsActive     bool      `gorm:"default:true" json:"is_active"`
	DisplayOrder int       `gorm:"default:0" json:"display_order"`
	CreatedAt    time.Time `json:"created_at"`
	UpdatedAt    time.Time `json:"updated_at"`
}

func (AssetAuditReport) TableName() string {
	return "asset_audit_reports"
}

// ProductDetailResponse is the detailed response for a single product
type ProductDetailResponse struct {
	// Basic Info
	ID                  int     `json:"id"`
	AssetCode           string  `json:"assetCode"`
	Name                string  `json:"name"`
	Subtitle            string  `json:"subtitle"`
	Description         string  `json:"description"`
	TokenSymbol         string  `json:"tokenSymbol"`
	Decimals            int     `json:"decimals"`

	// Investment Parameters
	UnderlyingAssets    string  `json:"underlyingAssets"`
	PoolCapUSD          float64 `json:"poolCapUsd"`
	RiskLevel           int     `json:"riskLevel"`
	RiskLabel           string  `json:"riskLabel"`
	TargetAPY           float64 `json:"targetApy"`

	// Contract Info
	ContractAddress string `json:"contractAddress"`
	ChainID         int    `json:"chainId"`

	// Display Info
	Category            string  `json:"category"`
	CategoryColor       string  `json:"categoryColor"`
	IconURL             string  `json:"iconUrl"`

	// Performance Data (from blockchain/database)
	CurrentAPY          float64 `json:"currentApy"`
	TVLUSD              float64 `json:"tvlUsd"`
	Volume24hUSD        float64 `json:"volume24hUsd"`
	VolumeChangeVsAvg   float64 `json:"volumeChangeVsAvg"`
	CirculatingSupply   float64 `json:"circulatingSupply"`
	PoolCapacityPercent float64 `json:"poolCapacityPercent"`
	CurrentPrice        float64 `json:"currentPrice"` // e.g., 1.04 USDC per token

	// Custody Info
	Custody             *CustodyInfo `json:"custody,omitempty"`

	// Audit Reports
	AuditReports        []AuditReportInfo `json:"auditReports"`

	// Product Links
	ProductLinks        []ProductLinkInfo `json:"productLinks"`
}

// ProductLinkInfo represents a single product link item
type ProductLinkInfo struct {
	LinkText     string `json:"linkText"`
	LinkURL      string `json:"linkUrl"`
	Description  string `json:"description"`
	DisplayArea  string `json:"displayArea"`
	DisplayOrder int    `json:"displayOrder"`
}

// CustodyInfo represents custody information
type CustodyInfo struct {
	CustodianName    string                 `json:"custodianName"`
	CustodyType      string                 `json:"custodyType"`
	CustodyLocation  string                 `json:"custodyLocation"`
	AuditorName      string                 `json:"auditorName"`
	LastAuditDate    string                 `json:"lastAuditDate"`
	AuditReportURL   string                 `json:"auditReportUrl,omitempty"`
	AdditionalInfo   map[string]interface{} `json:"additionalInfo,omitempty"`
}

// AuditReportInfo represents audit report information
type AuditReportInfo struct {
	ReportType  string `json:"reportType"`
	ReportTitle string `json:"reportTitle"`
	ReportDate  string `json:"reportDate"`
	AuditorName string `json:"auditorName"`
	Summary     string `json:"summary"`
	ReportURL   string `json:"reportUrl"`
}
