package providers

import (
	"cmdb-backend/models"
	"cmdb-backend/pkg/app/request"
	"cmdb-backend/pkg/config"
	"cmdb-backend/pkg/logging"
	"context"
	"fmt"
	"github.com/qiniu/go-sdk/v7/auth"
	"time"
)

type cdnResp struct {
	Domains []domainResp
	Marker  string
}

type domainResp struct {
	Name     string    `json:"name"`
	Type     string    `json:"type"`
	Cname    string    `json:"cname"`
	CreateAt time.Time `json:"createAt"`
	ModifyAt time.Time `json:"modifyAt"`
}

type cdnDetailResp struct {
	Name     string `json:"name"`
	Type     string `json:"type"`
	Cname    string `json:"cname"`
	Protocol string `json:"protocol"`
	Source   sourceResp
}

type sourceResp struct {
	SourceType        string `json:"sourceType"`
	SourceIPs         string `json:"sourceIPs"`
	SourceDomain      string `json:"sourceDomain"`
	SourceQiniuBucket string `json:"sourceQiniuBucket"`
	advancedSources   advancedSources
}

type advancedSources struct {
	Addr string `json:"adr"`
}

func QiNiuGetCDNList() {
	accessKey := config.GC.Vendor.QiNiuAk
	secretKey := config.GC.Vendor.QiNiuSk
	url := "https://api.qiniu.com"
	mac := auth.New(accessKey, secretKey)
	ctx := context.Background()

	accessToken := mac.Sign([]byte("/domain?limit=500\n"))
	resp, err := request.Get(ctx, url+"/domain?limit=500", request.Headers{
		"Authorization": "QBox " + accessToken,
		"Content-Type":  "application/x-www-form-urlencoded",
	})
	if err != nil {
		logging.Error("get cdn domain info error:", err)
	}
	cdn := cdnResp{}
	if err := resp.ToJSON(&cdn); err != nil {
		logging.Error("json cdn domain info error:", err)
	}

	for _, domain := range cdn.Domains {
		// 获取域名的源站信息
		accessToken = mac.Sign([]byte(fmt.Sprintf("/domain/%s\n", domain.Name)))
		rep, err := request.Get(ctx, url+fmt.Sprintf("/domain/%s", domain.Name),
			request.Headers{
				"Authorization": "QBox " + accessToken,
				"Content-Type":  "application/x-www-form-urlencoded",
			})
		if err != nil {
			logging.Error("get source site info error: %v", err)
			continue
		}

		cdnDetail := cdnDetailResp{}
		if err := rep.ToJSON(&cdnDetail); err != nil {
			logging.Error("json source site info error: %v", err)
		}

		sourceType := cdnDetail.Source.SourceType
		var sourceTarget string
		if sourceType == "ip" {
			sourceTarget = cdnDetail.Source.SourceIPs
		} else if sourceType == "qiniuBucket" {
			sourceTarget = cdnDetail.Source.SourceQiniuBucket
		} else if sourceType == "domain" {
			sourceTarget = cdnDetail.Source.SourceDomain
		} else {
			sourceTarget = cdnDetail.Source.advancedSources.Addr
		}

		cdn := models.Cdn{
			Name:         domain.Name,
			Cname:        domain.Cname,
			VendorId:     4,
			Status:       domain.Type,
			SourceType:   sourceType,
			SourceTarget: sourceTarget,
			//IsHttps:      true,
			//CertId:       1,
			Owner:      "",
			Remark:     "",
			CreateTime: domain.CreateAt,
			UpdateTime: domain.ModifyAt,
		}
		fmt.Println("cdn info ", cdn)
		//写入数据库
		//if err = models.AddCdnDomain(&cdn); err != nil {
		//	logging.Error("Add cdn domain failed !", err)
		//}
	}

	return
}
