package com.mygdx.game;


import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import java.util.ArrayList;
import java.util.List;

public class MenuRenderer {
    private final SpriteBatch batch;
    private BitmapFont titleFont;
    private BitmapFont font;
    private GlyphLayout layout;
    private Texture whitePixel;
    private int width, height;

    private List<MenuButton> mainMenuButtons;
    private List<MenuButton> planetSelectButtons;
    private List<MenuButton> helpButtons;

    private float titlePulse = 0;
    private float starTimer = 0;

    public MenuRenderer(SpriteBatch batch, BitmapFont font, GlyphLayout layout,
                        Texture whitePixel, int width, int height) {
        this.batch = batch;
        this.font = font;
        this.layout = layout;
        this.whitePixel = whitePixel;
        this.width = width;
        this.height = height;

        // Создаем увеличенный шрифт для заголовка
        this.titleFont = new BitmapFont();
        this.titleFont.getData().setScale(2.5f);

        createMainMenuButtons();
        createPlanetSelectButtons();
        createHelpButtons();
    }

    private void createMainMenuButtons() {
        mainMenuButtons = new ArrayList<>();
        float buttonWidth = 400;
        float buttonHeight = 70;
        float startY = height/2 - 50;
        float spacing = 85;

        // Кнопка "Новая игра"
        mainMenuButtons.add(new MenuButton(
            width/2 - buttonWidth/2, startY, buttonWidth, buttonHeight,
            "🚀 НОВАЯ ИГРА",
            new Color(0.2f, 0.5f, 0.8f, 0.9f),
            new Color(0.3f, 0.6f, 0.9f, 1f),
            () -> {}
        ).withTextColor(Color.YELLOW));

        // Кнопка "Выбор планеты"
        mainMenuButtons.add(new MenuButton(
            width/2 - buttonWidth/2, startY - spacing, buttonWidth, buttonHeight,
            "🪐 ВЫБОР ПЛАНЕТЫ",
            new Color(0.8f, 0.4f, 0.2f, 0.9f),
            new Color(0.9f, 0.5f, 0.3f, 1f),
            () -> {}
        ));

        // Кнопка "Помощь"
        mainMenuButtons.add(new MenuButton(
            width/2 - buttonWidth/2, startY - spacing * 2, buttonWidth, buttonHeight,
            "❓ ПОМОЩЬ",
            new Color(0.2f, 0.7f, 0.3f, 0.9f),
            new Color(0.3f, 0.8f, 0.4f, 1f),
            () -> {}
        ));

        // Кнопка "Об игре"
        mainMenuButtons.add(new MenuButton(
            width/2 - buttonWidth/2, startY - spacing * 3, buttonWidth, buttonHeight,
            "ℹ️ ОБ ИГРЕ",
            new Color(0.7f, 0.2f, 0.7f, 0.9f),
            new Color(0.8f, 0.3f, 0.8f, 1f),
            () -> {}
        ));

        // Кнопка "Выход"
        mainMenuButtons.add(new MenuButton(
            width/2 - buttonWidth/2, startY - spacing * 4, buttonWidth, buttonHeight,
            "🚪 ВЫХОД",
            new Color(0.8f, 0.2f, 0.2f, 0.9f),
            new Color(0.9f, 0.3f, 0.3f, 1f),
            () -> System.exit(0)
        ));
    }

    private void createPlanetSelectButtons() {
        planetSelectButtons = new ArrayList<>();
        float buttonWidth = 350;
        float buttonHeight = 100;
        float startY = height/2 + 50;
        float spacing = 120;

        // Земля
        planetSelectButtons.add(new MenuButton(
            width/2 - buttonWidth - 20, startY, buttonWidth, buttonHeight,
            "🌍 ЗЕМЛЯ",
            new Color(0.3f, 0.6f, 0.9f, 0.9f),
            new Color(0.4f, 0.7f, 1.0f, 1f),
            () -> {}
        ).withTextColor(Color.WHITE));

        // Марс
        planetSelectButtons.add(new MenuButton(
            width/2 + 20, startY, buttonWidth, buttonHeight,
            "♂️ МАРС",
            new Color(0.8f, 0.3f, 0.2f, 0.9f),
            new Color(0.9f, 0.4f, 0.3f, 1f),
            () -> {}
        ));

        // Венера
        planetSelectButtons.add(new MenuButton(
            width/2 - buttonWidth/2, startY - spacing, buttonWidth, buttonHeight,
            "♀️ ВЕНЕРА",
            new Color(1.0f, 0.7f, 0.2f, 0.9f),
            new Color(1.0f, 0.8f, 0.3f, 1f),
            () -> {}
        ));

        // Кнопка "Назад"
        planetSelectButtons.add(new MenuButton(
            50, 50, 200, 60,
            "⬅️ НАЗАД",
            new Color(0.4f, 0.4f, 0.4f, 0.9f),
            new Color(0.5f, 0.5f, 0.5f, 1f),
            () -> {}
        ));
    }

    private void createHelpButtons() {
        helpButtons = new ArrayList<>();

        // Кнопка "Назад"
        helpButtons.add(new MenuButton(
            50, 50, 200, 60,
            "⬅️ НАЗАД",
            new Color(0.4f, 0.4f, 0.4f, 0.9f),
            new Color(0.5f, 0.5f, 0.5f, 1f),
            () -> {}
        ));
    }

    public void update(float deltaTime) {
        titlePulse += deltaTime * 2;
        starTimer += deltaTime;
    }

    public void renderMainMenu(float mouseX, float mouseY) {
        batch.begin();

        // Космический фон
        renderSpaceBackground();

        // Заголовок
        renderTitle();

        // Подзаголовок
        font.setColor(new Color(0.8f, 0.9f, 1.0f, 0.8f));
        font.getData().setScale(1.2f);
        String subtitle = "Строй абсурдные города на разных планетах!";
        layout.setText(font, subtitle);
        font.draw(batch, subtitle, width/2 - layout.width/2, height - 150);
        font.getData().setScale(1.0f);

        // Кнопки
        for (MenuButton button : mainMenuButtons) {
            button.render(batch, font, layout, whitePixel);
        }

        // Автор
        font.setColor(new Color(1, 1, 1, 0.5f));
        font.getData().setScale(0.8f);
        font.draw(batch, "© 2024 Absurd City Builder", width - 250, 30);
        font.getData().setScale(1.0f);

        batch.end();
    }

    public void renderPlanetSelect(float mouseX, float mouseY) {
        batch.begin();

        // Космический фон
        renderSpaceBackground();

        // Заголовок
        titleFont.setColor(new Color(1, 1, 1, 0.9f));
        String title = "🪐 ВЫБОР ПЛАНЕТЫ";
        layout.setText(titleFont, title);
        titleFont.draw(batch, title, width/2 - layout.width/2, height - 100);

        // Описание
        font.setColor(new Color(0.8f, 0.9f, 1.0f, 0.8f));
        font.getData().setScale(1.1f);
        String desc = "Выберите планету для строительства:";
        layout.setText(font, desc);
        font.draw(batch, desc, width/2 - layout.width/2, height - 170);
        font.getData().setScale(1.0f);

        // Описания планет
        font.setColor(Color.LIGHT_GRAY);
        font.getData().setScale(0.9f);

        // Земля
        String earthText = "Мультяшные здания\nЯркие цвета\nМилые жители";
        layout.setText(font, earthText);
        font.draw(batch, earthText, width/2 - 380, height/2 - 50);

// Марс
        String marsText = "Технологичные постройки\nКрасный пейзаж\nМарсианские роботы";
        layout.setText(font, marsText);
        font.draw(batch, marsText, width/2 + 30, height/2 - 50);

// Венера
        String venusText = "Вулканические здания\nРаскаленная атмосфера\nКристаллические формы";
        layout.setText(font, venusText);
        font.draw(batch, venusText, width/2 - 175, height/2 - 200);
        font.getData().setScale(1.0f);

        // Кнопки
        for (MenuButton button : planetSelectButtons) {
            button.render(batch, font, layout, whitePixel);
        }

        batch.end();
    }

    public void renderHelp(float mouseX, float mouseY) {
        batch.begin();

        // Фон
        batch.setColor(new Color(0.1f, 0.1f, 0.2f, 0.95f));
        batch.draw(whitePixel, 0, 0, width, height);
        batch.setColor(Color.WHITE);

        // Заголовок
        titleFont.setColor(Color.YELLOW);
        String title = "❓ ПОМОЩЬ И УПРАВЛЕНИЕ";
        layout.setText(titleFont, title);
        titleFont.draw(batch, title, width/2 - layout.width/2, height - 100);

        // Инструкции
        font.setColor(Color.WHITE);
        font.getData().setScale(1.1f);

        float textY = height - 200;
        float lineHeight = 35;

        String[] instructions = {
            "🎮 ОСНОВНОЕ УПРАВЛЕНИЕ:",
            "• ЛКМ - кликнуть на поле для строительства",
            "• ←/→ - выбрать тип здания",
            "• Enter - отправить ответ на задачу",
            "• Backspace - удалить блок/символ",
            "• Delete/Ctrl+Z - удалить здание",
            "• ESC - отмена ввода",
            "",
            "🪐 УПРАВЛЕНИЕ ПЛАНЕТАМИ:",
            "• ↑/↓ - переключить планету",
            "• 1 - Земля, 2 - Марс, 3 - Венера",
            "",
            "🎯 КАК ИГРАТЬ:",
            "1. Выберите тип здания",
            "2. Кликните на игровом поле",
            "3. Решите математическую задачу",
            "4. Постройте 3 блока для завершения",
            "5. Стройте разные здания на разных планетах!"
        };

        for (String line : instructions) {
            if (line.startsWith("🎮") || line.startsWith("🪐") || line.startsWith("🎯")) {
                font.setColor(Color.CYAN);
            } else if (line.startsWith("•")) {
                font.setColor(Color.LIGHT_GRAY);
            } else {
                font.setColor(Color.WHITE);
            }
            font.draw(batch, line, 100, textY);
            textY -= lineHeight;
        }

        font.getData().setScale(1.0f);

        // Кнопки
        for (MenuButton button : helpButtons) {
            button.render(batch, font, layout, whitePixel);
        }

        batch.end();
    }

    public void renderAbout(float mouseX, float mouseY) {
        batch.begin();

        // Галактический фон
        batch.setColor(new Color(0.05f, 0.05f, 0.1f, 1));
        batch.draw(whitePixel, 0, 0, width, height);

        // Звезды
        batch.setColor(Color.WHITE);
        for (int i = 0; i < 50; i++) {
            float starX = (float)Math.sin(starTimer + i) * width + width/2;
            float starY = (float)Math.cos(starTimer * 0.5f + i) * height/2 + height/2;
            float size = 1 + (float)Math.sin(starTimer * 2 + i) * 2;
            batch.draw(whitePixel, starX, starY, size, size);
        }

        batch.setColor(Color.WHITE);

        // Заголовок
        titleFont.setColor(new Color(0.8f, 0.4f, 1.0f, 1));
        String title = "✨ ОБ ИГРЕ";
        layout.setText(titleFont, title);
        titleFont.draw(batch, title, width/2 - layout.width/2, height - 100);

        // Описание игры
        font.setColor(new Color(0.9f, 0.9f, 1.0f, 0.9f));
        font.getData().setScale(1.2f);

        String[] aboutText = {
            "Absurd City Builder - это уникальная игра,",
            "где вы строите безумные города на разных планетах!",
            "",
            "Особенности игры:",
            "• 3 уникальные планеты с разными зданиями",
            "• Забавные математические задачи",
            "• Мультяшная графика и анимации",
            "• Динамичные жители и шутки",
            "• Бесконечные возможности для творчества!",
            "",
            "Разработано с ❤️ для любителей абсурда и математики.",
            "",
            "Версия 1.0"
        };

        float textY = height - 200;
        for (String line : aboutText) {
            layout.setText(font, line);
            font.draw(batch, line, width/2 - layout.width/2, textY);
            textY -= 40;
        }

        font.getData().setScale(1.0f);

        // Кнопка "Назад"
        MenuButton backButton = new MenuButton(
            50, 50, 200, 60,
            "⬅️ НАЗАД",
            new Color(0.4f, 0.4f, 0.4f, 0.9f),
            new Color(0.5f, 0.5f, 0.5f, 1f),
            () -> {}
        );
        backButton.render(batch, font, layout, whitePixel);

        batch.end();
    }

    private void renderSpaceBackground() {
        // Темный космический фон
        batch.setColor(new Color(0.05f, 0.05f, 0.1f, 1));
        batch.draw(whitePixel, 0, 0, width, height);

        // Звезды
        batch.setColor(Color.WHITE);
        for (int i = 0; i < 100; i++) {
            float starX = (i * 37.3f) % width;
            float starY = (i * 23.7f) % height;
            float twinkle = 0.5f + 0.5f * (float)Math.sin(starTimer * 3 + i);
            batch.setColor(new Color(1, 1, 1, twinkle));
            float size = 1 + (i % 3);
            batch.draw(whitePixel, starX, starY, size, size);
        }
        batch.setColor(Color.WHITE);

        // Планеты на заднем фоне
        batch.setColor(new Color(0.3f, 0.6f, 0.9f, 0.3f));
        batch.draw(whitePixel, width - 200, 100, 150, 150);

        batch.setColor(new Color(0.8f, 0.3f, 0.2f, 0.3f));
        batch.draw(whitePixel, 100, height - 200, 120, 120);

        batch.setColor(new Color(1.0f, 0.7f, 0.2f, 0.3f));
        batch.draw(whitePixel, width - 150, height - 150, 100, 100);
    }

    private void renderTitle() {
        // Пульсирующий заголовок
        float pulse = 0.8f + 0.2f * (float)Math.sin(titlePulse);
        titleFont.setColor(new Color(1, pulse, 0.5f, 1));

        String title = "✨ ABSURD CITY BUILDER ✨";
        layout.setText(titleFont, title);
        titleFont.draw(batch, title, width/2 - layout.width/2, height - 100);

        // Блестки вокруг заголовка
        batch.setColor(new Color(1, 1, 0.5f, 0.3f));
        for (int i = 0; i < 8; i++) {
            float angle = titlePulse + i * 0.785f;
            float sparkleX = width/2 + (float)Math.cos(angle) * 200;
            float sparkleY = height - 100 + (float)Math.sin(angle) * 50;
            float size = 5 + (float)Math.sin(titlePulse * 2 + i) * 3;
            batch.draw(whitePixel, sparkleX, sparkleY, size, size);
        }
    }

    public MenuButton getMainMenuButtonAt(float x, float y) {
        for (MenuButton button : mainMenuButtons) {
            if (button.contains(x, y)) {
                return button;
            }
        }
        return null;
    }

    public MenuButton getPlanetSelectButtonAt(float x, float y) {
        for (MenuButton button : planetSelectButtons) {
            if (button.contains(x, y)) {
                return button;
            }
        }
        return null;
    }

    public MenuButton getHelpButtonAt(float x, float y) {
        for (MenuButton button : helpButtons) {
            if (button.contains(x, y)) {
                return button;
            }
        }
        return null;
    }

    public void dispose() {
        titleFont.dispose();
    }
}
