// Package usecase contains the permission module's domain interfaces and
// DTOs. Implementations live under internal/model/permission/usecase/.
package usecase

import (
	"context"

	"gateway/internal/model/permission/domain/entity"
	"gateway/internal/model/permission/domain/enum"
)

// PermissionTreeNode is a hierarchical node returned by the catalog
// endpoint. Children are nil when not requested or when the caller asked
// for a flat list.
type PermissionTreeNode struct {
	ID          string                `json:"id"`
	Parent      string                `json:"parent,omitempty"`
	Name        string                `json:"name"`
	HTTPMethods string                `json:"http_methods,omitempty"`
	HTTPPath    string                `json:"http_path,omitempty"`
	Status      enum.Status           `json:"status"`
	Type        enum.PermissionType   `json:"type"`
	Children    []*PermissionTreeNode `json:"children,omitempty"`
}

// CatalogQuery filters the catalog tree.
type CatalogQuery struct {
	OnlyOpen bool                 // exclude status=close (and their subtrees)
	Type     *enum.PermissionType // restrict to backend or frontend
}

// PermissionUseCase exposes the platform-wide permission catalog. Tenants
// only consume read endpoints; mutations are platform-admin only and
// usually run via cmd/permission-seed.
type PermissionUseCase interface {
	GetCatalogTree(ctx context.Context, query *CatalogQuery) ([]*PermissionTreeNode, error)
	List(ctx context.Context, query *CatalogQuery) ([]*entity.Permission, error)
	GetByID(ctx context.Context, id string) (*entity.Permission, error)
	GetByName(ctx context.Context, name string) (*entity.Permission, error)
	UpsertCatalog(ctx context.Context, perms []*entity.Permission) error
	UpdateStatus(ctx context.Context, id string, status enum.Status) error
}
