package fortigate

import (
	"fmt"
	"github.com/StackExchange/dnscontrol/v4/models"
	"strings"
)

// AuditRecords performs basic validation and returns warnings for known limitations.
func AuditRecords(records []*models.RecordConfig) []error {
	var problems []error

	for _, rc := range records {
		switch rc.Type {
		case "A", "AAAA", "CNAME", "NS", "MX":
			// Supported
		case "PTR":
			// FortiGate limitations: these record types are not fully supported.
			problems = append(problems,
				fmt.Errorf("record type %s is not supported by FortiGate provider (name: %s)", rc.Type, rc.GetLabelFQDN()))
		default:
			problems = append(problems,
				fmt.Errorf("record type %s is not supported by FortiGate provider (name: %s)", rc.Type, rc.GetLabelFQDN()))
		}

		//Handle CNAME Records limitations
		if rc.Type == "CNAME" && rc.GetLabel() == "@" {
			problems = append(problems,
				fmt.Errorf("CNAME at apex (@) is not allowed (name: %s)", rc.GetLabelFQDN()))
		}

		//Handle NS Records limitations
		if rc.Type == "NS" && rc.GetLabel() != "@" && rc.GetLabel() != "" {
			problems = append(problems,
				fmt.Errorf("NS records are only supported at the zone apex (@): %s", rc.GetLabelFQDN()))
		}

		//Handle MX Records limitations
		if rc.Type == "MX" {

			// MX only supported at zone apex
			if rc.GetLabel() != "@" && rc.GetLabel() != "" {
				problems = append(problems,
					fmt.Errorf("MX records are only supported at the zone apex (@): %s", rc.GetLabelFQDN()))
			}

			// FortiGate does not accept "." as target (it's not a valid DNS name)
			target := rc.GetTargetField()
			if target == "." {
				problems = append(problems,
					fmt.Errorf("FortiGate does not accept '.' as an MX target: %s", rc.GetLabelFQDN()))
			}
		}

		// Wildcard support
		if strings.Contains(rc.GetLabelFQDN(), "*") {
			problems = append(problems,
				fmt.Errorf("wildcard record %s is not supported by FortiGate", rc.GetLabelFQDN()))
		}
	}

	return problems
}
