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"); } } }