package model

import (
	"strings"

	"gorm.io/gorm"
)

const (
	ProviderDummy = iota
	ProviderWebHook
	ProviderCloudflare
	ProviderTencentCloud
)

const (
	_Dummy        = "dummy"
	_WebHook      = "webhook"
	_Cloudflare   = "cloudflare"
	_TencentCloud = "tencentcloud"
)

var ProviderMap = map[uint8]string{
	ProviderDummy:        _Dummy,
	ProviderWebHook:      _WebHook,
	ProviderCloudflare:   _Cloudflare,
	ProviderTencentCloud: _TencentCloud,
}

var ProviderList = []DDNSProvider{
	{
		Name: _Dummy,
		ID:   ProviderDummy,
	},
	{
		Name:         _Cloudflare,
		ID:           ProviderCloudflare,
		AccessSecret: true,
	},
	{
		Name:         _TencentCloud,
		ID:           ProviderTencentCloud,
		AccessID:     true,
		AccessSecret: true,
	},
	// Least frequently used, always place this at the end
	{
		Name:               _WebHook,
		ID:                 ProviderWebHook,
		AccessID:           true,
		AccessSecret:       true,
		WebhookURL:         true,
		WebhookMethod:      true,
		WebhookRequestType: true,
		WebhookRequestBody: true,
		WebhookHeaders:     true,
	},
}

type DDNSProfile struct {
	Common
	EnableIPv4         *bool
	EnableIPv6         *bool
	MaxRetries         uint64
	Name               string
	Provider           uint8
	AccessID           string
	AccessSecret       string
	WebhookURL         string
	WebhookMethod      uint8
	WebhookRequestType uint8
	WebhookRequestBody string
	WebhookHeaders     string

	Domains    []string `gorm:"-"`
	DomainsRaw string
}

func (d DDNSProfile) TableName() string {
	return "ddns"
}

func (d *DDNSProfile) AfterFind(tx *gorm.DB) error {
	if d.DomainsRaw != "" {
		d.Domains = strings.Split(d.DomainsRaw, ",")
	}
	return nil
}

type DDNSProvider struct {
	Name               string
	ID                 uint8
	AccessID           bool
	AccessSecret       bool
	WebhookURL         bool
	WebhookMethod      bool
	WebhookRequestType bool
	WebhookRequestBody bool
	WebhookHeaders     bool
}