package packs

import (
	"context"
	"strings"
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
	"github.com/nexuscrm/shared/pkg/models"
)

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

	rule := models.ValidationRule{ID: "vrule_issue_subject_required", ObjectAPIName: "Issue", Name: "Issue_Subject_Required", Active: true, Condition: "ISBLANK(Subject)", ErrorMessage: "Subject is required"}
	mock.ExpectQuery("SELECT Id, OwnerPack").
		WithArgs("Issue", "Issue_Subject_Required").
		WillReturnRows(sqlmock.NewRows([]string{"Id", "OwnerPack"}).AddRow("vrule_admin_issue_subject_required", ""))

	err = applyStandardValidationRuleSeeds(context.Background(), db, []models.ValidationRule{rule}, "jira-like-sample")
	if err == nil {
		t.Fatal("applyStandardValidationRuleSeeds = nil, want ownerless conflict")
	}
	if !strings.Contains(err.Error(), `OwnerPack = ""`) {
		t.Fatalf("error = %v, want ownerless OwnerPack conflict", err)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("sql expectations: %v", err)
	}
}

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

	rule := models.ValidationRule{ID: "vrule_issue_subject_required", ObjectAPIName: "Issue", Name: "Issue_Subject_Required", Active: true, Condition: "ISBLANK(Subject)", ErrorMessage: "Subject is required"}
	mock.ExpectExec("INSERT INTO _System_ValidationRule").
		WithArgs("vrule_issue_subject_required", "Issue", "Issue_Subject_Required", nil, true, "ISBLANK(Subject)", "Subject is required", nil, nil, "jira-like-sample").
		WillReturnResult(sqlmock.NewResult(0, 1))
	mock.ExpectQuery("SELECT Id, OwnerPack").
		WithArgs("Issue", "Issue_Subject_Required").
		WillReturnRows(sqlmock.NewRows([]string{"Id", "OwnerPack"}).AddRow("vrule_admin_issue_subject_required", ""))

	err = upsertStandardValidationRule(context.Background(), db, rule, "jira-like-sample")
	if err == nil {
		t.Fatal("upsertStandardValidationRule = nil, want ownerless post-upsert conflict")
	}
	if !strings.Contains(err.Error(), `OwnerPack = ""`) {
		t.Fatalf("error = %v, want ownerless OwnerPack conflict", err)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("sql expectations: %v", err)
	}
}
