// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package main

/*
#include "dnssdfinder.h"
*/
import "C"

import (
	"fmt"
)

type dnsSDError int32

const (
	dnsSDNoError                   = dnsSDError(C.kDNSServiceErr_NoError)
	dnsSDUnknown                   = dnsSDError(C.kDNSServiceErr_Unknown)
	dnsSDNoSuchName                = dnsSDError(C.kDNSServiceErr_NoSuchName)
	dnsSDNoMemory                  = dnsSDError(C.kDNSServiceErr_NoMemory)
	dnsSDBadParam                  = dnsSDError(C.kDNSServiceErr_BadParam)
	dnsSDBadReference              = dnsSDError(C.kDNSServiceErr_BadReference)
	dnsSDBadState                  = dnsSDError(C.kDNSServiceErr_BadState)
	dnsSDBadFlags                  = dnsSDError(C.kDNSServiceErr_BadFlags)
	dnsSDUnsupported               = dnsSDError(C.kDNSServiceErr_Unsupported)
	dnsSDNotInitialized            = dnsSDError(C.kDNSServiceErr_NotInitialized)
	dnsSDAlreadyRegistered         = dnsSDError(C.kDNSServiceErr_AlreadyRegistered)
	dnsSDNameConflict              = dnsSDError(C.kDNSServiceErr_NameConflict)
	dnsSDInvalid                   = dnsSDError(C.kDNSServiceErr_Invalid)
	dnsSDFirewall                  = dnsSDError(C.kDNSServiceErr_Firewall)
	dnsSDIncompatible              = dnsSDError(C.kDNSServiceErr_Incompatible)
	dnsSDBadInterfaceIndex         = dnsSDError(C.kDNSServiceErr_BadInterfaceIndex)
	dnsSDRefused                   = dnsSDError(C.kDNSServiceErr_Refused)
	dnsSDNoSuchRecord              = dnsSDError(C.kDNSServiceErr_NoSuchRecord)
	dnsSDNoAuth                    = dnsSDError(C.kDNSServiceErr_NoAuth)
	dnsSDNoSuchKey                 = dnsSDError(C.kDNSServiceErr_NoSuchKey)
	dnsSDNATTraversal              = dnsSDError(C.kDNSServiceErr_NATTraversal)
	dnsSDDoubleNAT                 = dnsSDError(C.kDNSServiceErr_DoubleNAT)
	dnsSDBadTime                   = dnsSDError(C.kDNSServiceErr_BadTime)
	dnsSDBadSig                    = dnsSDError(C.kDNSServiceErr_BadSig)
	dnsSDBadKey                    = dnsSDError(C.kDNSServiceErr_BadKey)
	dnsSDTransient                 = dnsSDError(C.kDNSServiceErr_Transient)
	dnsSDServiceNotRunning         = dnsSDError(C.kDNSServiceErr_ServiceNotRunning)
	dnsSDNATPortMappingUnsupported = dnsSDError(C.kDNSServiceErr_NATPortMappingUnsupported)
	dnsSDNATPortMappingDisabled    = dnsSDError(C.kDNSServiceErr_NATPortMappingDisabled)
	dnsSDNoRouter                  = dnsSDError(C.kDNSServiceErr_NoRouter)
	dnsSDPollingMode               = dnsSDError(C.kDNSServiceErr_PollingMode)
	dnsSDTimeout                   = dnsSDError(C.kDNSServiceErr_Timeout)
)

func (d dnsSDError) Error() string {
	switch d {
	case dnsSDNoError:
		return "NoError"
	case dnsSDUnknown:
		return "Unknown"
	case dnsSDNoSuchName:
		return "NoSuchName"
	case dnsSDNoMemory:
		return "NoMemory"
	case dnsSDBadParam:
		return "BadParam"
	case dnsSDBadReference:
		return "BadReference"
	case dnsSDBadState:
		return "BadState"
	case dnsSDBadFlags:
		return "BadFlags"
	case dnsSDUnsupported:
		return "Unsupported"
	case dnsSDNotInitialized:
		return "NotInitialized"
	case dnsSDAlreadyRegistered:
		return "AlreadyRegistered"
	case dnsSDNameConflict:
		return "NameConflict"
	case dnsSDInvalid:
		return "Invalid"
	case dnsSDFirewall:
		return "Firewall"
	case dnsSDIncompatible:
		return "Incompatible"
	case dnsSDBadInterfaceIndex:
		return "BadInterfaceIndex"
	case dnsSDRefused:
		return "Refused"
	case dnsSDNoSuchRecord:
		return "NoSuchRecord"
	case dnsSDNoAuth:
		return "NoAuth"
	case dnsSDNoSuchKey:
		return "NoSuchKey"
	case dnsSDNATTraversal:
		return "NATTraversal"
	case dnsSDDoubleNAT:
		return "DoubleNAT"
	case dnsSDBadTime:
		return "BadTime"
	case dnsSDBadSig:
		return "BadSig"
	case dnsSDBadKey:
		return "BadKey"
	case dnsSDTransient:
		return "Transient"
	case dnsSDServiceNotRunning:
		return "ServiceNotRunning"
	case dnsSDNATPortMappingUnsupported:
		return "NATPortMappingUnsupported"
	case dnsSDNATPortMappingDisabled:
		return "NATPortMappingDisabled"
	case dnsSDNoRouter:
		return "NoRouter"
	case dnsSDPollingMode:
		return "PollingMode"
	case dnsSDTimeout:
		return "Timeout"
	default:
		return fmt.Sprintf("Unrecognized Error Code: %d", d)
	}
}

func (d dnsSDError) Is(other error) bool {
	otherConv, ok := other.(dnsSDError)
	if !ok {
		return false
	}
	return otherConv == d
}
