// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package scada

import (
	"fmt"
	"net"

	"github.com/hashicorp/consul/agent/hcp/config"
	"github.com/hashicorp/go-hclog"
	libscada "github.com/hashicorp/hcp-scada-provider"
	"github.com/hashicorp/hcp-scada-provider/capability"
	"github.com/hashicorp/hcp-sdk-go/resource"
)

// Provider is the interface used in the rest of Consul core when using SCADA, it is aliased here to the same interface
// provided by the hcp-scada-provider library. If the interfaces needs to be extended in the future it can be done so
// with minimal impact on the rest of the codebase.
//
//go:generate mockery --name Provider --with-expecter --inpackage
type Provider interface {
	libscada.SCADAProvider
}

const (
	scadaConsulServiceKey = "consul"
)

func New(cfg config.CloudConfig, logger hclog.Logger) (Provider, error) {
	resource, err := resource.FromString(cfg.ResourceID)
	if err != nil {
		return nil, fmt.Errorf("failed to parse cloud resource_id: %w", err)
	}

	hcpConfig, err := cfg.HCPConfig()
	if err != nil {
		return nil, fmt.Errorf("failed to build HCPConfig: %w", err)
	}

	pvd, err := libscada.New(&libscada.Config{
		Service:   scadaConsulServiceKey,
		HCPConfig: hcpConfig,
		Resource:  *resource.Link(),
		Logger:    logger,
	})
	if err != nil {
		return nil, err
	}

	return pvd, nil
}

// IsCapability takes a net.Addr and returns true if it is a SCADA capability.Addr
func IsCapability(a net.Addr) bool {
	_, ok := a.(*capability.Addr)
	return ok
}
