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 setupTeamUpdateTestDB(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.EngineerTeam{})
	if err != nil {
		t.Fatalf("failed to migrate: %v", err)
	}
}

func TestUpdateTeam_DescriptionCanBeUpdated(t *testing.T) {
	setupTeamUpdateTestDB(t)

	cat := models.Team{
		Name:        "Test Cat",
		DisplayName: "Test Cat",
		Description: "old description",
	}
	if err := db.DB.Create(&cat).Error; err != nil {
		t.Fatalf("create team: %v", err)
	}

	s := &ScheduleService{}
	newDesc := "new description for team"
	if err := s.UpdateTeam(cat.ID, UpdateTeamRequest{Description: &newDesc}); err != nil {
		t.Fatalf("UpdateTeam returned error: %v", err)
	}

	var got models.Team
	if err := db.DB.First(&got, cat.ID).Error; err != nil {
		t.Fatalf("query team: %v", err)
	}
	if got.Description != newDesc {
		t.Fatalf("description mismatch, want %q, got %q", newDesc, got.Description)
	}
}

func TestUpdateTeam_DescriptionCanBeCleared(t *testing.T) {
	setupTeamUpdateTestDB(t)

	cat := models.Team{
		Name:        "Test Cat",
		DisplayName: "Test Cat",
		Description: "to be cleared",
	}
	if err := db.DB.Create(&cat).Error; err != nil {
		t.Fatalf("create team: %v", err)
	}

	s := &ScheduleService{}
	empty := ""
	if err := s.UpdateTeam(cat.ID, UpdateTeamRequest{Description: &empty}); err != nil {
		t.Fatalf("UpdateTeam returned error: %v", err)
	}

	var got models.Team
	if err := db.DB.First(&got, cat.ID).Error; err != nil {
		t.Fatalf("query team: %v", err)
	}
	if got.Description != "" {
		t.Fatalf("description should be cleared, got %q", got.Description)
	}
}
