package reporting

import (
	"context"
	"testing"
	"time"

	"github.com/DATA-DOG/go-sqlmock"
	"github.com/stretchr/testify/require"

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

func TestUpsertKnowledgeQAFeedbackStoresBoundedSnapshotAndReturnsCurrentState(t *testing.T) {
	sqlDB, mock, err := sqlmock.New()
	require.NoError(t, err)
	defer sqlDB.Close()

	now := time.Date(2026, 8, 11, 12, 0, 0, 0, time.UTC)
	mock.ExpectExec(`(?s)INSERT INTO knowledge_qa_feedback.*ON DUPLICATE KEY UPDATE`).
		WithArgs(
			sqlmock.AnyArg(), "wsp_1", "org_1", "thr_1", "kqs_1", "kqt_1",
			"usr_1", KnowledgeQAFeedbackRatingProblem, `["incorrect"]`,
			"The setting moved", "Where is the setting?", "Use Settings.",
			`{"schemaVersion":1}`, "new", now, now,
		).
		WillReturnResult(sqlmock.NewResult(1, 1))
	mock.ExpectQuery(`(?s)SELECT id, turn_id, rating, reasons_json, comment, updated_at.*WHERE workspace_id=\? AND reporter_user_id=\? AND turn_id=\?`).
		WithArgs("wsp_1", "usr_1", "kqt_1").
		WillReturnRows(sqlmock.NewRows([]string{
			"id", "turn_id", "rating", "reasons_json", "comment", "updated_at",
		}).AddRow(
			"kqf_1", "kqt_1", KnowledgeQAFeedbackRatingProblem,
			[]byte(`["incorrect"]`), "The setting moved", now,
		))

	feedback, err := New(coredb.WrapSQLDB(sqlDB), nil, Options{}).UpsertKnowledgeQAFeedback(
		context.Background(),
		UpsertKnowledgeQAFeedbackParams{
			WorkspaceID: " wsp_1 ", OrganizationID: "org_1",
			ThreadChannelID: "thr_1", SessionID: "kqs_1", TurnID: "kqt_1",
			ReporterUserID: "usr_1", Rating: "problem",
			Reasons: []string{" incorrect ", "incorrect"},
			Comment: " The setting moved ", Question: " Where is the setting? ",
			Answer: " Use Settings. ", ContextJSON: []byte(`{"schemaVersion":1}`),
			Now: now,
		},
	)
	require.NoError(t, err)
	require.Equal(t, "kqf_1", feedback.ID)
	require.Equal(t, []string{"incorrect"}, feedback.Reasons)
	require.NoError(t, mock.ExpectationsWereMet())
}

func TestNormalizeKnowledgeQAFeedbackRejectsUnknownReasonAndInvalidContext(t *testing.T) {
	base := UpsertKnowledgeQAFeedbackParams{
		WorkspaceID: "wsp_1", OrganizationID: "org_1", ThreadChannelID: "thr_1",
		SessionID: "kqs_1", TurnID: "kqt_1", ReporterUserID: "usr_1",
		Rating: "problem", Question: "Question", Answer: "Answer",
		ContextJSON: []byte(`{"schemaVersion":1}`), Now: time.Now(),
	}

	unknown := base
	unknown.Reasons = []string{"unknown"}
	_, err := normalizeKnowledgeQAFeedback(unknown)
	require.ErrorIs(t, err, ErrBadRequest)

	invalidContext := base
	invalidContext.ContextJSON = []byte(`not-json`)
	_, err = normalizeKnowledgeQAFeedback(invalidContext)
	require.ErrorIs(t, err, ErrBadRequest)
}
