using System;
using AIImages.Services;
using AIImages.Settings;
using AIImages.Validation;
using HarmonyLib;
using RimWorld;
using UnityEngine;
using Verse;
namespace AIImages
{
///
/// Main mod class with settings support and dependency injection
///
public class AIImagesMod : Mod
{
private static AIImagesMod _instance = null!;
private readonly ServiceContainer _serviceContainer;
///
/// Глобальный экземпляр мода (для доступа из других классов)
///
public static AIImagesMod Instance
{
get
{
if (_instance == null)
{
throw new InvalidOperationException(
"[AI Images] Mod instance not initialized. This should not happen."
);
}
return _instance;
}
private set => _instance = value;
}
///
/// Настройки мода
///
public static AIImagesModSettings Settings => Instance._serviceContainer.Settings;
///
/// Контейнер сервисов с dependency injection
///
public static ServiceContainer Services => Instance._serviceContainer;
public AIImagesMod(ModContentPack content)
: base(content)
{
Instance = this;
var settings = GetSettings();
// Валидируем настройки при загрузке
var validationResult = SettingsValidator.Validate(settings);
if (!validationResult.IsValid)
{
Log.Warning(
$"[AI Images] Settings validation failed:\n{validationResult.GetErrorsAsString()}"
);
}
if (validationResult.HasWarnings)
{
Log.Warning(
$"[AI Images] Settings validation warnings:\n{validationResult.GetWarningsAsString()}"
);
}
// Создаем контейнер сервисов
try
{
_serviceContainer = new ServiceContainer(settings);
Log.Message("[AI Images] Mod initialized successfully with dependency injection");
}
catch (Exception ex)
{
Log.Error(
$"[AI Images] Failed to initialize ServiceContainer: {ex.Message}\n{ex.StackTrace}"
);
throw;
}
}
public override void DoSettingsWindowContents(Rect inRect)
{
AIImagesSettingsUI.DoSettingsWindowContents(inRect, Settings, _serviceContainer);
base.DoSettingsWindowContents(inRect);
}
public override string SettingsCategory()
{
return "AI Images";
}
///
/// Вызывается при выгрузке мода
///
public override void WriteSettings()
{
base.WriteSettings();
// Валидируем настройки перед сохранением
var validationResult = SettingsValidator.Validate(Settings);
if (!validationResult.IsValid)
{
Log.Warning(
$"[AI Images] Saving settings with validation errors:\n{validationResult.GetErrorsAsString()}"
);
Messages.Message(
"AI Images: Some settings have validation errors. Check the log.",
MessageTypeDefOf.CautionInput
);
}
}
}
///
/// Static constructor for Harmony patches
///
[StaticConstructorOnStartup]
public static class AIImagesHarmonyPatcher
{
static AIImagesHarmonyPatcher()
{
var harmony = new Harmony("Mrleo1nid.aiimages");
harmony.PatchAll();
Log.Message("[AI Images] Harmony patches applied successfully");
}
}
}