package com.mygdx.game;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.utils.Array;
import java.util.Random;

public class Building {
    // Названия зданий по планетам
    public static final String[][] BUILDING_TYPES_BY_PLANET = {
        // Земля (существующие здания)
        {
            "✨ Уютный Домик ✨",
            "🏥 Детская Больница 🏥",
            "🎒 Весёлая Школа 🎒",
            "🎪 Игровая Площадка 🎪",
            "💰 Надёжный Банк 💰",
            "💊 Здоровая Аптека 💊",
            "🎭 Волшебный Театр 🎭",
            "🎬 КиноМир 🎬"
        },
        // Марс (красные, технологичные)
        {
            "🚀 Марсианская База 🚀",
            "🔴 Красная Лаборатория 🔴",
            "🛰️ Космопорт 🛰️",
            "⚡ Энергокупол ⚡",
            "💧 Водородный Завод 💧",
            "🌌 Обсерватория 🌌",
            "🤖 Робо-Фабрика 🤖",
            "🧪 Биокупол 🧪"
        },
        // Венера (желтые, вулканические)
        {
            "🌋 Вулканический Дом 🌋",
            "🔥 Термальная Станция 🔥",
            "🌅 Золотой Дворец 🌅",
            "☁️ Облачный Город ☁️",
            "💎 Кристальная Шахта 💎",
            "🌡️ Теплица 🌡️",
            "🌀 Вихревой Генератор 🌀",
            "✨ Сияющая Башня ✨"
        }
    };

    // Яркие цвета для разных планет
    public static final Color[][][] BUILDING_COLOR_THEMES_BY_PLANET = {
        // 0. Земля - тёплые цвета
        {
            // Дома - тёплые цвета
            {
                new Color(1.0f, 0.85f, 0.7f, 1),     // Персиковый
                new Color(0.95f, 0.9f, 0.75f, 1),    // Светло-бежевый
                new Color(0.9f, 0.8f, 0.85f, 1)      // Розоватый
            },
            // Больницы - чистые светлые цвета
            {
                new Color(1.0f, 1.0f, 1.0f, 1),      // Белоснежный
                new Color(0.98f, 0.98f, 1.0f, 1),    // Голубоватый
                new Color(0.96f, 1.0f, 0.98f, 1)     // Мятный
            },
            // Школы - яркие весёлые цвета
            {
                new Color(1.0f, 0.95f, 0.8f, 1),     // Лимонный
                new Color(0.85f, 0.95f, 1.0f, 1),    // Небесно-голубой
                new Color(0.95f, 0.85f, 1.0f, 1)     // Лавандовый
            },
            // Игровые площадки - яркие игровые цвета
            {
                new Color(1.0f, 0.9f, 0.8f, 1),      // Абрикосовый
                new Color(0.9f, 1.0f, 0.9f, 1),      // Салатовый
                new Color(0.9f, 0.9f, 1.0f, 1)       // Сиреневый
            },
            // Банки - солидные цвета
            {
                new Color(0.95f, 0.95f, 0.9f, 1),    // Слоновая кость
                new Color(0.9f, 0.92f, 0.85f, 1),    // Бежевый
                new Color(0.85f, 0.89f, 0.8f, 1)     // Оливковый
            },
            // Аптеки - медицинские цвета
            {
                new Color(1.0f, 1.0f, 1.0f, 1),      // Белый
                new Color(0.98f, 1.0f, 0.98f, 1),    // Светло-зелёный
                new Color(0.96f, 0.98f, 1.0f, 1)     // Светло-голубой
            },
            // Театры - благородные цвета
            {
                new Color(0.95f, 0.9f, 0.95f, 1),    // Сиреневый
                new Color(0.9f, 0.95f, 1.0f, 1),     // Лазурный
                new Color(1.0f, 0.95f, 0.9f, 1)      // Кремовый
            },
            // Кинотеатры - тёмные с неоном
            {
                new Color(0.2f, 0.2f, 0.3f, 1),      // Тёмно-синий
                new Color(0.3f, 0.2f, 0.4f, 1),      // Фиолетовый
                new Color(0.4f, 0.3f, 0.5f, 1)       // Пурпурный
            }
        },
        // 1. Марс - красные, оранжевые, коричневые
        {
            // Марсианская База
            {
                new Color(0.8f, 0.3f, 0.2f, 1),    // Красный марсианский
                new Color(0.9f, 0.5f, 0.3f, 1),    // Оранжевый
                new Color(0.7f, 0.4f, 0.3f, 1)     // Коричневый
            },
            // Красная Лаборатория
            {
                new Color(0.9f, 0.4f, 0.4f, 1),
                new Color(1.0f, 0.6f, 0.5f, 1),
                new Color(0.8f, 0.5f, 0.5f, 1)
            },
            // Космопорт
            {
                new Color(0.7f, 0.5f, 0.4f, 1),
                new Color(0.8f, 0.6f, 0.5f, 1),
                new Color(0.6f, 0.4f, 0.3f, 1)
            },
            // Энергокупол
            {
                new Color(0.9f, 0.6f, 0.3f, 1),
                new Color(1.0f, 0.7f, 0.4f, 1),
                new Color(0.8f, 0.5f, 0.2f, 1)
            },
            // Водородный Завод
            {
                new Color(0.6f, 0.7f, 0.8f, 1),
                new Color(0.7f, 0.8f, 0.9f, 1),
                new Color(0.5f, 0.6f, 0.7f, 1)
            },
            // Обсерватория
            {
                new Color(0.3f, 0.4f, 0.6f, 1),
                new Color(0.4f, 0.5f, 0.7f, 1),
                new Color(0.2f, 0.3f, 0.5f, 1)
            },
            // Робо-Фабрика
            {
                new Color(0.5f, 0.5f, 0.5f, 1),
                new Color(0.6f, 0.6f, 0.6f, 1),
                new Color(0.4f, 0.4f, 0.4f, 1)
            },
            // Биокупол
            {
                new Color(0.4f, 0.7f, 0.4f, 1),
                new Color(0.5f, 0.8f, 0.5f, 1),
                new Color(0.3f, 0.6f, 0.3f, 1)
            }
        },
        // 2. Венера - желтые, золотые, оранжевые
        {
            // Вулканический Дом
            {
                new Color(1.0f, 0.7f, 0.3f, 1),    // Золотистый
                new Color(1.0f, 0.8f, 0.4f, 1),    // Желтый
                new Color(0.9f, 0.6f, 0.2f, 1)     // Оранжевый
            },
            // Термальная Станция
            {
                new Color(1.0f, 0.6f, 0.2f, 1),
                new Color(1.0f, 0.7f, 0.3f, 1),
                new Color(0.9f, 0.5f, 0.1f, 1)
            },
            // Золотой Дворец
            {
                new Color(1.0f, 0.9f, 0.3f, 1),
                new Color(1.0f, 1.0f, 0.5f, 1),
                new Color(0.9f, 0.8f, 0.2f, 1)
            },
            // Облачный Город
            {
                new Color(1.0f, 0.95f, 0.8f, 1),
                new Color(1.0f, 1.0f, 0.9f, 1),
                new Color(0.95f, 0.9f, 0.7f, 1)
            },
            // Кристальная Шахта
            {
                new Color(0.8f, 0.9f, 1.0f, 1),
                new Color(0.9f, 1.0f, 1.0f, 1),
                new Color(0.7f, 0.8f, 0.9f, 1)
            },
            // Теплица
            {
                new Color(0.7f, 0.9f, 0.6f, 1),
                new Color(0.8f, 1.0f, 0.7f, 1),
                new Color(0.6f, 0.8f, 0.5f, 1)
            },
            // Вихревой Генератор
            {
                new Color(0.9f, 0.8f, 0.5f, 1),
                new Color(1.0f, 0.9f, 0.6f, 1),
                new Color(0.8f, 0.7f, 0.4f, 1)
            },
            // Сияющая Башня
            {
                new Color(1.0f, 0.95f, 0.7f, 1),
                new Color(1.0f, 1.0f, 0.8f, 1),
                new Color(0.95f, 0.9f, 0.6f, 1)
            }
        }
    };

    // Крыши в мультяшных цветах по планетам
    public static final Color[][][] ROOF_COLORS_BY_PLANET = {
        // Земля
        {
            { new Color(0.9f, 0.3f, 0.2f, 1), new Color(0.7f, 0.4f, 0.2f, 1) },  // Дома
            { new Color(1.0f, 0.8f, 0.8f, 1), new Color(0.9f, 0.7f, 0.7f, 1) },  // Больницы
            { new Color(0.4f, 0.7f, 1.0f, 1), new Color(0.3f, 0.6f, 0.9f, 1) },  // Школы
            { new Color(1.0f, 0.8f, 0.4f, 1), new Color(0.9f, 0.5f, 0.9f, 1) },  // Площадки
            { new Color(1.0f, 0.9f, 0.3f, 1), new Color(0.9f, 0.8f, 0.2f, 1) },  // Банки
            { new Color(0.4f, 0.9f, 0.5f, 1), new Color(0.3f, 0.8f, 0.4f, 1) },  // Аптеки
            { new Color(0.8f, 0.4f, 1.0f, 1), new Color(0.7f, 0.3f, 0.9f, 1) },  // Театры
            { new Color(0.3f, 0.3f, 0.4f, 1), new Color(0.4f, 0.3f, 0.5f, 1) }   // Кинотеатры
        },
        // Марс
        {
            { new Color(0.7f, 0.2f, 0.1f, 1), new Color(0.6f, 0.1f, 0.0f, 1) },  // Марсианская База
            { new Color(0.8f, 0.3f, 0.2f, 1), new Color(0.7f, 0.2f, 0.1f, 1) },  // Красная Лаборатория
            { new Color(0.5f, 0.4f, 0.3f, 1), new Color(0.4f, 0.3f, 0.2f, 1) },  // Космопорт
            { new Color(0.8f, 0.5f, 0.2f, 1), new Color(0.7f, 0.4f, 0.1f, 1) },  // Энергокупол
            { new Color(0.4f, 0.5f, 0.7f, 1), new Color(0.3f, 0.4f, 0.6f, 1) },  // Водородный Завод
            { new Color(0.2f, 0.3f, 0.5f, 1), new Color(0.1f, 0.2f, 0.4f, 1) },  // Обсерватория
            { new Color(0.4f, 0.4f, 0.4f, 1), new Color(0.3f, 0.3f, 0.3f, 1) },  // Робо-Фабрика
            { new Color(0.3f, 0.6f, 0.3f, 1), new Color(0.2f, 0.5f, 0.2f, 1) }   // Биокупол
        },
        // Венера
        {
            { new Color(0.8f, 0.4f, 0.1f, 1), new Color(0.7f, 0.3f, 0.0f, 1) },  // Вулканический Дом
            { new Color(0.9f, 0.5f, 0.1f, 1), new Color(0.8f, 0.4f, 0.0f, 1) },  // Термальная Станция
            { new Color(1.0f, 0.8f, 0.1f, 1), new Color(0.9f, 0.7f, 0.0f, 1) },  // Золотой Дворец
            { new Color(1.0f, 1.0f, 0.8f, 1), new Color(0.9f, 0.9f, 0.7f, 1) },  // Облачный Город
            { new Color(0.7f, 0.8f, 0.9f, 1), new Color(0.6f, 0.7f, 0.8f, 1) },  // Кристальная Шахта
            { new Color(0.6f, 0.8f, 0.5f, 1), new Color(0.5f, 0.7f, 0.4f, 1) },  // Теплица
            { new Color(0.8f, 0.7f, 0.4f, 1), new Color(0.7f, 0.6f, 0.3f, 1) },  // Вихревой Генератор
            { new Color(0.95f, 0.9f, 0.6f, 1), new Color(0.85f, 0.8f, 0.5f, 1) } // Сияющая Башня
        }
    };

    // Коэффициенты масштабирования для разных планет
    public static final float[][] SIZE_SCALE_FACTORS_BY_PLANET = {
        // Земля
        {1.0f, 0.75f, 0.8f, 0.85f, 0.7f, 0.65f, 0.8f, 0.85f},
        // Марс (компактнее)
        {0.9f, 0.7f, 0.8f, 0.75f, 0.65f, 0.6f, 0.7f, 0.75f},
        // Венера (выше)
        {1.1f, 1.0f, 1.05f, 1.0f, 0.9f, 0.85f, 1.0f, 1.05f}
    };

    // Цвета для деталей по планетам
    public static final Color[][] DETAIL_COLORS_BY_PLANET = {
        // Земля
        {
            new Color(1.0f, 0.9f, 0.2f, 1),    // Золотой
            new Color(1.0f, 0.5f, 0.5f, 1),    // Коралловый
            new Color(0.5f, 0.8f, 1.0f, 1),    // Голубой
            new Color(0.8f, 1.0f, 0.5f, 1),    // Лаймовый
            new Color(1.0f, 0.7f, 1.0f, 1)     // Розовый
        },
        // Марс
        {
            new Color(1.0f, 0.6f, 0.2f, 1),    // Оранжевый
            new Color(0.8f, 0.3f, 0.2f, 1),    // Красный
            new Color(0.9f, 0.8f, 0.4f, 1),    // Песочный
            new Color(0.7f, 0.8f, 0.9f, 1),    // Стальной
            new Color(0.4f, 0.7f, 0.4f, 1)     // Зеленый марсианский
        },
        // Венера
        {
            new Color(1.0f, 0.9f, 0.3f, 1),    // Золотой
            new Color(1.0f, 0.7f, 0.2f, 1),    // Янтарный
            new Color(1.0f, 1.0f, 0.8f, 1),    // Светло-желтый
            new Color(0.9f, 0.6f, 0.1f, 1),    // Темно-оранжевый
            new Color(0.8f, 0.9f, 1.0f, 1)     // Кристальный
        }
    };

    // Цвета для названий по планетам
    public static final Color[][] GLOWING_NAME_COLORS_BY_PLANET = {
        // Земля
        {
            new Color(0.3f, 0.7f, 1.0f, 1),     // Ярко-синий
            new Color(1.0f, 0.4f, 0.4f, 1),     // Ярко-красный
            new Color(0.3f, 0.9f, 0.3f, 1),     // Ярко-зелёный
            new Color(1.0f, 0.7f, 0.2f, 1),     // Оранжевый
            new Color(0.8f, 0.4f, 1.0f, 1)      // Фиолетовый
        },
        // Марс
        {
            new Color(1.0f, 0.5f, 0.3f, 1),     // Оранжево-красный
            new Color(0.8f, 0.3f, 0.2f, 1),     // Марсианский красный
            new Color(0.9f, 0.7f, 0.4f, 1),     // Песочный
            new Color(0.6f, 0.8f, 0.9f, 1),     // Голубой стальной
            new Color(0.4f, 0.6f, 0.3f, 1)      // Оливковый
        },
        // Венера
        {
            new Color(1.0f, 0.9f, 0.3f, 1),     // Золотой
            new Color(1.0f, 0.7f, 0.2f, 1),     // Янтарный
            new Color(1.0f, 1.0f, 0.6f, 1),     // Ярко-желтый
            new Color(0.9f, 0.5f, 0.1f, 1),     // Теплый оранжевый
            new Color(1.0f, 0.95f, 0.8f, 1)     // Светло-золотой
        }
    };

    String type;
    float x;
    float y;
    float width;
    float height;
    Color[] colors;
    Color roofColor;
    Color detailColor;
    int constructionProgress;
    boolean isOverlapping;
    float[] cloudOffsets;
    int colorThemeIndex;
    boolean showName;
    float namePulse;
    Color nameColor;
    float nameYOffset;
    float wobbleOffset;
    float wobbleSpeed;
    float animationTimer;
    float animationSpeed;
    int buildingTypeIndex;
    float sizeScale;
    Random random;
    Planet planet;
    int planetIndex;

    public Building(String type, float x, float y, float width, float height, Random random, Planet planet) {
        this.type = type;
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.random = random;
        this.planet = planet;
        this.planetIndex = planet.ordinal();

        this.buildingTypeIndex = findBuildingTypeIndex(type, planet);
        this.sizeScale = SIZE_SCALE_FACTORS_BY_PLANET[planetIndex][buildingTypeIndex];
        this.colorThemeIndex = random.nextInt(3);
        this.colors = BUILDING_COLOR_THEMES_BY_PLANET[planetIndex][buildingTypeIndex];
        this.roofColor = ROOF_COLORS_BY_PLANET[planetIndex][buildingTypeIndex][random.nextInt(2)];

        Color[] planetDetailColors = DETAIL_COLORS_BY_PLANET[planetIndex];
        this.detailColor = planetDetailColors[random.nextInt(planetDetailColors.length)];

        Color[] planetNameColors = GLOWING_NAME_COLORS_BY_PLANET[planetIndex];
        this.nameColor = planetNameColors[random.nextInt(planetNameColors.length)];

        this.constructionProgress = 0;
        this.isOverlapping = false;
        this.showName = false;
        this.namePulse = random.nextFloat() * 100;
        this.nameYOffset = 0;
        this.wobbleOffset = random.nextFloat() * 100;
        this.wobbleSpeed = 0.3f + random.nextFloat() * 0.7f;
        this.animationTimer = random.nextFloat() * 100;
        this.animationSpeed = 0.5f + random.nextFloat() * 1.0f;
        this.cloudOffsets = new float[3];
        for (int i = 0; i < 3; i++) {
            cloudOffsets[i] = random.nextFloat() * 100;
        }
    }

    private int findBuildingTypeIndex(String type, Planet planet) {
        String[] planetBuildings = BUILDING_TYPES_BY_PLANET[planet.ordinal()];
        for (int i = 0; i < planetBuildings.length; i++) {
            if (planetBuildings[i].equals(type)) {
                return i;
            }
        }
        return 0;
    }

    public void addBlock() {
        if (constructionProgress < 3) constructionProgress++;
        if (isComplete()) {
            showName = true;
        }
    }

    public void removeBlock() {
        if (constructionProgress > 0) constructionProgress--;
        if (!isComplete()) {
            showName = false;
        }
    }

    public boolean isComplete() { return constructionProgress >= 3; }
    public float getCurrentHeight() { return (height * constructionProgress) / 3.0f; }
    public Rectangle getBounds() { return new Rectangle(x, y, width, getCurrentHeight()); }
    public Planet getPlanet() { return planet; }

    public void update(float deltaTime) {
        animationTimer += deltaTime * animationSpeed;

        if (showName) {
            namePulse += deltaTime * 2;
            nameYOffset = (float)Math.sin(namePulse * 0.5f) * 3;
        }

        if (isComplete()) {
            wobbleOffset += deltaTime * wobbleSpeed;
        }
    }

    public float getWobbleX() {
        if (!isComplete()) return 0;
        return (float)Math.sin(wobbleOffset) * 2;
    }

    public float getWobbleY() {
        if (!isComplete()) return 0;
        return (float)Math.cos(wobbleOffset * 1.5f) * 1.5f;
    }

    public void createCitizensForBuilding(Array<Citizen> citizens, Random random) {
        int citizenCount = 2 + random.nextInt(3);

        for (int i = 0; i < citizenCount; i++) {
            float citizenX = x + random.nextFloat() * width;
            float citizenY = y - 40;
            Color clothesColor = DETAIL_COLORS_BY_PLANET[planetIndex][random.nextInt(DETAIL_COLORS_BY_PLANET[planetIndex].length)];

            Citizen citizen = new Citizen(citizenX, citizenY, clothesColor, this, random, planet);
            citizens.add(citizen);
        }
    }

    public float getSizeScale() {
        return sizeScale;
    }

    public Color getDetailColor() {
        return detailColor;
    }
}
