package net.mcreator.phayriosisreborn.client.gui;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.mcreator.phayriosisreborn.config.PhayriosisPendingWorldSettings;

/** World-creation settings UI with a lightweight pixel-art meteor preview. */
public final class PhayriosisWorldCreationScreen extends Screen {
    private static final int METEOR = 0;
    private static final int INFECTION_DIFFICULTY = 1;
    private static final int INFECTION_CONFIG = 2;
    private static final int ADVANCED = 3;

    private final Screen parent;
    private final int section;

    public PhayriosisWorldCreationScreen(Screen parent) {
        this(parent, METEOR);
    }

    private PhayriosisWorldCreationScreen(Screen parent, int section) {
        super(Component.m_237113_(titleFor(section)));
        this.parent = parent;
        this.section = section;
        PhayriosisPendingWorldSettings.beginDraft();
    }

    private static String titleFor(int section) {
        switch (section) {
            case INFECTION_DIFFICULTY: return "Phayriosis - Infection Difficulty";
            case INFECTION_CONFIG: return "Phayriosis - Infection Config";
            case ADVANCED: return "Phayriosis - Advanced";
            default: return "Phayriosis - Meteor";
        }
    }

    @Override
    public void m_7856_() {
        super.m_7856_();
        int cx = this.f_96543_ / 2;
        int tabY = Math.max(12, this.f_96544_ / 2 - 112);
        int tabX = cx - 187;

        add(tabName("Meteor", METEOR), tabX, tabY, 68, 20, () -> switchSection(METEOR));
        add(tabName("Infection Difficulty", INFECTION_DIFFICULTY), tabX + 72, tabY, 112, 20, () -> switchSection(INFECTION_DIFFICULTY));
        add(tabName("Infection Config", INFECTION_CONFIG), tabX + 188, tabY, 100, 20, () -> switchSection(INFECTION_CONFIG));
        add(tabName("Advanced", ADVANCED), tabX + 292, tabY, 82, 20, () -> switchSection(ADVANCED));

        int y = tabY + 28;
        if (section == METEOR) buildMeteor(cx, y);
        else if (section == INFECTION_DIFFICULTY) buildDifficulty(cx, y);
        else if (section == INFECTION_CONFIG) buildInfectionConfig(cx, y);
        else buildAdvanced(cx, y);
    }

    private String tabName(String name, int id) {
        return section == id ? "[" + name + "]" : name;
    }

    private void buildMeteor(int cx, int y) {
        // Leave the left side free for the animated preview. Backend actions are unchanged.
        int x1 = cx - 40;
        int x2 = cx + 82;
        int w = 118;
        add(PhayriosisPendingWorldSettings.enabledLabel(), x1, y, w, 20, () -> { PhayriosisPendingWorldSettings.meteorEnabled = !PhayriosisPendingWorldSettings.meteorEnabled; refresh(); });
        add(PhayriosisPendingWorldSettings.dayLabel(), x2, y, w, 20, () -> { PhayriosisPendingWorldSettings.cycleDay(); refresh(); });
        y += 24;
        add(PhayriosisPendingWorldSettings.phaseLabel(), x1, y, w, 20, () -> { PhayriosisPendingWorldSettings.cyclePhase(); refresh(); });
        add(PhayriosisPendingWorldSettings.chanceLabel(), x2, y, w, 20, () -> { PhayriosisPendingWorldSettings.cycleChance(); refresh(); });
        y += 24;
        add(PhayriosisPendingWorldSettings.intervalLabel(), x1, y, w, 20, () -> { PhayriosisPendingWorldSettings.cycleInterval(); refresh(); });
        add(PhayriosisPendingWorldSettings.distanceLabel(), x2, y, w, 20, () -> { PhayriosisPendingWorldSettings.cycleDistance(); refresh(); });
        y += 24;
        add(PhayriosisPendingWorldSettings.infectionLabel(), x1, y, w, 20, () -> { PhayriosisPendingWorldSettings.meteorInfectionEnabled = !PhayriosisPendingWorldSettings.meteorInfectionEnabled; refresh(); });
        add("Reset Meteor Defaults", x2, y, w, 20, () -> { PhayriosisPendingWorldSettings.resetMeteorDefaults(); refresh(); });
        bottomButtonsMeteor(cx, y + 34);
    }

    private void buildDifficulty(int cx, int y) {
        add(PhayriosisPendingWorldSettings.difficultyLabel(), cx - 154, y, 150, 20, () -> { PhayriosisPendingWorldSettings.cycleDifficulty(); refresh(); });
        add(PhayriosisPendingWorldSettings.spreadSpeedLabel(), cx + 4, y, 150, 20, () -> { PhayriosisPendingWorldSettings.cycleSpreadSpeed(); refresh(); });
        y += 24;
        add(PhayriosisPendingWorldSettings.hardnessLabel(), cx - 154, y, 150, 20, () -> { PhayriosisPendingWorldSettings.cycleHardness(); refresh(); });
        add("Reset Difficulty", cx + 4, y, 150, 20, () -> { PhayriosisPendingWorldSettings.resetDifficultyDefaults(); refresh(); });
        bottomButtons(cx, y + 58);
    }

    private void buildInfectionConfig(int cx, int y) {
        add(PhayriosisPendingWorldSettings.blockSpreadLabel(), cx - 154, y, 150, 20, () -> { PhayriosisPendingWorldSettings.blockSpreadEnabled = !PhayriosisPendingWorldSettings.blockSpreadEnabled; refresh(); });
        add(PhayriosisPendingWorldSettings.conversionsLabel(), cx + 4, y, 150, 20, () -> { PhayriosisPendingWorldSettings.conversionsEnabled = !PhayriosisPendingWorldSettings.conversionsEnabled; refresh(); });
        y += 24;
        add(PhayriosisPendingWorldSettings.playerConversionLabel(), cx - 154, y, 150, 20, () -> { PhayriosisPendingWorldSettings.playerConversionEnabled = !PhayriosisPendingWorldSettings.playerConversionEnabled; refresh(); });
        add(PhayriosisPendingWorldSettings.spawningLabel(), cx + 4, y, 150, 20, () -> { PhayriosisPendingWorldSettings.parasiteSpawningEnabled = !PhayriosisPendingWorldSettings.parasiteSpawningEnabled; refresh(); });
        y += 24;
        add(PhayriosisPendingWorldSettings.dimensionSpawningLabel(), cx - 154, y, 150, 20, () -> { PhayriosisPendingWorldSettings.dimensionalSpawningEnabled = !PhayriosisPendingWorldSettings.dimensionalSpawningEnabled; refresh(); });
        add("Reset Infection Config", cx + 4, y, 150, 20, () -> { PhayriosisPendingWorldSettings.resetInfectionDefaults(); refresh(); });
        bottomButtons(cx, y + 58);
    }

    private void buildAdvanced(int cx, int y) {
        add(PhayriosisPendingWorldSettings.phaseFreezeLabel(), cx - 154, y, 150, 20, () -> { PhayriosisPendingWorldSettings.phaseFreezeEnabled = !PhayriosisPendingWorldSettings.phaseFreezeEnabled; refresh(); });
        add("Reset All Defaults", cx + 4, y, 150, 20, () -> { PhayriosisPendingWorldSettings.resetDraftToDefaults(); refresh(); });
        bottomButtons(cx, y + 58);
    }

    private void bottomButtonsMeteor(int cx, int y) {
        int x1 = cx - 40;
        int x2 = cx + 82;
        add("Back", x1, y, 118, 20, () -> Minecraft.m_91087_().m_91152_(parent));
        add("Done", x2, y, 118, 20, () -> {
            PhayriosisPendingWorldSettings.arm();
            Minecraft.m_91087_().m_91152_(parent);
        });
    }

    private void bottomButtons(int cx, int y) {
        add("Back", cx - 154, y, 150, 20, () -> Minecraft.m_91087_().m_91152_(parent));
        add("Done", cx + 4, y, 150, 20, () -> {
            PhayriosisPendingWorldSettings.arm();
            Minecraft.m_91087_().m_91152_(parent);
        });
    }

    private void add(String text, int x, int y, int w, int h, Runnable action) {
        Button button = Button.m_253074_(Component.m_237113_(text), b -> action.run()).m_252987_(x, y, w, h).m_253136_();
        this.m_142416_(button);
    }

    private void switchSection(int newSection) {
        if (newSection == section) return;
        Minecraft.m_91087_().m_91152_(new PhayriosisWorldCreationScreen(parent, newSection));
    }

    private void refresh() {
        Minecraft.m_91087_().m_91152_(new PhayriosisWorldCreationScreen(parent, section));
    }

    @Override
    public void m_7379_() {
        Minecraft.m_91087_().m_91152_(parent);
    }

    @Override
    public void m_88315_(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) {
        this.m_280273_(graphics);
        if (section == METEOR) {
            PhayriosisMeteorPreview.render(graphics, this.f_96543_, this.f_96544_);
        }
        super.m_88315_(graphics, mouseX, mouseY, partialTick);
    }
}
