package service

import (
	"testing"

	"github.com/tidbcloud/aisupport/services/oncall/db"
	"github.com/tidbcloud/aisupport/services/oncall/models"

	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

func setupPrivilegeTestDB(t *testing.T) {
	t.Helper()

	var err error
	db.DB, err = gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
	if err != nil {
		t.Fatalf("failed to connect sqlite: %v", err)
	}

	err = db.DB.AutoMigrate(&models.Team{}, &models.Engineer{}, &models.ShiftInterval{})
	if err != nil {
		t.Fatalf("failed to migrate: %v", err)
	}
}

func TestBuildPrivilegePreview_BatchesBySegmentEndTime(t *testing.T) {
	setupPrivilegeTestDB(t)

	catA := models.Team{Name: "cat_a", DisplayName: "Team A", GroupNames: models.StringList{"ONCALL"}}
	catB := models.Team{Name: "cat_b", DisplayName: "Team B", GroupNames: models.StringList{"ONCALL"}}
	catC := models.Team{Name: "cat_c", DisplayName: "Team C", GroupNames: models.StringList{"ONCALL"}}
	for _, cat := range []*models.Team{&catA, &catB, &catC} {
		if err := db.DB.Create(cat).Error; err != nil {
			t.Fatalf("create team: %v", err)
		}
	}

	engA := models.Engineer{Name: "Alice", Email: "alice@pingcap.com"}
	engB := models.Engineer{Name: "Bob", Email: "bob@pingcap.com"}
	engC := models.Engineer{Name: "Carol", Email: "carol@pingcap.com"}
	for _, eng := range []*models.Engineer{&engA, &engB, &engC} {
		if err := db.DB.Create(eng).Error; err != nil {
			t.Fatalf("create engineer: %v", err)
		}
	}

	rows := []models.ShiftInterval{
		{TeamID: catA.ID, EngineerID: engA.ID, StartTime: 100, EndTime: 199, Overlay: 0, IsBackup: false, SourceType: "cycle-generate"},
		{TeamID: catB.ID, EngineerID: engB.ID, StartTime: 100, EndTime: 199, Overlay: 0, IsBackup: false, SourceType: "cycle-generate"},
		{TeamID: catC.ID, EngineerID: engC.ID, StartTime: 100, EndTime: 299, Overlay: 1, IsBackup: false, SourceType: "manual-edit"},
	}
	for _, row := range rows {
		if err := db.DB.Create(&row).Error; err != nil {
			t.Fatalf("create shift interval: %v", err)
		}
	}

	s := &ScheduleService{}
	preview, err := s.BuildPrivilegePreview("ONCALL", 180, false)
	if err != nil {
		t.Fatalf("BuildPrivilegePreview err: %v", err)
	}
	for _, batch := range preview.Batches {
		t.Logf("batch expired_at=%d oncallers=%v rows=%+v", batch.Request.ExpiredAt, batch.Request.Oncallers, batch.Rows)
	}
	if len(preview.Batches) != 2 {
		t.Fatalf("expected 2 batches, got %d", len(preview.Batches))
	}
	if preview.Batches[0].Request.ExpiredAt != 199 {
		t.Fatalf("expected first batch expired_at 199, got %d", preview.Batches[0].Request.ExpiredAt)
	}
	if len(preview.Batches[0].Request.Oncallers) != 2 {
		t.Fatalf("expected 2 oncallers in first batch, got %d", len(preview.Batches[0].Request.Oncallers))
	}
	if preview.Batches[1].Request.ExpiredAt != 299 {
		t.Fatalf("expected second batch expired_at 299, got %d", preview.Batches[1].Request.ExpiredAt)
	}
	if len(preview.Batches[1].Request.Oncallers) != 1 || preview.Batches[1].Request.Oncallers[0] != "carol@pingcap.com" {
		t.Fatalf("unexpected second batch oncallers: %+v", preview.Batches[1].Request.Oncallers)
	}
}
