package db

import (
	"errors"
	"testing"

	"github.com/pingcap/agent-git-service/internal/tenant"
)

func TestClaimTenantCreatesAndVerifiesSingleton(t *testing.T) {
	gdb := openTiDB(t)
	if err := gdb.AutoMigrate(&TenantMetadata{}); err != nil {
		t.Fatalf("AutoMigrate: %v", err)
	}

	if err := ClaimTenant(gdb, tenant.ID("clawmem")); err != nil {
		t.Fatalf("first claim: %v", err)
	}
	if err := ClaimTenant(gdb, tenant.ID("clawmem")); err != nil {
		t.Fatalf("repeat claim: %v", err)
	}

	var rows []TenantMetadata
	if err := gdb.Find(&rows).Error; err != nil {
		t.Fatalf("load metadata: %v", err)
	}
	if len(rows) != 1 || rows[0].TenantID != "clawmem" {
		t.Fatalf("metadata = %#v, want one clawmem row", rows)
	}
}

func TestClaimTenantRejectsDifferentOwner(t *testing.T) {
	gdb := openTiDB(t)
	if err := gdb.AutoMigrate(&TenantMetadata{}); err != nil {
		t.Fatalf("AutoMigrate: %v", err)
	}
	if err := ClaimTenant(gdb, tenant.ID("clawmem")); err != nil {
		t.Fatalf("first claim: %v", err)
	}

	err := ClaimTenant(gdb, tenant.ID("engineering"))
	if !errors.Is(err, ErrTenantOwnershipMismatch) {
		t.Fatalf("ClaimTenant error = %v, want ErrTenantOwnershipMismatch", err)
	}
}

func TestClaimTenantClaimsConfiguredLegacyDatabase(t *testing.T) {
	gdb := openTiDB(t)
	if err := gdb.AutoMigrate(&User{}); err != nil {
		t.Fatalf("create legacy business table: %v", err)
	}

	if err := ClaimTenant(gdb, tenant.ID("clawmem")); err != nil {
		t.Fatalf("claim configured legacy database: %v", err)
	}
	var metadata TenantMetadata
	if err := gdb.First(&metadata, "singleton_id = ?", 1).Error; err != nil {
		t.Fatalf("load tenant metadata: %v", err)
	}
	if metadata.TenantID != "clawmem" {
		t.Fatalf("tenant metadata = %#v, want clawmem", metadata)
	}
}

func TestClaimTenantClaimsPartiallyMigratedDatabase(t *testing.T) {
	gdb := openTiDB(t)
	if err := gdb.AutoMigrate(&AuditLogEntry{}); err != nil {
		t.Fatalf("create partial AGS table: %v", err)
	}

	if err := ClaimTenant(gdb, tenant.ID("ags")); err != nil {
		t.Fatalf("claim partially migrated database: %v", err)
	}
	var metadata TenantMetadata
	if err := gdb.First(&metadata, "singleton_id = ?", 1).Error; err != nil {
		t.Fatalf("load tenant metadata: %v", err)
	}
	if metadata.TenantID != "ags" {
		t.Fatalf("tenant metadata = %#v, want ags", metadata)
	}
}
