package net.mcreator.phayriosisreborn.config;

import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.saveddata.SavedData;
import net.mcreator.phayriosisreborn.network.PhayriosisrebornModVariables;

/**
 * Per-world configuration backend introduced before the Create World UI.
 * It is deliberately separate from legacy MapVariables, which also contains runtime state.
 */
public final class PhayriosisWorldSettings extends SavedData {
    public static final String DATA_NAME = "phayriosisreborn_world_settings";
    public static final double CURRENT_SCHEMA = 2.0D;

    public double schemaVersion = CURRENT_SCHEMA;
    public boolean initialized = false;
    public boolean worldCreationConfigured = false;

    // Existing Phayriosis configuration surface.
    public boolean blockSpreadEnabled = true;
    public boolean playerConversionEnabled = true;
    public boolean conversionsEnabled = true;
    public boolean phaseFreezeEnabled = false;
    public boolean parasiteSpawningEnabled = false;
    public boolean dimensionalSpawningEnabled = true;
    public boolean nightmareModeEnabled = false;
    // 0=Easy, 1=Normal, 2=Advanced, 3=Hard, 4=Nightmare.
    public double infectionDifficultyMode = 1.0D;
    public double maxInfectableHardness = 2.9D;
    public double blockSpreadSpeed = 3.0D;

    // Meteor settings are persisted now so the later event/UI can bind to a stable schema.
    // They are intentionally dormant in Phase 2 and therefore cannot alter gameplay yet.
    public boolean meteorEnabled = false;
    public double meteorMinimumDay = 7.0D;
    public double meteorMinimumPhase = 1.0D;
    public double meteorCheckIntervalTicks = 3600.0D;
    public double meteorChance = 0.5D;
    public double meteorMinDistance = 210.0D;
    public double meteorMaxDistance = 250.0D;
    public double meteorSizeScale = 2.0D;
    public boolean meteorFragmentsEnabled = true;
    public boolean meteorInfectionEnabled = true;

    private static final PhayriosisWorldSettings CLIENT_FALLBACK = new PhayriosisWorldSettings();

    public PhayriosisWorldSettings() {}

    public static PhayriosisWorldSettings load(CompoundTag tag) {
        PhayriosisWorldSettings data = new PhayriosisWorldSettings();
        data.read(tag);
        return data;
    }

    public void read(CompoundTag tag) {
        if (tag.m_128441_("schemaVersion")) schemaVersion = tag.m_128459_("schemaVersion");
        if (tag.m_128441_("initialized")) initialized = tag.m_128471_("initialized");
        if (tag.m_128441_("worldCreationConfigured")) worldCreationConfigured = tag.m_128471_("worldCreationConfigured");
        if (tag.m_128441_("blockSpreadEnabled")) blockSpreadEnabled = tag.m_128471_("blockSpreadEnabled");
        if (tag.m_128441_("playerConversionEnabled")) playerConversionEnabled = tag.m_128471_("playerConversionEnabled");
        if (tag.m_128441_("conversionsEnabled")) conversionsEnabled = tag.m_128471_("conversionsEnabled");
        if (tag.m_128441_("phaseFreezeEnabled")) phaseFreezeEnabled = tag.m_128471_("phaseFreezeEnabled");
        if (tag.m_128441_("parasiteSpawningEnabled")) parasiteSpawningEnabled = tag.m_128471_("parasiteSpawningEnabled");
        if (tag.m_128441_("dimensionalSpawningEnabled")) dimensionalSpawningEnabled = tag.m_128471_("dimensionalSpawningEnabled");
        if (tag.m_128441_("nightmareModeEnabled")) nightmareModeEnabled = tag.m_128471_("nightmareModeEnabled");
        boolean hasDifficultyMode = tag.m_128441_("infectionDifficultyMode");
        if (hasDifficultyMode) infectionDifficultyMode = tag.m_128459_("infectionDifficultyMode");
        if (tag.m_128441_("maxInfectableHardness")) maxInfectableHardness = tag.m_128459_("maxInfectableHardness");
        if (tag.m_128441_("blockSpreadSpeed")) blockSpreadSpeed = tag.m_128459_("blockSpreadSpeed");
        if (tag.m_128441_("meteorEnabled")) meteorEnabled = tag.m_128471_("meteorEnabled");
        if (tag.m_128441_("meteorMinimumDay")) meteorMinimumDay = tag.m_128459_("meteorMinimumDay");
        if (tag.m_128441_("meteorMinimumPhase")) meteorMinimumPhase = tag.m_128459_("meteorMinimumPhase");
        if (tag.m_128441_("meteorCheckIntervalTicks")) meteorCheckIntervalTicks = tag.m_128459_("meteorCheckIntervalTicks");
        if (tag.m_128441_("meteorChance")) meteorChance = tag.m_128459_("meteorChance");
        if (tag.m_128441_("meteorMinDistance")) meteorMinDistance = tag.m_128459_("meteorMinDistance");
        if (tag.m_128441_("meteorMaxDistance")) meteorMaxDistance = tag.m_128459_("meteorMaxDistance");
        if (tag.m_128441_("meteorSizeScale")) meteorSizeScale = tag.m_128459_("meteorSizeScale");
        if (tag.m_128441_("meteorFragmentsEnabled")) meteorFragmentsEnabled = tag.m_128471_("meteorFragmentsEnabled");
        if (tag.m_128441_("meteorInfectionEnabled")) meteorInfectionEnabled = tag.m_128471_("meteorInfectionEnabled");
        if (!hasDifficultyMode) infectionDifficultyMode = nightmareModeEnabled ? 4.0D : 1.0D;
    }

    @Override
    public CompoundTag m_7176_(CompoundTag tag) {
        tag.m_128347_("schemaVersion", schemaVersion);
        tag.m_128379_("initialized", initialized);
        tag.m_128379_("worldCreationConfigured", worldCreationConfigured);
        tag.m_128379_("blockSpreadEnabled", blockSpreadEnabled);
        tag.m_128379_("playerConversionEnabled", playerConversionEnabled);
        tag.m_128379_("conversionsEnabled", conversionsEnabled);
        tag.m_128379_("phaseFreezeEnabled", phaseFreezeEnabled);
        tag.m_128379_("parasiteSpawningEnabled", parasiteSpawningEnabled);
        tag.m_128379_("dimensionalSpawningEnabled", dimensionalSpawningEnabled);
        tag.m_128379_("nightmareModeEnabled", nightmareModeEnabled);
        tag.m_128347_("infectionDifficultyMode", infectionDifficultyMode);
        tag.m_128347_("maxInfectableHardness", maxInfectableHardness);
        tag.m_128347_("blockSpreadSpeed", blockSpreadSpeed);
        tag.m_128379_("meteorEnabled", meteorEnabled);
        tag.m_128347_("meteorMinimumDay", meteorMinimumDay);
        tag.m_128347_("meteorMinimumPhase", meteorMinimumPhase);
        tag.m_128347_("meteorCheckIntervalTicks", meteorCheckIntervalTicks);
        tag.m_128347_("meteorChance", meteorChance);
        tag.m_128347_("meteorMinDistance", meteorMinDistance);
        tag.m_128347_("meteorMaxDistance", meteorMaxDistance);
        tag.m_128347_("meteorSizeScale", meteorSizeScale);
        tag.m_128379_("meteorFragmentsEnabled", meteorFragmentsEnabled);
        tag.m_128379_("meteorInfectionEnabled", meteorInfectionEnabled);
        return tag;
    }

    public static PhayriosisWorldSettings get(LevelAccessor world) {
        if (world instanceof ServerLevelAccessor serverAccess) {
            return serverAccess.m_6018_().m_7654_().m_129880_(Level.f_46428_).m_8895_()
                    .m_164861_(PhayriosisWorldSettings::load, PhayriosisWorldSettings::new, DATA_NAME);
        }
        return CLIENT_FALLBACK;
    }

    /**
     * Compatibility bridge used only until the Create World screen owns these values.
     * Existing worlds preserve their current Phayriosis choices instead of being reset.
     */
    public static void mirrorLegacy(LevelAccessor world) {
        if (!(world instanceof ServerLevelAccessor)) return;
        PhayriosisWorldSettings settings = get(world);
        if (settings.worldCreationConfigured) return;
        PhayriosisrebornModVariables.MapVariables legacy = PhayriosisrebornModVariables.MapVariables.get(world);
        if (legacy == null) return;
        settings.blockSpreadEnabled = legacy.blockspread;
        settings.playerConversionEnabled = legacy.playerconversion;
        settings.conversionsEnabled = legacy.conversions;
        settings.phaseFreezeEnabled = legacy.phasefrozen;
        settings.parasiteSpawningEnabled = legacy.doparasitesspawn;
        settings.dimensionalSpawningEnabled = legacy.doparasitesspawndimension;
        settings.nightmareModeEnabled = legacy.nightmaremode;
        settings.infectionDifficultyMode = legacy.nightmaremode ? 4.0D : 1.0D;
        settings.maxInfectableHardness = legacy.maxhardness;
        settings.blockSpreadSpeed = legacy.blockspreadspeed;
        settings.schemaVersion = CURRENT_SCHEMA;
        settings.initialized = true;
        settings.m_77762_();
    }

    public static void ensureInitialized(LevelAccessor world) {
        PhayriosisPendingWorldSettings.consumeInto(world);
        mirrorLegacy(world);
    }
}
