package public

import (
	"encoding/json"
	"fmt"
	"time"

	"github.com/go-resty/resty/v2"
)

func InitAiCli() *resty.Client {
	if Config.HttpProxy != "" {
		return resty.New().SetTimeout(10*time.Second).SetHeader("Authorization", fmt.Sprintf("Bearer %s", Config.ApiKey)).SetProxy(Config.HttpProxy).SetRetryCount(3).SetRetryWaitTime(2 * time.Second)
	}
	return resty.New().SetTimeout(10*time.Second).SetHeader("Authorization", fmt.Sprintf("Bearer %s", Config.ApiKey)).SetRetryCount(3).SetRetryWaitTime(2 * time.Second)
}

type Bill struct {
	Object     string      `json:"object"`
	DailyCosts []DailyCost `json:"daily_costs"`
	TotalUsage float64     `json:"total_usage"`
}

type DailyCost struct {
	Timestamp float64    `json:"timestamp"`
	LineItems []LineItem `json:"line_items"`
}

type LineItem struct {
	Name string  `json:"name"`
	Cost float64 `json:"cost"`
}

// GetBalance 获取账号余额
func GetBalance() (string, error) {
	var data Bill
	path := "/v1/dashboard/billing/usage"
	var url string = "https://api.openai.com" + path
	if Config.BaseURL != "" {
		url = Config.BaseURL + path
	}
	d, _ := time.ParseDuration("-24h")
	resp, err := InitAiCli().R().SetQueryParams(map[string]string{
		"start_date": time.Now().Add(d * 90).Format("2006-01-02"),
		"end_date":   time.Now().Format("2006-01-02"),
	}).Get(url)
	if err != nil {
		return "", err
	}
	err = json.Unmarshal(resp.Body(), &data)
	if err != nil {
		return "", err
	}
	sub, err := GetSub()
	if err != nil {
		return "", err
	}
	expireDate := time.Unix(sub.AccessUntil, 0).Format("2006-01-02 15:04:05")
	used := data.TotalUsage / 100
	totalAvailable := sub.HardLimitUsd - used
	msg := fmt.Sprintf("💵 已用: 💲%v\n💵 剩余: 💲%v\n🕰 到期时间: %v", fmt.Sprintf("%.2f", used), fmt.Sprintf("%.2f", totalAvailable), expireDate)
	// 放入缓存
	UserService.SetUserMode("system_balance", msg)
	return msg, nil
}

type Subscription struct {
	Object             string      `json:"object"`
	HasPaymentMethod   bool        `json:"has_payment_method"`
	Canceled           bool        `json:"canceled"`
	CanceledAt         interface{} `json:"canceled_at"`
	Delinquent         interface{} `json:"delinquent"`
	AccessUntil        int64       `json:"access_until"`
	SoftLimit          int64       `json:"soft_limit"`
	HardLimit          int64       `json:"hard_limit"`
	SystemHardLimit    int64       `json:"system_hard_limit"`
	SoftLimitUsd       float64     `json:"soft_limit_usd"`
	HardLimitUsd       float64     `json:"hard_limit_usd"`
	SystemHardLimitUsd float64     `json:"system_hard_limit_usd"`
	Plan               Plan        `json:"plan"`
	AccountName        string      `json:"account_name"`
	PoNumber           interface{} `json:"po_number"`
	BillingEmail       interface{} `json:"billing_email"`
	TaxIDS             interface{} `json:"tax_ids"`
	BillingAddress     interface{} `json:"billing_address"`
	BusinessAddress    interface{} `json:"business_address"`
}

type Plan struct {
	Title string `json:"title"`
	ID    string `json:"id"`
}

func GetSub() (Subscription, error) {
	var data Subscription
	path := "/v1/dashboard/billing/subscription"
	var url string = "https://api.openai.com" + path
	if Config.BaseURL != "" {
		url = Config.BaseURL + path
	}
	resp, err := InitAiCli().R().Get(url)
	if err != nil {
		return data, err
	}
	err = json.Unmarshal(resp.Body(), &data)
	if err != nil {
		return data, err
	}
	return data, nil
}