package main

import (
	"os"
	"path/filepath"
	"testing"
)

func TestSaveLoadWayfarerShipRoundTrip(t *testing.T) {
	withTempConfigDir(t)
	s := NewWayfarerShip(wayfarerStartSystem)
	s.Credits = 12345
	s.RegularMissiles = 1
	if err := SaveWayfarerShip(s); err != nil {
		t.Fatalf("неожиданная ошибка сохранения: %v", err)
	}

	loaded, err := LoadWayfarerShip()
	if err != nil {
		t.Fatalf("неожиданная ошибка загрузки: %v", err)
	}
	if loaded.Credits != 12345 {
		t.Errorf("кредиты не сохранились корректно, получено %v", loaded.Credits)
	}
	if loaded.MissileCapacity != 2 {
		t.Errorf("ожидалась вместимость ракетных слотов 2, получено %d", loaded.MissileCapacity)
	}
	if loaded.RegularMissiles != 1 {
		t.Errorf("боезапас ракет не сохранился корректно, получено %d", loaded.RegularMissiles)
	}
}

// TestLoadWayfarerShipMigratesMissingMissileCapacity — регрессия:
// поле MissileCapacity появилось позже, чем базовое сохранение
// Странника. У сохранений, созданных ДО этого, поле в JSON
// отсутствует вовсе, и при десериализации остаётся нулевым — из-за
// чего "свободных ракетных слотов" не было НИКОГДА, даже если ракет
// на борту нет вовсе (0 >= 0). Загрузка должна восстанавливать
// разумное значение по умолчанию.
func TestLoadWayfarerShipMigratesMissingMissileCapacity(t *testing.T) {
	withTempConfigDir(t)
	oldSaveJSON := `{
		"Credits": 500,
		"FuelCapacity": 7,
		"Fuel": 7,
		"CargoCapacity": 20,
		"MaxHull": 100,
		"Hull": 100,
		"MaxShield": 50,
		"Shield": 50,
		"LaserPower": 12,
		"CurrentSystem": "0:0"
	}`
	path, err := wayfarerSavePath()
	if err != nil {
		t.Fatalf("неожиданная ошибка получения пути сохранения: %v", err)
	}
	if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
		t.Fatalf("не удалось создать директорию сохранения: %v", err)
	}
	if err := os.WriteFile(path, []byte(oldSaveJSON), 0o644); err != nil {
		t.Fatalf("не удалось записать тестовое сохранение: %v", err)
	}

	loaded, err := LoadWayfarerShip()
	if err != nil {
		t.Fatalf("неожиданная ошибка загрузки старого сохранения: %v", err)
	}
	if loaded.MissileCapacity != 2 {
		t.Errorf("ожидалась миграция вместимости ракетных слотов к значению по умолчанию (2), получено %d", loaded.MissileCapacity)
	}
	if loaded.RegularMissiles != 0 || loaded.HomingMissiles != 0 {
		t.Errorf("в старом сохранении ракет не было — ожидались нулевые значения")
	}
	if loaded.MissilesLoaded() >= loaded.MissileCapacity {
		t.Errorf("после миграции покупка ракеты должна была стать возможной, но MissilesLoaded()=%d >= MissileCapacity=%d",
			loaded.MissilesLoaded(), loaded.MissileCapacity)
	}
	if err := loaded.BuyMissile(WayfarerWeaponMissileRegular, 1); err != nil {
		t.Errorf("покупка ракеты после миграции должна была пройти успешно, получено: %v", err)
	}
}
