package allowed_image

import (
	"cloud.o-forge.io/core/oc-lib/models/utils"
	"cloud.o-forge.io/core/oc-lib/tools"
)

// AllowedImage représente une image de conteneur autorisée à persister
// sur un peer après l'exécution d'un workflow.
//
// La décision de rétention est entièrement locale au datacenter —
// le fournisseur de processing n'a aucun levier sur cette liste.
//
// Règle de matching (côté oc-datacenter) :
//   - Registry vide  = toutes les registries
//   - TagConstraint vide = toutes les versions
//   - TagConstraint non vide = exact ou glob (ex: "3.*", "1.2.3")
//
// Les entrées IsDefault sont créées au bootstrap et ne peuvent pas
// être supprimées via l'API.
type AllowedImage struct {
	utils.AbstractObject

	// Registry source (ex: "docker.io", "registry.example.com").
	// Vide = wildcard, accepte n'importe quelle registry.
	Registry string `json:"registry,omitempty" bson:"registry,omitempty"`

	// Image est le nom de l'image sans registry ni tag
	// (ex: "natsio/nats-box", "library/alpine").
	Image string `json:"image" bson:"image" validate:"required"`

	// TagConstraint est la contrainte sur le tag.
	// Vide = toutes les versions autorisées.
	// Supporte exact ("1.2.3") ou glob ("3.*", "*-alpine").
	TagConstraint string `json:"tag_constraint,omitempty" bson:"tag_constraint,omitempty"`

	// IsDefault marque les entrées bootstrap insérées au démarrage.
	// Ces entrées ne peuvent pas être supprimées via l'API.
	IsDefault bool `json:"is_default,omitempty" bson:"is_default,omitempty"`
}

func (a *AllowedImage) StoreDraftDefault() {
	a.IsDraft = false // les allowed images sont actives immédiatement
}

func (a *AllowedImage) CanUpdate(set utils.DBObject) (bool, utils.DBObject) {
	return true, set
}

func (a *AllowedImage) CanDelete() bool {
	return !a.IsDefault // les entrées bootstrap sont non supprimables
}

func (a *AllowedImage) GetAccessor(request *tools.APIRequest) utils.Accessor {
	return NewAccessor(request)
}
