package usecase

import (
	"context"

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

// CreateRoleParam carries the fields a tenant submits when creating a role.
type CreateRoleParam struct {
	TenantID    string
	Key         string
	DisplayName string
	CreatorUID  string
	Status      enum.Status // optional; defaults to open
}

// UpdateRoleParam patches an existing role. CRITICAL: Key is intentionally
// omitted — keys are immutable so external mappings stay valid.
type UpdateRoleParam struct {
	DisplayName *string
	Status      *enum.Status
}

// RoleUseCase manages tenant-scoped role definitions. System roles
// (is_system=true) are immutable except for DisplayName and refuse delete.
type RoleUseCase interface {
	Create(ctx context.Context, param *CreateRoleParam) (*entity.Role, error)
	Get(ctx context.Context, tenantID, id string) (*entity.Role, error)
	GetByKey(ctx context.Context, tenantID, key string) (*entity.Role, error)
	List(ctx context.Context, tenantID string) ([]*entity.Role, error)
	Update(ctx context.Context, tenantID, id string, param *UpdateRoleParam) (*entity.Role, error)
	Delete(ctx context.Context, tenantID, id string) error
}
