package countalert

import (
	"encoding/base64"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

// GitHubFileContent 表示GitHub API返回的文件内容结构
type GitHubFileContent struct {
	Content  string `json:"content"`
	Encoding string `json:"encoding"`
}

// GetGitHubFileContent 从GitHub API获取指定文件的内容
func GetGitHubFileContent(owner, repo, path, branch string) (string, error) {
	url := fmt.Sprintf("https://api.github.com/repos/%s/%s/contents/%s?ref=%s", owner, repo, path, branch)

	// 创建HTTP请求
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return "", fmt.Errorf("failed to create request: %v", err)
	}

	// 添加User-Agent头，这是GitHub API的要求
	req.Header.Set("User-Agent", "alertnums-app")

	// 如果设置了GitHub token，添加到请求头中
	if token := getGitHubToken(); token != "" {
		req.Header.Set("Authorization", "token "+token)
	}

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return "", fmt.Errorf("failed to fetch file from GitHub: %v", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		body, _ := io.ReadAll(resp.Body)
		return "", fmt.Errorf("GitHub API returned status code: %d, body: %s", resp.StatusCode, string(body))
	}

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("failed to read response body: %v", err)
	}

	var fileContent GitHubFileContent
	if err := json.Unmarshal(body, &fileContent); err != nil {
		return "", fmt.Errorf("failed to unmarshal JSON response: %v", err)
	}

	// GitHub API返回的内容是base64编码的
	if fileContent.Encoding != "base64" {
		return "", fmt.Errorf("unexpected encoding: %s", fileContent.Encoding)
	}

	// 解码base64内容
	decodedContent, err := decodeBase64(fileContent.Content)
	if err != nil {
		return "", fmt.Errorf("failed to decode base64 content: %v", err)
	}

	return decodedContent, nil
}

// decodeBase64 简单的base64解码实现
func decodeBase64(s string) (string, error) {
	// 清理base64字符串中的换行符
	cleanContent := strings.ReplaceAll(s, "\n", "")

	// 使用标准库的base64解码
	decoded, err := base64.StdEncoding.DecodeString(cleanContent)
	if err != nil {
		return "", fmt.Errorf("failed to decode base64: %v", err)
	}

	return string(decoded), nil
}

// getGitHubToken 从环境变量获取GitHub token
func getGitHubToken() string {
	return os.Getenv("GITHUB_TOKEN")
}
