package main

import (
	"encoding/json"
	"log"
	"net/http"
	"time"

	"git.yeij.top/AskaEth/Cyrene/ai-core/internal/background"
)

// syncPlatformChannels periodically fetches channel info from platform-bridge
// and updates the thinker's platform channel list and bot UIDs.
func syncPlatformChannels(thinker *background.Thinker, platformBridgeURL, internalToken string) {
	client := &http.Client{Timeout: 15 * time.Second}
	ticker := time.NewTicker(5 * time.Minute)
	defer ticker.Stop()

	// Run once immediately.
	doSync(thinker, client, platformBridgeURL, internalToken)

	for range ticker.C {
		doSync(thinker, client, platformBridgeURL, internalToken)
	}
}

func doSync(thinker *background.Thinker, client *http.Client, baseURL, token string) {
	req, err := http.NewRequest("GET", baseURL+"/api/v1/channels", nil)
	if err != nil {
		return
	}
	req.Header.Set("X-Internal-Token", token)
	resp, err := client.Do(req)
	if err != nil {
		log.Printf("[channel-sync] 请求失败: %v", err)
		return
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		log.Printf("[channel-sync] 返回 %d", resp.StatusCode)
		return
	}

	var result struct {
		Channels []struct {
			Platform    string `json:"platform"`
			ChannelType string `json:"channel_type"`
			ChannelID   string `json:"channel_id"`
			ChannelName string `json:"channel_name,omitempty"`
			AdapterID   string `json:"adapter_id,omitempty"`
			AdapterName string `json:"adapter_name,omitempty"`
		} `json:"channels"`
	}
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		log.Printf("[channel-sync] 解析失败: %v", err)
		return
	}

	for _, ch := range result.Channels {
		thinker.AddOrUpdatePlatformChannel(ch.Platform, ch.ChannelType, ch.ChannelID, ch.ChannelName, ch.AdapterID, ch.AdapterName)
	}

	// Also fetch platforms to get bot UIDs.
	syncBotUIDs(thinker, client, baseURL, token)
}

func syncBotUIDs(thinker *background.Thinker, client *http.Client, baseURL, token string) {
	req, err := http.NewRequest("GET", baseURL+"/api/v1/platforms", nil)
	if err != nil {
		return
	}
	req.Header.Set("X-Internal-Token", token)
	resp, err := client.Do(req)
	if err != nil {
		return
	}
	defer resp.Body.Close()

	var result []struct {
		Name string `json:"name"`
	}
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return
	}
	// Bot UIDs are set by incoming messages via SetBotUID.
	// This sync just ensures channels are populated.
	_ = result
}
