package com.grigowashere.aismap.controllers;

import android.content.Context;
import android.util.Log;
import com.grigowashere.aismap.maps.MapInterface;
import com.grigowashere.aismap.maps.YandexMapImpl;
import com.yandex.mapkit.mapview.MapView;

/**
 * Контроллер для управления картами
 * Инкапсулирует логику инициализации и управления различными картами
 */
public class MapController {
    
    private static final String TAG = "MapController";
    private static boolean isYandexMapsInitialized = false;
    
    private Context context;
    private MapInterface currentMapInterface;
    private MapView mapView;
    
    public MapController(Context context) {
        this.context = context;
    }
    
    /**
     * Инициализирует карту указанного типа
     */
    public MapInterface initializeMap(String mapType, MapView mapView) {
        this.mapView = mapView;
        
        switch (mapType.toLowerCase()) {
            case "yandex":
                return initializeYandexMaps();
            case "mapforge":
                return initializeMapForge();
            default:
                Log.e(TAG, "Неизвестный тип карты: " + mapType);
                return null;
        }
    }
    
    /**
     * Инициализирует Яндекс.Карты
     */
    private MapInterface initializeYandexMaps() {
        try {
            // Проверяем, что Яндекс.Карты уже инициализированы
            if (!isYandexMapsInitialized) {
                Log.w(TAG, "Яндекс.Карты не инициализированы. Должны быть инициализированы в MainActivity");
                return null;
            }
            
            Log.i(TAG, "Создаем интерфейс для Яндекс.Карт");
            
            // Создаем интерфейс для Яндекс.Карт
            currentMapInterface = new YandexMapImpl(context, mapView);
            return currentMapInterface;
            
        } catch (Exception e) {
            Log.e(TAG, "Ошибка при создании интерфейса Яндекс.Карт: " + e.getMessage());
            return null;
        }
    }
    
    /**
     * Инициализирует MapForge
     */
    private MapInterface initializeMapForge() {
        try {
            // TODO: Реализовать инициализацию MapForge
            Log.i(TAG, "MapForge инициализация (пока не реализована)");
            return null;
        } catch (Exception e) {
            Log.e(TAG, "Ошибка при инициализации MapForge: " + e.getMessage());
            return null;
        }
    }
    
    /**
     * Запускает карту
     */
    public void startMap() {
        if (mapView != null) {
            mapView.onStart();
        }
        
        if (isYandexMapsInitialized) {
            com.yandex.mapkit.MapKitFactory.getInstance().onStart();
        }
    }
    
    /**
     * Останавливает карту
     */
    public void stopMap() {
        if (mapView != null) {
            mapView.onStop();
        }
        
        if (isYandexMapsInitialized) {
            com.yandex.mapkit.MapKitFactory.getInstance().onStop();
        }
    }
    
    /**
     * Получает текущий интерфейс карты
     */
    public MapInterface getCurrentMapInterface() {
        return currentMapInterface;
    }
    
    /**
     * Устанавливает флаг инициализации Яндекс.Карт
     */
    public static void setYandexMapsInitialized(boolean initialized) {
        isYandexMapsInitialized = initialized;
    }
    
    /**
     * Освобождает ресурсы
     */
    public void cleanup() {
        if (currentMapInterface != null) {
            currentMapInterface.cleanup();
        }
        
        if (mapView != null) {
            mapView.onStop();
        }
        
        if (isYandexMapsInitialized) {
            com.yandex.mapkit.MapKitFactory.getInstance().onStop();
        }
    }
}
