package com.grigowashere.aismap.maps;

import com.grigowashere.aismap.models.Vessel;
import com.grigowashere.aismap.models.AISVessel;

import java.util.List;

/**
 * Интерфейс для работы с картами
 * Позволяет использовать разные SDK карт
 */
public interface MapInterface {
    
    /**
     * Инициализация карты
     */
    void initialize();
    
    /**
     * Очистка ресурсов карты
     */
    void cleanup();
    
    /**
     * Добавление метки нашего судна
     */
    void addOwnVesselMarker(Vessel vessel);
    
    /**
     * Обновление позиции нашего судна
     */
    void updateOwnVesselPosition(Vessel vessel);
    
    /**
     * Добавление метки AIS судна
     */
    void addAISVesselMarker(AISVessel vessel);
    
    /**
     * Обновление позиции AIS судна
     */
    void updateAISVesselPosition(AISVessel vessel);

    /**
     * Пакетное обновление AIS судов
     */
    void updateAISVesselPositions(List<AISVessel> vessels);
    
    /**
     * Удаление метки AIS судна
     */
    void removeAISVesselMarker(String mmsi);
    
    /**
     * Очистка всех AIS меток
     */
    void clearAISVesselMarkers();
    
    /**
     * Центрирование карты на позиции
     */
    void centerOnPosition(double latitude, double longitude);
    
    /**
     * Установка зума карты
     */
    void setZoom(float zoom);
    
    /**
     * Получение текущего зума
     */
    float getZoom();
    
    /**
     * Установка курса (bearing) карты в градусах (0 = север вверх)
     */
    void setBearing(float bearing);
    
    /**
     * Текущий курс (bearing) карты в градусах
     */
    float getBearing();
    
    /**
     * Добавление дополнительного слоя
     */
    void addLayer(String layerId, Object layerData);
    
    /**
     * Удаление слоя
     */
    void removeLayer(String layerId);
    
    /**
     * Установка обработчика кликов по меткам
     */
    void setMarkerClickListener(MarkerClickListener listener);
    
    /**
     * Очистка трекера пути собственного судна
     */
    void clearVesselPath();
    
    /**
     * Обновление всех путей судов на карте
     */
    void updateAllVesselPaths();
    
    /**
     * Показать курсор на карте
     */
    void showCursor();
    
    /**
     * Скрыть курсор на карте
     */
    void hideCursor();
    
    /**
     * Обновить координаты курсора (центра экрана)
     */
    void updateCursorCoordinates(double latitude, double longitude);
    
    /**
     * Обновить координаты курсора автоматически при движении карты
     */
    void updateCursorFromMapCenter();

    /**
     * Установить информацию об AIS судне под курсором
     */
    void setAisVesselInfo(com.grigowashere.aismap.models.AISVessel vessel);

    /**
     * Очистить информацию об AIS судне
     */
    void clearAisVesselInfo();
    
    /**
     * Интерфейс для обработки кликов по меткам
     */
    interface MarkerClickListener {
        void onOwnVesselClick(Vessel vessel);
        void onAISVesselClick(AISVessel vessel);
    }
}
