package dnsprovider

import (
	"context"
	"fmt"
	"time"

	"github.com/libdns/libdns"
)

// ProviderType DNS 服务商类型
type ProviderType string

const (
	ProviderCloudflare   ProviderType = "cloudflare"
	ProviderAliyun       ProviderType = "aliyun"
	ProviderTencentCloud ProviderType = "tencent"
	ProviderCustom       ProviderType = "custom"
)

// ProviderConfig DNS 服务商配置
type ProviderConfig struct {
	Provider        ProviderType `json:"provider"`          // 服务商类型
	Domain          string       `json:"domain"`            // 根域名
	APIToken        string       `json:"api_token"`         // API Token（Cloudflare）
	AccessKeyID     string       `json:"access_key_id"`     // AccessKey ID（阿里云）
	AccessKeySecret string       `json:"access_key_secret"` // AccessKey Secret（阿里云）
	SecretId        string       `json:"secret_id"`         // SecretId（腾讯云）
	SecretKey       string       `json:"secret_key"`        // SecretKey（腾讯云）
}

// DNSProvider DNS 服务商接口
type DNSProvider interface {
	// AppendRecords 添加 DNS 记录
	AppendRecords(ctx context.Context, zone string, recs []libdns.Record) ([]libdns.Record, error)
	// SetRecords 设置 DNS 记录（会覆盖现有记录）
	SetRecords(ctx context.Context, zone string, recs []libdns.Record) ([]libdns.Record, error)
	// GetRecords 获取 DNS 记录
	GetRecords(ctx context.Context, zone string) ([]libdns.Record, error)
	// DeleteRecords 删除 DNS 记录
	DeleteRecords(ctx context.Context, zone string, recs []libdns.Record) ([]libdns.Record, error)
}

// NewDNSProvider 创建 DNS 服务商实例
func NewDNSProvider(config ProviderConfig) (DNSProvider, error) {
	switch config.Provider {
	case ProviderCloudflare:
		return NewCloudflareProvider(config)
	case ProviderAliyun:
		return NewAliyunProvider(config)
	case ProviderTencentCloud:
		return NewTencentCloudProvider(config)
	case ProviderCustom:
		return nil, fmt.Errorf("自定义服务商暂未支持")
	default:
		return nil, fmt.Errorf("不支持的 DNS 服务商：%s", config.Provider)
	}
}

// RecordType 记录类型
type RecordType string

const (
	RecordTypeA     RecordType = "A"
	RecordTypeAAAA  RecordType = "AAAA"
	RecordTypeTXT   RecordType = "TXT"
	RecordTypeCNAME RecordType = "CNAME"
)

// DNSRecord DNS 记录
type DNSRecord struct {
	Type  RecordType `json:"type"`  // 记录类型
	Name  string     `json:"name"`  // 记录名称（子域名）
	Value string     `json:"value"` // 记录值
	TTL   int        `json:"ttl"`   // TTL（秒）
}

// ToLibdnsRecord 转换为 libdns.Record
func (r *DNSRecord) ToLibdnsRecord() libdns.Record {
	recordType := string(r.Type)
	return libdns.Record{
		Type:  recordType,
		Name:  r.Name,
		Value: r.Value,
		TTL:   time.Duration(r.TTL) * time.Second,
	}
}

// FromLibdnsRecord 从 libdns.Record 转换
func FromLibdnsRecord(rec libdns.Record) *DNSRecord {
	return &DNSRecord{
		Type:  RecordType(rec.Type),
		Name:  rec.Name,
		Value: rec.Value,
		TTL:   int(rec.TTL / time.Second),
	}
}
