// Package nsdadapter реализует транспорт к НРД:
// REST-клиент Интеграционного шлюза (основной канал) и резервный
// WS ONYX. На M1 — REST-клиент + маршрутизация типов пакетов;
// onyx остаётся скелетом до получения КриптоПро JCP (PR-6).
package nsdadapter

import (
	"fmt"
	"time"
)

// Profile — преднастроенный набор параметров подключения к ИШ НРД.
type Profile struct {
	Name           string
	IGWBaseURL     string
	Channel        string
	KeyContainer   string
	RequestTimeout time.Duration
	RetryMax       int
	RetryBackoff   time.Duration
}

// Известные профили: пары среда (guest/test3/prod) x алгоритм (gost/rsa).
var profiles = map[string]Profile{
	"guest-gost": {
		Name: "guest-gost", IGWBaseURL: "http://localhost:8080", Channel: "GUEST",
		KeyContainer:   "GUEST_GOST_CONTAINER",
		RequestTimeout: 30 * time.Second, RetryMax: 3, RetryBackoff: time.Second,
	},
	"guest-rsa": {
		Name: "guest-rsa", IGWBaseURL: "http://localhost:8080", Channel: "GUEST",
		KeyContainer:   "GUEST_RSA_CONTAINER",
		RequestTimeout: 30 * time.Second, RetryMax: 3, RetryBackoff: time.Second,
	},
	"test3-gost": {
		Name: "test3-gost", IGWBaseURL: "http://localhost:8080", Channel: "TEST3",
		KeyContainer:   "TEST3_GOST_CONTAINER",
		RequestTimeout: 30 * time.Second, RetryMax: 3, RetryBackoff: time.Second,
	},
	"test3-rsa": {
		Name: "test3-rsa", IGWBaseURL: "http://localhost:8080", Channel: "TEST3",
		KeyContainer:   "TEST3_RSA_CONTAINER",
		RequestTimeout: 30 * time.Second, RetryMax: 3, RetryBackoff: time.Second,
	},
	"prod-gost": {
		Name: "prod-gost", IGWBaseURL: "http://localhost:8080", Channel: "PROD",
		KeyContainer:   "PROD_GOST_CONTAINER",
		RequestTimeout: 60 * time.Second, RetryMax: 5, RetryBackoff: 2 * time.Second,
	},
	"prod-rsa": {
		Name: "prod-rsa", IGWBaseURL: "http://localhost:8080", Channel: "PROD",
		KeyContainer:   "PROD_RSA_CONTAINER",
		RequestTimeout: 60 * time.Second, RetryMax: 5, RetryBackoff: 2 * time.Second,
	},
}

// LookupProfile находит профиль по имени.
func LookupProfile(name string) (Profile, error) {
	p, ok := profiles[name]
	if !ok {
		return Profile{}, fmt.Errorf("nsdadapter: неизвестный профиль %q", name)
	}
	return p, nil
}

// AvailableProfiles возвращает имена всех известных профилей.
func AvailableProfiles() []string {
	out := make([]string, 0, len(profiles))
	for name := range profiles {
		out = append(out, name)
	}
	return out
}
