package dto

import (
	"time"

	"github.com/google/uuid"
)

// ─── Checkout ────────────────────────────────────────────────────────────────

// CheckoutRequest is the payload for POST /api/client/billing/checkout
type CheckoutRequest struct {
	PackageID     uuid.UUID `json:"package_id" validate:"required"`
	DurationMonth int       `json:"duration_month" validate:"required,oneof=1 3 12"`
}

// CheckoutResponse is returned after a successful checkout
type CheckoutResponse struct {
	InvoiceID     uuid.UUID `json:"invoice_id"`
	InvoiceNumber string    `json:"invoice_number"`
	SnapToken     string    `json:"snap_token"`
	RedirectURL   string    `json:"redirect_url"`
	PaymentStatus string    `json:"payment_status"`
}

// ─── Invoice List ────────────────────────────────────────────────────────────

// InvoiceListRequest holds query params for GET /api/client/billing/invoices
type InvoiceListRequest struct {
	Page   int    `query:"page"`
	Limit  int    `query:"limit"`
	Status string `query:"status"`
}

// InvoiceListItem is a summary row for the billing history
type InvoiceListItem struct {
	ID            uuid.UUID `json:"id"`
	InvoiceNumber string    `json:"invoice_number"`
	Status        string    `json:"status"`
	Total         float64   `json:"total"`
	ItemName      string    `json:"item_name"`
	Quantity      int       `json:"quantity"`
	Price         float64   `json:"price"`
	Description   string    `json:"description"`
	CreatedAt     time.Time `json:"created_at"`
}

// InvoiceListResponse wraps the paginated invoice list
type InvoiceListResponse struct {
	Invoices []InvoiceListItem `json:"invoices"`
}

// ─── Invoice Detail ──────────────────────────────────────────────────────────

// InvoiceDetailResponse is the full invoice with items + payment + subscription
type InvoiceDetailResponse struct {
	ID               uuid.UUID        `json:"id"`
	InvoiceNumber    string           `json:"invoice_number"`
	Status           string           `json:"status"`
	SubtotalAmount   float64          `json:"subtotal_amount"`
	TaxAmount        float64          `json:"tax_amount"`
	GrandTotalAmount float64          `json:"grand_total_amount"`
	CreatedAt        time.Time        `json:"created_at"`
	Items            []InvoiceItemDTO `json:"items"`
	Payment          *PaymentDTO      `json:"payment"`
	Subscription     *SubscriptionDTO `json:"subscription,omitempty"`
}

type InvoiceItemDTO struct {
	ID          uuid.UUID `json:"id"`
	ItemName    string    `json:"item_name"`
	Quantity    int       `json:"quantity"`
	Price       float64   `json:"price"`
	Description string    `json:"description"`
}

type PaymentDTO struct {
	ID            uuid.UUID  `json:"id"`
	OrderID       string     `json:"order_id"`
	Amount        float64    `json:"amount"`
	PaymentMethod *string    `json:"payment_method"`
	Status        string     `json:"status"`
	PaidAt        *time.Time `json:"paid_at"`
}

type SubscriptionDTO struct {
	ID          uuid.UUID `json:"id"`
	PackageName string    `json:"package_name"`
	Status      string    `json:"status"`
	StartDate   time.Time `json:"start_date"`
	EndDate     time.Time `json:"end_date"`
}

// ─── Active Subscription ─────────────────────────────────────────────────────

// ActiveSubscriptionResponse for GET /api/client/billing/subscription
type ActiveSubscriptionResponse struct {
	PackageName     string    `json:"package_name"`
	Status          string    `json:"status"`
	StartAt         time.Time `json:"start_at"`
	EndAt           time.Time `json:"end_at"`
	RemainingQuota  int       `json:"remaining_quota"`
	TotalQuota      int       `json:"total_quota"`
	UsedQuota       int       `json:"used_quota"`
	PricePerMonth   float64   `json:"price_per_month"`
	PackageFeatures []string  `json:"package_features"`
}

// ─── Public Packages ─────────────────────────────────────────────────────────

// PublicPackageResponse for GET /api/public/packages
type PublicPackageResponse struct {
	ID             uuid.UUID `json:"id"`
	Name           string    `json:"name"`
	Price          float64   `json:"price"`
	LimitCandidate int       `json:"limit_candidate"`
	PeriodType     string    `json:"period_type"`
	Features       []string  `json:"features"`
}

// ─── Midtrans Webhook ────────────────────────────────────────────────────────

// MidtransNotification represents the webhook payload from Midtrans
type MidtransNotification struct {
	TransactionTime   string `json:"transaction_time"`
	TransactionStatus string `json:"transaction_status"`
	TransactionID     string `json:"transaction_id"`
	StatusMessage     string `json:"status_message"`
	StatusCode        string `json:"status_code"`
	SignatureKey      string `json:"signature_key"`
	PaymentType       string `json:"payment_type"`
	OrderID           string `json:"order_id"`
	MerchantID        string `json:"merchant_id"`
	GrossAmount       string `json:"gross_amount"`
	FraudStatus       string `json:"fraud_status"`
	Currency          string `json:"currency"`
}

// ─── Retry Payment ───────────────────────────────────────────────────────────

// RetryPaymentRequest for regenerating snap token on pending invoices
type RetryPaymentRequest struct {
	InvoiceID uuid.UUID `json:"invoice_id" validate:"required"`
}

// RetryPaymentResponse returns a new snap token
type RetryPaymentResponse struct {
	InvoiceID     uuid.UUID `json:"invoice_id"`
	InvoiceNumber string    `json:"invoice_number"`
	SnapToken     string    `json:"snap_token"`
	RedirectURL   string    `json:"redirect_url"`
}
