package com.mygdx.game;

import java.util.HashSet;
import java.util.Set;

/**
 * Менеджер достижений - проверка условий и разблокировка.
 */
public class Achievements {
    private static Set<Achievement> unlocked = new HashSet<>();
    private static Achievement lastUnlocked = null;
    private static float popupTimer = 0;
    private static final float POPUP_DURATION = 3.0f;
    private static boolean hasNewUnlockFlag = false;
    
    /**
     * Проверить все условия достижений
     */
    public static void check(AbsurdCityBuilder1 game) {
        // Строительство
        int total = GameSave.getTotalBuildings();
        
        if (total >= 1) {
            tryUnlock(Achievement.FIRST_BUILDING);
        }
        if (total >= 5) {
            tryUnlock(Achievement.BUILDER_5);
        }
        if (total >= 10) {
            tryUnlock(Achievement.BUILDER_10);
        }
        if (total >= 25) {
            tryUnlock(Achievement.BUILDER_25);
        }
        
        // Планеты
        if (GameSave.hasVisitedMars()) {
            tryUnlock(Achievement.MARS_VISITOR);
        }
        if (GameSave.hasVisitedVenus()) {
            tryUnlock(Achievement.VENUS_VISITOR);
        }
        if (GameSave.hasVisitedAllPlanets()) {
            tryUnlock(Achievement.ALL_PLANETS);
        }
        
        // Математика
        int streak = GameSave.getCorrectStreak();
        
        if (streak >= 5) {
            tryUnlock(Achievement.MATH_STREAK_5);
        }
        if (streak >= 10) {
            tryUnlock(Achievement.MATH_STREAK_10);
        }
        if (streak >= 20) {
            tryUnlock(Achievement.MATH_STREAK_20);
        }
    }
    
    /**
     * Попробовать разблокировать достижение
     */
    private static void tryUnlock(Achievement achievement) {
        if (!unlocked.contains(achievement)) {
            unlock(achievement);
        }
    }
    
    /**
     * Разблокировать достижение
     */
    public static void unlock(Achievement achievement) {
        if (unlocked.contains(achievement)) {
            return;
        }
        
        unlocked.add(achievement);
        lastUnlocked = achievement;
        popupTimer = POPUP_DURATION;
        hasNewUnlockFlag = true;
        
        // Сохраняем сразу
        GameSave.saveSettings();
    }
    
    /**
     * Отметить посещение планеты
     */
    public static void visitPlanet(Planet planet) {
        GameSave.onVisitPlanet(planet);
    }
    
    /**
     * Есть ли новое непоказанное достижение
     */
    public static boolean hasNewUnlock() {
        return hasNewUnlockFlag;
    }
    
    /**
     * Сбросить флаг нового достижения
     */
    public static void clearNewUnlock() {
        hasNewUnlockFlag = false;
    }
    
    /**
     * Обновить таймер попапа
     */
    public static void update(float deltaTime) {
        if (popupTimer > 0) {
            popupTimer -= deltaTime;
            if (popupTimer <= 0) {
                lastUnlocked = null;
            }
        }
    }
    
    /**
     * Проверить, разблокировано ли достижение
     */
    public static boolean isUnlocked(Achievement achievement) {
        return unlocked.contains(achievement);
    }
    
    /**
     * Получить количество разблокированных достижений
     */
    public static int getUnlockedCount() {
        return unlocked.size();
    }
    
    /**
     * Получить общее количество достижений
     */
    public static int getTotalCount() {
        return Achievement.values().length;
    }
    
    /**
     * Получить последнее разблокированное достижение (для показа попапа)
     */
    public static Achievement getLastUnlocked() {
        return lastUnlocked;
    }
    
    /**
     * Показывается ли сейчас попап
     */
    public static boolean isShowingPopup() {
        return popupTimer > 0 && lastUnlocked != null;
    }
    
    /**
     * Получить прогресс попапа (0-1)
     */
    public static float getPopupProgress() {
        return popupTimer / POPUP_DURATION;
    }
    
    // Сериализация разблокированных достижений в строку
    public static String getUnlockedAsString() {
        if (unlocked.isEmpty()) {
            return "";
        }
        
        StringBuilder sb = new StringBuilder();
        for (Achievement a : unlocked) {
            if (sb.length() > 0) {
                sb.append(",");
            }
            sb.append(a.getId());
        }
        return sb.toString();
    }
    
    // Загрузка достижений из строки

    public static void loadFromString(String data) {
        unlocked.clear();
        
        if (data == null || data.isEmpty()) {
            return;
        }
        
        String[] ids = data.split(",");
        for (String id : ids) {
            Achievement a = Achievement.fromId(id.trim());
            if (a != null) {
                unlocked.add(a);
            }
        }
    }
    
    //  Сбросить все достижения
    public static void reset() {
        unlocked.clear();
        lastUnlocked = null;
        popupTimer = 0;
    }
    
    // Получить все разблокированные достижения
    public static Set<Achievement> getUnlocked() {
        return new HashSet<>(unlocked);
    }
    
    // Получить все достижения
    public static Achievement[] getAll() {
        return Achievement.values();
    }
}
