package providers

import (
	"cmdb-backend/models"
	"cmdb-backend/pkg/config"
	"cmdb-backend/pkg/logging"
	"cmdb-backend/pkg/utils"
	"fmt"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
	dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
)

func createClient() (client *dnspod.Client) {
	credential := common.NewCredential(
		config.GC.Vendor.TencentAk,
		config.GC.Vendor.TencentSk,
	)

	cpf := profile.NewClientProfile()
	cpf.HttpProfile.Endpoint = "dnspod.tencentcloudapi.com"
	client, _ = dnspod.NewClient(credential, "", cpf)

	return client
}

func Tencent() {
	client := createClient()
	//获取 zone 列表
	request := dnspod.NewDescribeDomainListRequest()
	response, err := client.DescribeDomainList(request)
	if err != nil {
		logging.Error("err", err)
	}

	zoneList := response.Response.DomainList
	for _, domain := range zoneList {
		zone := models.DnsZone{
			VendorId: 5,
			Name:     *domain.Name,
			Status:   *domain.Status,
			ZoneId:   int(*domain.DomainId),
		}
		fmt.Println(zone)
		//写入数据库
		err = models.CreateDnsZone(zone)
		if err != nil {
			logging.Error("Add dns zone failed !", err)
		}

		// 获取 domain 下面的 record，然后入库
		rep := dnspod.NewDescribeRecordListRequest()
		rep.Domain = common.StringPtr(*domain.Name)
		rep.Limit = common.Uint64Ptr(3000)

		res, err := client.DescribeRecordList(rep)
		if err != nil {
			logging.Error("err", err)
		}

		recordList := res.Response.RecordList

		fmt.Printf(" %s 域名记录总条数：%d \n", *domain.Name, len(recordList))

		for _, record := range recordList {
			dnsRecord := models.DnsRecord{
				ZoneName:   *domain.Name,
				Name:       *record.Name,
				Type:       *record.Type,
				Line:       *record.Line,
				VendorId:   5,
				Ttl:        int(*record.TTL),
				Target:     *record.Value,
				Status:     *record.Status,
				ZoneId:     int(*domain.DomainId),
				RecordId:   int64(*record.RecordId),
				UpdateTime: utils.Str2Time(*record.UpdatedOn),
			}
			fmt.Println(dnsRecord)
			if err = models.InitDnsRecord(dnsRecord); err != nil {
				logging.Error("Add dns zone failed !", err)
			}
		}
	}
	return
}

// TencentCreateDnsRecord 新增 DNS 记录
func TencentCreateDnsRecord(domain string, subDomain string, rType string,
	line string, target string, ttl int, status string) (recordId int64, err error) {
	client := createClient()
	request := dnspod.NewCreateRecordRequest()
	request.Domain = common.StringPtr(domain)
	request.SubDomain = common.StringPtr(subDomain)
	request.RecordType = common.StringPtr(rType)
	request.RecordLine = common.StringPtr(line)
	request.Value = common.StringPtr(target)
	request.TTL = common.Uint64Ptr(uint64(ttl))
	request.Status = common.StringPtr(status)

	response, err := client.CreateRecord(request)
	if err != nil {
		return 0, err
	}

	recordId = int64(*response.Response.RecordId)
	return recordId, nil
}

// TencentUpdateDnsRecord 修改 DNS 记录
func TencentUpdateDnsRecord(domain string, subDomain string, rType string, line string,
	target string, ttl int, recordId int64) (err error) {
	client := createClient()
	request := dnspod.NewModifyRecordRequest()
	request.Domain = common.StringPtr(domain)
	request.SubDomain = common.StringPtr(subDomain)
	request.RecordType = common.StringPtr(rType)
	request.RecordLine = common.StringPtr(line)
	request.Value = common.StringPtr(target)
	request.RecordId = common.Uint64Ptr(uint64(recordId))
	request.TTL = common.Uint64Ptr(uint64(ttl))

	if _, err = client.ModifyRecord(request); err != nil {
		return err
	}
	return nil
}

// TencentDeleteDnsRecord 删除 DNS 记录
func TencentDeleteDnsRecord(domain string, recordId int64) (err error) {
	client := createClient()
	request := dnspod.NewDeleteRecordRequest()
	request.Domain = common.StringPtr(domain)
	request.RecordId = common.Uint64Ptr(uint64(recordId))

	if _, err = client.DeleteRecord(request); err != nil {
		return err
	}
	return nil
}

// TencentModifyRecordStatus 修改 DNS 解析状态
func TencentModifyRecordStatus(domain string, recordId int64, status string) (err error) {
	client := createClient()
	request := dnspod.NewModifyRecordStatusRequest()
	request.Domain = common.StringPtr(domain)
	request.RecordId = common.Uint64Ptr(uint64(recordId))
	request.Status = common.StringPtr(status)

	if _, err = client.ModifyRecordStatus(request); err != nil {
		return err
	}
	return nil
}
