package message

import (
	"context"
	"fmt"
	"strings"

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

type archivedMessageIndexRecord struct {
	MessageID      string
	MessageShortID string
	Seq            int64
}

func loadArchivedMessageIndexByID(ctx context.Context, queryer coredb.QueryRower, workspaceID string, scopeID string, messageID string) (archivedMessageIndexRecord, bool, error) {
	row := queryer.QueryRow(ctx, `
SELECT message_id, message_short_id, seq
FROM scope_archived_messages
WHERE workspace_id = $1
  AND scope_id = $2
  AND message_id = $3
LIMIT 1
`, strings.TrimSpace(workspaceID), strings.TrimSpace(scopeID), strings.TrimSpace(messageID))

	var record archivedMessageIndexRecord
	if err := row.Scan(&record.MessageID, &record.MessageShortID, &record.Seq); err != nil {
		if coredb.IsNotFound(err) {
			return archivedMessageIndexRecord{}, false, nil
		}
		return archivedMessageIndexRecord{}, false, fmt.Errorf("load archived message index by id: %w", err)
	}
	return record, true, nil
}

func resolveArchivedMessageIndexByShortID(ctx context.Context, queryer coredb.Queryer, workspaceID string, scopeID string, lowBound string, highBound string) (archivedMessageIndexRecord, bool, error) {
	rows, err := queryer.Query(ctx, `
SELECT message_id, message_short_id, seq
FROM scope_archived_messages
WHERE workspace_id = $1
  AND scope_id = $2
  AND message_short_id >= $3
  AND message_short_id <= $4
ORDER BY message_short_id, message_id
LIMIT 2
`, strings.TrimSpace(workspaceID), strings.TrimSpace(scopeID), lowBound, highBound)
	if err != nil {
		return archivedMessageIndexRecord{}, false, fmt.Errorf("query archived message index by short id: %w", err)
	}
	defer rows.Close()

	if !rows.Next() {
		if err := rows.Err(); err != nil {
			return archivedMessageIndexRecord{}, false, fmt.Errorf("iterate archived message index: %w", err)
		}
		return archivedMessageIndexRecord{}, false, nil
	}
	var record archivedMessageIndexRecord
	if err := rows.Scan(&record.MessageID, &record.MessageShortID, &record.Seq); err != nil {
		return archivedMessageIndexRecord{}, false, fmt.Errorf("scan archived message index: %w", err)
	}
	if rows.Next() {
		return archivedMessageIndexRecord{}, false, conflict("thread identifier is ambiguous")
	}
	if err := rows.Err(); err != nil {
		return archivedMessageIndexRecord{}, false, fmt.Errorf("iterate archived message index: %w", err)
	}
	return record, true, nil
}
