package kb

import (
	"context"
	"fmt"
	"strings"
)

const (
	KnowledgeBaseRepositoryAccessProfileNone   = "none"
	KnowledgeBaseRepositoryAccessProfileRead   = "read"
	KnowledgeBaseRepositoryAccessProfileWrite  = "write"
	KnowledgeBaseRepositoryAccessProfileManage = "manage"
)

func NormalizeKnowledgeBaseRepositoryAccessProfile(profile string) string {
	trimmed := strings.TrimSpace(profile)
	if trimmed == "" {
		return KnowledgeBaseRepositoryAccessProfileNone
	}
	return trimmed
}

func (s *Store) ListKnowledgeBaseGrantsForSubject(ctx context.Context, workspaceID, subjectType, subjectID string, kbIDs []string) ([]KnowledgeBaseGrant, error) {
	if err := s.ensureDB(); err != nil {
		return nil, err
	}
	ids := make([]string, 0, len(kbIDs))
	seen := make(map[string]struct{}, len(kbIDs))
	for _, id := range kbIDs {
		id = strings.TrimSpace(id)
		if id == "" {
			continue
		}
		if _, ok := seen[id]; ok {
			continue
		}
		seen[id] = struct{}{}
		ids = append(ids, id)
	}
	if len(ids) == 0 {
		return []KnowledgeBaseGrant{}, nil
	}
	var grants []KnowledgeBaseGrant
	if err := s.db.WithContext(ctx).
		Where("workspace_id = ? AND subject_type = ? AND subject_id = ? AND knowledge_base_id IN ?", strings.TrimSpace(workspaceID), strings.TrimSpace(subjectType), strings.TrimSpace(subjectID), ids).
		Find(&grants).Error; err != nil {
		return nil, fmt.Errorf("list knowledge base grants for subject: %w", err)
	}
	return grants, nil
}
