package service

import (
	"encoding/json"
	"fmt"
	"sec-cycle-scan/common"
	"sec-cycle-scan/model"
	"sec-cycle-scan/utils"
	"testing"
	"time"
)

func TestLeaksScan(t *testing.T) {

	if err := common.InitConfig(); err != nil {
		panic(err)
	}

	if err := common.InitComp(); err != nil {
		panic(err)
	}

	dir := "/Users/screw/Documents/code/ee/xxxxxx/tidb"

	res, err := GitleaksScan(dir)
	fmt.Println(err)
	fmt.Println(res)

	//if err != nil {
	//	t.Errorf("err: %s", err)
	//}
}

func GetRepoCount1(organization string) (int, error) {

	hc := &utils.HConfig{
		Timeout: 10 * time.Second,
	}
	httpClient := hc.NewHTTPClient()

	// 构建请求 URL
	url := fmt.Sprintf("https://api.github.com/orgs/%s", organization)
	headers := make(map[string]string)

	token := "ghp_xxxxxxxxxxxxxxxxx"

	headers["Authorization"] = "Bearer " + token
	headers["Accept"] = "application/vnd.github+json"
	resp, err := httpClient.Get(url, headers)
	if err != nil {
		return 0, err
	}

	var r model.RepoCountResp
	if err = json.Unmarshal(resp, &r); err != nil {
		return 0, err
	}

	return r.PublicRepos + r.TotalPrivateRepos, nil
}

func GetRepoList1(organization string, repoCount int) ([]model.RepoResp, error) {

	var res []model.RepoResp

	if repoCount == 0 {
		return res, nil
	}

	hc := &utils.HConfig{
		Timeout: 10 * time.Second,
	}
	httpClient := hc.NewHTTPClient()

	pageSize := 100
	total := repoCount/pageSize + 1

	for i := 1; i <= total; i++ {
		// 构建请求 URL
		url := fmt.Sprintf("https://api.github.com/orgs/%s/repos?page=%d&per_page=%d", organization, i, pageSize)
		headers := make(map[string]string)

		token := "ghp_xxxxxxxxxxxxxxxxx"
		headers["Authorization"] = "Bearer " + token
		headers["Accept"] = "application/vnd.github+json"
		resp, err := httpClient.Get(url, headers)
		if err != nil {
			return res, err
		}

		var repos []model.RepoResp

		if err = json.Unmarshal(resp, &repos); err != nil {
			return res, err
		}
		res = append(res, repos...)
	}

	return res, nil
}

func TestGetRepo(t *testing.T) {
	org := "tidbcloud"

	repoCount, err := GetRepoCount1(org)
	if err != nil {
		println(fmt.Sprintf("Failed to retrieve the number of GitHub repositories. org:%s err:%s", org, err))
	}

	repoList, err := GetRepoList1(org, repoCount)
	if err != nil {
		println(fmt.Sprintf("Failed to fetch repositories. org:%s err:%s", org, err))
	}

	for _, v := range repoList {
		if v.Archived {
			println(v.FullName)
		}
	}

}
