package app

import (
	"context"
	"errors"
	"fmt"
	"strings"

	"github.com/go-sql-driver/mysql"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

func deleteKnowledgeBaseAgentGrantsForAgentIDs(ctx context.Context, execer coredb.QueryExecer, workspaceID string, agentIDs []string) error {
	trimmedWorkspaceID := strings.TrimSpace(workspaceID)
	if trimmedWorkspaceID == "" || len(agentIDs) == 0 {
		return nil
	}
	seen := make(map[string]struct{}, len(agentIDs))
	for _, agentID := range agentIDs {
		trimmedAgentID := strings.TrimSpace(agentID)
		if trimmedAgentID == "" {
			continue
		}
		if _, ok := seen[trimmedAgentID]; ok {
			continue
		}
		seen[trimmedAgentID] = struct{}{}
		if _, err := execer.Exec(ctx, `
DELETE FROM knowledge_base_grants
WHERE workspace_id = $1
  AND subject_type = 'agent'
  AND subject_id = $2
`, trimmedWorkspaceID, trimmedAgentID); err != nil {
			if isMissingKnowledgeBaseGrantsTable(err) {
				return nil
			}
			return fmt.Errorf("delete knowledge base agent grants: %w", err)
		}
	}
	return nil
}

func isMissingKnowledgeBaseGrantsTable(err error) bool {
	var mysqlErr *mysql.MySQLError
	if errors.As(err, &mysqlErr) && mysqlErr.Number == 1146 {
		return true
	}
	message := strings.ToLower(err.Error())
	return strings.Contains(message, "knowledge_base_grants") && strings.Contains(message, "doesn't exist")
}
