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;

public class UIRenderer {
    private SpriteBatch batch;
    private BitmapFont font;
    private GlyphLayout glyphLayout;
    private Texture whitePixel;
    private int WIDTH;
    private int HEIGHT;
    private int UI_INPUT_HEIGHT;

    public UIRenderer(SpriteBatch batch, BitmapFont font, GlyphLayout glyphLayout,
                      Texture whitePixel, int width, int height, int uiInputHeight) {
        this.batch = batch;
        this.font = font;
        this.glyphLayout = glyphLayout;
        this.whitePixel = whitePixel;
        this.WIDTH = width;
        this.HEIGHT = height;
        this.UI_INPUT_HEIGHT = uiInputHeight;
    }

    public void renderUI(int selectedBuildingType, String problemText, String messageText, Color messageColor,
                         boolean isTyping, MathProblem currentProblem, String inputText,
                         boolean showWrongAnswerJoke, String wrongAnswerJoke, float time,
                         Building currentBuilding, Planet currentPlanet, boolean isSwitchingPlanets) {
        batch.begin();

        batch.setColor(0.2f, 0.3f, 0.4f, 0.95f);
        batch.draw(whitePixel, 0, 0, WIDTH, UI_INPUT_HEIGHT);
        batch.setColor(Color.WHITE);

        batch.setColor(0.4f, 0.6f, 0.8f, 1);
        batch.draw(whitePixel, 0, UI_INPUT_HEIGHT, WIDTH, 3);
        batch.setColor(Color.WHITE);

        font.setColor(Color.WHITE);

        int lineHeight = 28;
        int currentY = UI_INPUT_HEIGHT - 30;

        // ==================== ЛЕВАЯ КОЛОНКА ====================
        // Отображение текущей планеты
        String planetDisplay = "🌍 Планета: " + currentPlanet.getName();
        if (isSwitchingPlanets) {
            planetDisplay += " (Перелет...)";
        }
        font.draw(batch, planetDisplay, 20, currentY);
        currentY -= lineHeight;

        // Управление планетой
        font.setColor(Color.YELLOW);
        font.draw(batch, "↑/↓ - сменить планету", 20, currentY);
        currentY -= lineHeight;
        font.setColor(Color.LIGHT_GRAY);
        font.draw(batch, "1-Земля, 2-Марс, 3-Венера", 20, currentY);
        currentY -= lineHeight;

        font.setColor(Color.WHITE);
        font.draw(batch, "───────────────", 20, currentY);
        currentY -= lineHeight;

        // Тип здания
        String[] planetBuildings = Building.BUILDING_TYPES_BY_PLANET[currentPlanet.ordinal()];
        font.draw(batch, "🏗️ Тип здания: " + planetBuildings[selectedBuildingType], 20, currentY);
        currentY -= lineHeight;

        // Управление зданиями
        font.setColor(Color.CYAN);
        font.draw(batch, "←/→ - выбрать тип здания", 20, currentY);
        currentY -= lineHeight;

        font.setColor(Color.WHITE);
        font.draw(batch, "───────────────", 20, currentY);
        currentY -= lineHeight;

        // Отображение задачи
        String displayText = problemText;
        if (problemText.length() > 40) {
            int splitIndex = problemText.lastIndexOf(" ", 40);
            if (splitIndex > 0) {
                String line1 = problemText.substring(0, splitIndex);
                String line2 = problemText.substring(splitIndex + 1);
                font.draw(batch, line1, 20, currentY);
                currentY -= lineHeight;
                font.draw(batch, line2, 20, currentY);
            } else {
                font.draw(batch, displayText, 20, currentY);
            }
        } else {
            font.draw(batch, displayText, 20, currentY);
        }
        currentY -= lineHeight;

        // Прогресс строительства
        if (currentBuilding != null) {
            font.draw(batch, "📊 Прогресс: " + currentBuilding.constructionProgress + "/3 блоков",
                20, currentY);
        } else {
            font.draw(batch, "📊 Прогресс: 0/3 блоков", 20, currentY);
        }
        currentY -= lineHeight;

        // ==================== ПРАВАЯ КОЛОНКА ====================
        // Сообщения игры
        font.setColor(messageColor);
        float messageX = WIDTH - 500;
        drawWrappedText(messageText, messageX, UI_INPUT_HEIGHT - 40, 480);

        // ==================== ЦЕНТРАЛЬНАЯ ЧАСТЬ ====================
        if (isTyping && currentProblem != null) {
            renderInputSection(currentProblem, inputText, time);
        }

        // Шутка при неправильном ответе
        if (showWrongAnswerJoke) {
            renderWrongAnswerJoke(wrongAnswerJoke);
        }

        // ==================== НИЖНЯЯ ПАНЕЛЬ ====================
        renderBottomPanel(currentPlanet, isSwitchingPlanets);

        batch.end();
    }

    private void renderInputSection(MathProblem currentProblem, String inputText, float time) {
        // Фон для ввода
        batch.setColor(0.3f, 0.4f, 0.5f, 0.8f);
        batch.draw(whitePixel, WIDTH/2 - 250, UI_INPUT_HEIGHT - 150, 500, 130);
        batch.setColor(Color.WHITE);

        // Задача
        font.setColor(Color.YELLOW);
        String mathProblem = "🧮 Задача: " + currentProblem.getQuestion();
        glyphLayout.setText(font, mathProblem);
        font.draw(batch, mathProblem,
            WIDTH/2 - glyphLayout.width/2,
            UI_INPUT_HEIGHT - 60);

        // Поле ввода
        font.setColor(Color.WHITE);
        font.draw(batch, "✏️ Введите ответ:", WIDTH/2 - 230, UI_INPUT_HEIGHT - 95);

        // Введенный текст
        String inputStr = inputText.isEmpty() ? "_" : inputText;
        font.draw(batch, inputStr, WIDTH/2 - 230, UI_INPUT_HEIGHT - 130);

        // Мигающий курсор
        if ((int)(time * 2) % 2 == 0 && inputText.isEmpty()) {
            font.setColor(Color.YELLOW);
            font.draw(batch, "_", WIDTH/2 - 230, UI_INPUT_HEIGHT - 130);
            font.setColor(Color.WHITE);
        }

        // Подсказки
        font.setColor(Color.LIGHT_GRAY);
        font.getData().setScale(0.7f);
        font.draw(batch, "⏎ Enter - отправить ответ", WIDTH/2 - 230, UI_INPUT_HEIGHT - 160);
        font.draw(batch, "⎋ ESC - отмена ввода", WIDTH/2 - 230, UI_INPUT_HEIGHT - 180);
        font.draw(batch, "⌫ Backspace - удалить символ", WIDTH/2 - 230, UI_INPUT_HEIGHT - 200);
        font.getData().setScale(1.0f);
    }

    private void renderWrongAnswerJoke(String wrongAnswerJoke) {
        // Фон для шутки
        batch.setColor(1, 0.2f, 0.2f, 0.3f);
        batch.draw(whitePixel, WIDTH/2 - 300, HEIGHT/2 - 50, 600, 100);
        batch.setColor(Color.WHITE);

        // Шутка
        font.setColor(Color.RED);
        font.getData().setScale(1.3f);
        glyphLayout.setText(font, wrongAnswerJoke);
        font.draw(batch, wrongAnswerJoke,
            WIDTH/2 - glyphLayout.width/2,
            HEIGHT/2 + 10);
        font.getData().setScale(1.0f);
    }

    // ВОТ ТОТ САМЫЙ МЕТОД, КОТОРЫЙ ВЫ СПРАШИВАЛИ:
    private void renderBottomPanel(Planet planet, boolean isSwitchingPlanets) {
        font.setColor(Color.LIGHT_GRAY);
        font.getData().setScale(0.6f);

        // Основные инструкции
        String instruction = "🖱️ Кликните на поле для строительства";
        glyphLayout.setText(font, instruction);
        font.draw(batch, instruction, WIDTH/2 - glyphLayout.width/2, 30);

        // Управление
        String controls = "🗑️ Delete/Ctrl+Z - удалить здание | ⌫ Backspace - удалить блок | ⎋ ESC - меню";
        glyphLayout.setText(font, controls);
        font.draw(batch, controls, WIDTH/2 - glyphLayout.width/2, 15);

        // Индикатор планеты
        font.setColor(getPlanetColor(planet));
        font.getData().setScale(0.8f);
        String planetInfo = getPlanetEmoji(planet) + " " + planet.getName();
        if (isSwitchingPlanets) {
            planetInfo += " 🚀";
        }
        font.draw(batch, planetInfo, WIDTH - 150, 25);

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

    // Вспомогательные методы для работы с планетами:
    private Color getPlanetColor(Planet planet) {
        switch (planet) {
            case EARTH: return new Color(0.3f, 0.7f, 1.0f, 1);
            case MARS: return new Color(1.0f, 0.4f, 0.3f, 1);
            case VENUS: return new Color(1.0f, 0.8f, 0.3f, 1);
            default: return Color.WHITE;
        }
    }

    private String getPlanetEmoji(Planet planet) {
        switch (planet) {
            case EARTH: return "🌍";
            case MARS: return "♂️";
            case VENUS: return "♀️";
            default: return "🪐";
        }
    }

    private void drawWrappedText(String text, float x, float y, float maxWidth) {
        String[] words = text.split(" ");
        StringBuilder line = new StringBuilder();
        float currentY = y;

        for (String word : words) {
            String testLine = line.length() > 0 ? line.toString() + " " + word : word;
            glyphLayout.setText(font, testLine);

            if (glyphLayout.width > maxWidth && line.length() > 0) {
                font.draw(batch, line.toString(), x, currentY);
                line = new StringBuilder(word);
                currentY -= 25;
            } else {
                line = new StringBuilder(testLine);
            }
        }

        if (line.length() > 0) {
            font.draw(batch, line.toString(), x, currentY);
        }
    }
}
