package usecase

import (
	"context"

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

// UpsertMappingParam carries the fields a tenant admin submits when
// editing role mappings. ExternalKey is opaque: for Zitadel it's the
// project role key, for LDAP it's the group DN, for SCIM it's the group
// displayName.
type UpsertMappingParam struct {
	TenantID        string
	ExternalSource  enum.RoleSource
	ExternalKey     string
	InternalRoleKey string
}

// ListMappingQuery filters role mapping queries.
type ListMappingQuery struct {
	Source *enum.RoleSource
	Offset int64
	Limit  int64
}

// RoleMappingUseCase manages external→internal role mappings used by
// SyncFromX flows.
type RoleMappingUseCase interface {
	Upsert(ctx context.Context, param *UpsertMappingParam) (*entity.RoleMapping, error)
	Delete(ctx context.Context, tenantID string, source enum.RoleSource, externalKey string) error
	GetByExternal(
		ctx context.Context,
		tenantID string,
		source enum.RoleSource,
		externalKey string,
	) (*entity.RoleMapping, error)
	List(ctx context.Context, tenantID string, query *ListMappingQuery) ([]*entity.RoleMapping, int64, error)
}
