package openai

import (
	"fmt"
	"net/http"
	"time"
)

// https://oapi.czl.net/dashboard/billing/credit_grants
type Billing struct {
	Object         string  `json:"object"`
	TotalGranted   float64 `json:"total_granted"`
	TotalUsed      float64 `json:"total_used"`
	TotalAvailable float64 `json:"total_available"`
	Grants         struct {
		Object string `json:"object"`
		Data   []struct {
			Object      string  `json:"object"`
			ID          string  `json:"id"`
			GrantAmount float64 `json:"grant_amount"`
			UsedAmount  float64 `json:"used_amount"`
			EffectiveAt float64 `json:"effective_at"`
			ExpiresAt   float64 `json:"expires_at"`
		} `json:"data"`
	} `json:"grants"`
}

type BalanceResponse struct {
	TotalGranted   float64   `json:"total_granted"`
	TotalUsed      float64   `json:"total_used"`
	TotalAvailable float64   `json:"total_available"`
	EffectiveAt    time.Time `json:"effective_at"`
	ExpiresAt      time.Time `json:"expires_at"`
}

func (gpt *ChatGPT) GetBalance() (*BalanceResponse, error) {
	var data Billing
	err := gpt.sendRequestWithBodyType(
		gpt.ApiUrl+"/dashboard/billing/credit_grants",
		http.MethodGet,
		nilBody,
		nil,
		&data,
	)
	if err != nil {
		return nil, fmt.Errorf("failed to get billing data: %v", err)
	}

	balance := &BalanceResponse{
		TotalGranted:   data.TotalGranted,
		TotalUsed:      data.TotalUsed,
		TotalAvailable: data.TotalAvailable,
		ExpiresAt:      time.Now(),
		EffectiveAt:    time.Now(),
	}

	if len(data.Grants.Data) > 0 {
		balance.EffectiveAt = time.Unix(int64(data.Grants.Data[0].EffectiveAt), 0)
		balance.ExpiresAt = time.Unix(int64(data.Grants.Data[0].ExpiresAt), 0)
	}

	return balance, nil
}
