package repository

import (
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
	"hyapp-admin-server/internal/model"
)

func TestNormalizeUserTeamUsesTeamID(t *testing.T) {
	store, mock, closeStore := newRepositorySQLMock(t)
	defer closeStore()

	mock.ExpectQuery("SELECT \\* FROM `admin_teams` WHERE `admin_teams`.`id` = \\? ORDER BY `admin_teams`.`id` LIMIT \\?").
		WithArgs(model.TeamOperationsID, 1).
		WillReturnRows(sqlmock.NewRows([]string{"id", "name", "description", "sort", "created_at_ms", "updated_at_ms"}).
			AddRow(model.TeamOperationsID, "运营团队", "运营后台用户", 2, int64(1700000000000), int64(1700000000000)))

	inputTeamID := model.TeamOperationsID
	teamID, teamName, err := store.NormalizeUserTeam(&inputTeamID, "平台运营")
	if err != nil {
		t.Fatalf("normalize team by id failed: %v", err)
	}
	if teamID == nil || *teamID != model.TeamOperationsID || teamName != "运营团队" {
		t.Fatalf("normalized team mismatch: id=%v name=%q", teamID, teamName)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("sql expectations mismatch: %v", err)
	}
}

func TestNormalizeUserTeamKeepsLegacyNameWhenTeamMissing(t *testing.T) {
	store, mock, closeStore := newRepositorySQLMock(t)
	defer closeStore()

	mock.ExpectQuery("SELECT \\* FROM `admin_teams` WHERE name = \\? ORDER BY `admin_teams`.`id` LIMIT \\?").
		WithArgs("外包团队", 1).
		WillReturnRows(sqlmock.NewRows([]string{"id", "name", "description", "sort", "created_at_ms", "updated_at_ms"}))

	teamID, teamName, err := store.NormalizeUserTeam(nil, " 外包团队 ")
	if err != nil {
		t.Fatalf("normalize legacy team failed: %v", err)
	}
	if teamID != nil || teamName != "外包团队" {
		t.Fatalf("legacy team should be preserved, got id=%v name=%q", teamID, teamName)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("sql expectations mismatch: %v", err)
	}
}

func TestTeamAndChildIDsReturnsParentAndChildren(t *testing.T) {
	store, mock, closeStore := newRepositorySQLMock(t)
	defer closeStore()

	mock.ExpectQuery("SELECT `id` FROM `admin_teams` WHERE parent_id = \\? ORDER BY sort DESC, id ASC").
		WithArgs(model.TeamOperationsID).
		WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(11).AddRow(12))

	ids, err := store.TeamAndChildIDs(model.TeamOperationsID)
	if err != nil {
		t.Fatalf("load team ids failed: %v", err)
	}
	if len(ids) != 3 || ids[0] != model.TeamOperationsID || ids[1] != 11 || ids[2] != 12 {
		t.Fatalf("team ids mismatch: %#v", ids)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatalf("sql expectations mismatch: %v", err)
	}
}
