package packs

import (
	"context"
	"regexp"
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
)

func TestReconcileStoppedSourceSetFlowDefinitionUsesExistingLegacyID(t *testing.T) {
	db, mock, err := sqlmock.New()
	if err != nil {
		t.Fatalf("sqlmock.New: %v", err)
	}
	defer db.Close()

	const (
		developerName = "Legacy_Flow"
		definitionID  = "legacy-flow-definition-id"
		versionID     = "legacy-flow-version-id"
	)

	mock.ExpectQuery(regexp.QuoteMeta(`
SELECT Id
FROM FlowDefinition
WHERE DeveloperName = ?
LIMIT 1`)).
		WithArgs(developerName).
		WillReturnRows(sqlmock.NewRows([]string{"Id"}).AddRow(definitionID))
	mock.ExpectBegin()
	mock.ExpectQuery(`(?s)SELECT.*FROM FlowDefinition fd.*WHERE fd\.Id = \?.*FOR UPDATE`).
		WithArgs(definitionID).
		WillReturnRows(sqlmock.NewRows([]string{
			"Id", "DeveloperName", "ProcessType", "ActiveVersionId",
			"VersionId", "DefinitionId", "VersionNumber", "Status",
			"Description", "VersionProcessType", "Metadata", "Source", "IsDeleted",
		}).AddRow(
			definitionID,
			developerName,
			"AutoLaunchedFlow",
			versionID,
			versionID,
			definitionID,
			1,
			"Active",
			"",
			"AutoLaunchedFlow",
			`{"start":{"triggerType":"RecordAfterSave","recordTriggerType":"Create","object":"ProbeObject"}}`,
			"standard",
			false,
		))
	mock.ExpectQuery(`(?s)SELECT KeyPrefix.*FROM _System_Object.*LOWER\(ApiName\) = LOWER\(\?\)`).
		WithArgs("ProbeObject").
		WillReturnRows(sqlmock.NewRows([]string{"KeyPrefix"}).AddRow("a00"))
	mock.ExpectExec(regexp.QuoteMeta(`UPDATE _System_TriggerSubscription SET IsActive = 0, LastModifiedDate = NOW() WHERE FlowDefinitionId = ?`)).
		WithArgs(definitionID).
		WillReturnResult(sqlmock.NewResult(0, 1))
	mock.ExpectExec(`(?s)INSERT INTO _System_TriggerSubscription.*ON DUPLICATE KEY UPDATE`).
		WithArgs(
			sqlmock.AnyArg(),
			"a00",
			"RecordAfterSave",
			"Create",
			definitionID,
			versionID,
			true,
		).
		WillReturnResult(sqlmock.NewResult(1, 1))
	mock.ExpectCommit()

	if err := reconcileStoppedSourceSetFlowDefinition(context.Background(), db, developerName); err != nil {
		t.Fatalf("reconcileStoppedSourceSetFlowDefinition: %v", err)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("unmet SQL expectations: %v", err)
	}
}
