package providers

import (
	"cmdb-backend/models"
	"cmdb-backend/pkg/app/request"
	"cmdb-backend/pkg/config"
	"cmdb-backend/pkg/logging"
	"context"
	"fmt"
	"time"
)

type domainsResp []domainInfo

type domainInfo struct {
	Domain       string    `json:"domain"`
	Status       string    `json:"status"`
	DomainId     int       `json:"domainId"`
	CreatedAt    time.Time `json:"createdAt"`
	Expires      time.Time `json:"expires"`
	ContactAdmin contactAdmin
}

type contactAdmin struct {
	Email        string `json:"email"`
	Organization string `json:"organization"`
}

type recordsResp []recordInfo

type recordInfo struct {
	Data string `json:"data"`
	Name string `json:"name"`
	Ttl  int    `json:"ttl"`
	Type string `json:"type"`
}

func Godaddy() {
	accessKey := config.GC.Vendor.GodaddyAk
	secretKey := config.GC.Vendor.GodaddySk
	url := "https://api.godaddy.com"
	ctx := context.Background()

	//获取 zone 列表
	resp, err := request.Get(ctx,
		fmt.Sprintf(url+"/v1/domains"),
		request.Headers{"Authorization": fmt.Sprintf("sso-key %s:%s", accessKey, secretKey)},
		request.Query{"statuses": "ACTIVE"},
	)
	if err != nil {
		logging.Error("get godaddy zone err ", err)
		return
	}

	domainList := domainsResp{}
	err = resp.ToJSON(&domainList)
	if err != nil {
		logging.Error("json godaddy zone err ", err)
	}
	for _, domain := range domainList {
		zone := models.DnsZone{
			VendorId: 9,
			Name:     domain.Domain,
			Status:   domain.Status,
			ZoneId:   domain.DomainId,
		}
		fmt.Println(zone)
		//写入数据库
		if err := models.CreateDnsZone(zone); err != nil {
			logging.Error("Add dns zone failed !", err)
		}

		// 获取 domain 下面的 record，然后入库
		rep, err := request.Get(ctx,
			fmt.Sprintf(url+"/v1/domains/%s/records", domain.Domain),
			request.Headers{"Authorization": fmt.Sprintf("sso-key %s:%s", accessKey, secretKey)},
			request.Query{"limit": "150"},
		)
		if err != nil {
			fmt.Println("get godaddy dns record err ", err)
		}

		recordList := recordsResp{}
		err = rep.ToJSON(&recordList)
		if err != nil {
			logging.Error("", err)
		}

		for _, record := range recordList {
			dnsRecord := models.DnsRecord{
				VendorId: 9,
				Line:     "默认",
				Status:   "ENABLE",
				Ttl:      record.Ttl,
				Target:   record.Data,
				RecordId: 999999,
				Name:     record.Name,
				Type:     record.Type,
				ZoneName: domain.Domain,
				ZoneId:   domain.DomainId,
			}
			fmt.Println(dnsRecord)
			if err = models.InitDnsRecord(dnsRecord); err != nil {
				logging.Error("Add dns zone failed !", err)
			}
		}
	}
	return
}

func GodaddyCreateDnsRecord() {
	accessKey := config.GC.Vendor.GodaddyAk
	secretKey := config.GC.Vendor.GodaddySk
	url := "https://api.godaddy.com"

	//获取 zone 列表
	resp, err := request.Get(
		context.Background(), fmt.Sprintf(url+"/v1/domains"),
		request.Headers{"Authorization": fmt.Sprintf("sso-key %s:%s", accessKey, secretKey)},
		request.Query{"statuses": "ACTIVE"},
	)
	if err != nil {
		logging.Error("get godaddy zone err ", err)
	}

	domainList := domainsResp{}
	err = resp.ToJSON(&domainList)
	if err != nil {
		logging.Error("json godaddy zone err ", err)
	}

	for _, domain := range domainList {
		zone := models.DnsZone{
			VendorId: 9,
			Owner:    "",
			Remark:   "",
			ZoneId:   domain.DomainId,
			Name:     domain.Domain,
			Status:   domain.Status,
		}

		fmt.Println("....", zone)

		//写入数据库
		//err = models.AddDnsZone(&zone)
		//if err != nil {
		//	fmt.Println(err)
		//	logging.Error("Add page zone failed !")
		//}

		// 获取 domain 下面的 record，然后入库
		rep, err := request.Get(
			context.Background(), fmt.Sprintf(url+"/v1/domains/%s/records", domain.Domain),
			request.Headers{"Authorization": fmt.Sprintf("sso-key %s:%s", accessKey, secretKey)},
			request.Query{"limit": "100"},
		)
		if err != nil {
			fmt.Println("get godaddy page record", err)
		}

		recordList := recordsResp{}
		err = rep.ToJSON(&recordList)
		if err != nil {
			logging.Error("", err)
		}

		fmt.Println("记录条数 ", len(recordList))
		for _, record := range recordList {
			record1 := models.DnsRecord{
				ZoneId:   domain.DomainId,
				RecordId: 22,
				Name:     record.Name,
				Type:     record.Type,
				Line:     "默认",
				//LineId:   "0",
				Ttl:    record.Ttl,
				Target: record.Data,
				Status: "ENABLE",
				Owner:  " ",
				Remark: " ",
			}
			fmt.Println("内容", record1)

			//err = models.CreateDnsRecord(&record1)
			//if err != nil {
			//	fmt.Println(err)
			//	logging.Error("Add page zone failed !")
			//}
		}

	}
	return
}

func GodaddyGetDomainList() {
	accessKey := config.GC.Vendor.GodaddyAk
	secretKey := config.GC.Vendor.GodaddySk
	url := "https://api.godaddy.com"
	ctx := context.Background()

	//获取域名列表
	resp, err := request.Get(ctx,
		fmt.Sprintf(url+"/v1/domains"),
		request.Headers{"Authorization": fmt.Sprintf("sso-key %s:%s", accessKey, secretKey)},
		request.Query{"statuses": "ACTIVE"},
	)

	if err != nil {
		logging.Error("get godaddy zone err ", err)
	}
	domainList := domainsResp{}
	if err = resp.ToJSON(&domainList); err != nil {
		logging.Error("json godaddy zone err ", err)
	}

	for _, tmp := range domainList {
		rep, err := request.Get(ctx,
			fmt.Sprintf(url+"/v1/domains/%s", tmp.Domain),
			request.Headers{"Authorization": fmt.Sprintf("sso-key %s:%s", accessKey, secretKey)},
		)
		if err != nil {
			fmt.Println("get godaddy dns record err ", err)
		}

		recordList := recordsResp{}
		err = rep.ToJSON(&recordList)
		if err != nil {
			logging.Error("", err)
		}

		domain1 := models.Domain{
			Name:        tmp.Domain,
			Status:      tmp.Status,
			Grade:       "A",
			VendorId:    9,
			IsIcp:       1,
			IcpCode:     "",
			Owner:       "",
			Remark:      "",
			Possessor:   "PingCAP Ltd.",
			CreateTime:  tmp.CreatedAt,
			ExpiredTime: tmp.Expires,
		}
		fmt.Println(domain1)
		//写入数据库
		//if err = models.CreateDomainRecord(&domain1); err != nil {
		//	fmt.Println(err)
		//	logging.Error("Add domain failed !", err)
		//}
	}
}
