package order

import (
	"time"

	"hfb_sys/backend/internal/auditlog"

	"gorm.io/datatypes"
)

type OrderDTO struct {
	ID                     uint64         `json:"id"`
	OrderNo                string         `json:"order_no"`
	ListingID              uint64         `json:"listing_id"`
	AccountID              uint64         `json:"account_id"`
	OwnerID                uint64         `json:"owner_id"`
	RenterID               uint64         `json:"renter_id"`
	OwnerPhone             string         `json:"owner_phone,omitempty"`
	RenterPhone            string         `json:"renter_phone,omitempty"`
	Title                  string         `json:"title"`
	ServerRegion           string         `json:"server_region"`
	LoginPlatform          string         `json:"login_platform"`
	RentedAt               *time.Time     `json:"rented_at"`
	EstimatedDurationHours int            `json:"estimated_duration_hours"`
	PriceRole              string         `json:"price_role,omitempty"`
	DisplayAmount          float64        `json:"display_amount"`
	RentAmount             *float64       `json:"rent_amount,omitempty"`
	OwnerRentAmount        *float64       `json:"owner_rent_amount,omitempty"`
	DepositAmount          float64        `json:"deposit_amount"`
	PlatformFee            *float64       `json:"platform_fee,omitempty"`
	AccountSnapshot        datatypes.JSON `json:"account_snapshot"`
	Status                 string         `json:"status"`
	HandoffStatus          string         `json:"handoff_status"`
	SettlementStatus       string         `json:"settlement_status"`
	Checkout               *CheckoutDTO   `json:"checkout,omitempty"`
	CreatedAt              time.Time      `json:"created_at"`
	UpdatedAt              time.Time      `json:"updated_at"`
}

type CreateRequest struct {
	ListingID uint64 `json:"listing_id" binding:"required"`
}

type SubmitHandoffRequest struct {
	Content string `json:"content" binding:"required"`
}

type SubmitReturnRequest struct {
	Content string `json:"content" binding:"required"`
}

type SubmitCheckoutRequest struct {
	Content          string   `json:"content" binding:"required"`
	ConsumableAmount float64  `json:"consumable_amount"`
	CoinConsumedM    float64  `json:"coin_consumed_m"`
	OtherAmount      float64  `json:"other_amount"`
	EvidenceURLS     []string `json:"evidence_urls"`
}

type CounterCheckoutRequest struct {
	ConsumableAmount    float64  `json:"consumable_amount"`
	CoinConsumedM       float64  `json:"coin_consumed_m"`
	OtherAmount         float64  `json:"other_amount"`
	DepositDeductAmount float64  `json:"deposit_deduct_amount"`
	Reason              string   `json:"reason" binding:"required"`
	EvidenceURLS        []string `json:"evidence_urls"`
}

type AdminActionRequest struct {
	Reason string `json:"reason" binding:"required"`
}

type AuditMeta = auditlog.Meta

type RefundStatusDTO struct {
	OrderID         uint64     `json:"order_id"`
	OrderNo         string     `json:"order_no"`
	RefundStatus    string     `json:"refund_status"`
	RefundAmountCent int64    `json:"refund_amount_cent"`
	RefundedAt      *time.Time `json:"refunded_at,omitempty"`
	TotalAmount     float64    `json:"total_amount"`
}

type HandoffRecordDTO struct {
	ID                  uint64     `json:"id"`
	OrderID             uint64     `json:"order_id"`
	FromUserID          uint64     `json:"from_user_id"`
	ToUserID            uint64     `json:"to_user_id"`
	Type                string     `json:"type"`
	Content             string     `json:"content"`
	ConfirmedByRenterAt *time.Time `json:"confirmed_by_renter_at"`
	ConfirmedByOwnerAt  *time.Time `json:"confirmed_by_owner_at"`
	CreatedAt           time.Time  `json:"created_at"`
}

type CheckoutDTO struct {
	ID                    uint64     `json:"id"`
	OrderID               uint64     `json:"order_id"`
	InitiatedBy           uint64     `json:"initiated_by"`
	Status                string     `json:"status"`
	PriceRole             string     `json:"price_role,omitempty"`
	DisplayAmount         float64    `json:"display_amount"`
	RentAmount            *float64   `json:"rent_amount,omitempty"`
	OwnerRentAmount       *float64   `json:"owner_rent_amount,omitempty"`
	PlatformFee           *float64   `json:"platform_fee,omitempty"`
	DepositAmount         float64    `json:"deposit_amount"`
	ConsumableAmount      float64    `json:"consumable_amount"`
	CoinConsumedM         float64    `json:"coin_consumed_m"`
	OtherAmount           float64    `json:"other_amount"`
	DepositDeductAmount   float64    `json:"deposit_deduct_amount"`
	RenterRefundAmount    *float64   `json:"renter_refund_amount,omitempty"`
	OwnerIncomeAmount     *float64   `json:"owner_income_amount,omitempty"`
	Content               string     `json:"content"`
	EvidenceURLS          []string   `json:"evidence_urls"`
	OwnerAdjustmentReason string     `json:"owner_adjustment_reason"`
	OwnerAdjustedAt       *time.Time `json:"owner_adjusted_at"`
	RenterConfirmedAt     *time.Time `json:"renter_confirmed_at"`
	RenterRejectedAt      *time.Time `json:"renter_rejected_at"`
	CreatedAt             time.Time  `json:"created_at"`
	UpdatedAt             time.Time  `json:"updated_at"`
}
