package com.grigowashere.aismap.maps;

import android.content.Context;
import android.graphics.Color;

import com.grigowashere.aismap.models.Vessel;
import com.grigowashere.aismap.models.AISVessel;
import org.mapsforge.core.model.LatLong;
import org.mapsforge.map.android.view.MapView;
import org.mapsforge.map.layer.Layers;
import org.mapsforge.map.layer.overlay.Marker;
import org.mapsforge.map.model.Model;
import org.mapsforge.core.graphics.Bitmap;

import java.util.HashMap;
import java.util.Map;

/**
 * Реализация карты для MapForge
 */
public class MapForgeImpl implements MapInterface {
    
    private Context context;
    private MapView mapView;
    private Layers layers;
    private MarkerClickListener markerClickListener;
    
    private Map<String, Marker> aisMarkers;
    private Marker ownVesselMarker;
    
    public MapForgeImpl(Context context, MapView mapView) {
        this.context = context;
        this.mapView = mapView;
        this.aisMarkers = new HashMap<>();
        this.layers = mapView.getLayerManager().getLayers();
    }
    
    @Override
    public void initialize() {
        // MapForge уже инициализирован
    }
    
    @Override
    public void cleanup() {
        if (mapView != null) {
            mapView.destroy();
        }
    }
    
    @Override
    public void addOwnVesselMarker(Vessel vessel) {
        if (ownVesselMarker != null) {
            layers.remove(ownVesselMarker);
        }
        
        LatLong position = new LatLong(vessel.getLatitude(), vessel.getLongitude());
        org.mapsforge.core.graphics.Bitmap icon = createMapForgeIcon(Color.BLUE, vessel.getCourse());
        
        ownVesselMarker = new Marker(position, icon, 0, 0);
        // MapForge не поддерживает OnTapListener напрямую, нужно использовать другой подход
        
        layers.add(ownVesselMarker);
    }
    
    @Override
    public void updateOwnVesselPosition(Vessel vessel) {
        if (ownVesselMarker != null) {
            LatLong newPosition = new LatLong(vessel.getLatitude(), vessel.getLongitude());
            ownVesselMarker.setLatLong(newPosition);
            
            org.mapsforge.core.graphics.Bitmap icon = createMapForgeIcon(Color.BLUE, vessel.getCourse());
            ownVesselMarker.setBitmap(icon);
        }
    }
    
    @Override
    public void addAISVesselMarker(AISVessel vessel) {
        LatLong position = new LatLong(vessel.getLatitude(), vessel.getLongitude());
        // Используем heading вместо course для поворота маркера AIS судна
        double rotationAngle = vessel.getHeading() > 0 ? vessel.getHeading() : vessel.getCourse();
        org.mapsforge.core.graphics.Bitmap icon = createMapForgeIcon(Color.RED, rotationAngle);
        
        Marker marker = new Marker(position, icon, 0, 0);
        // MapForge не поддерживает OnTapListener напрямую
        
        layers.add(marker);
        aisMarkers.put(vessel.getMmsi(), marker);
    }
    
    @Override
    public void updateAISVesselPosition(AISVessel vessel) {
        Marker marker = aisMarkers.get(vessel.getMmsi());
        if (marker != null) {
            LatLong newPosition = new LatLong(vessel.getLatitude(), vessel.getLongitude());
            marker.setLatLong(newPosition);
            
            // Используем heading вместо course для поворота маркера AIS судна
            double rotationAngle = vessel.getHeading() > 0 ? vessel.getHeading() : vessel.getCourse();
            org.mapsforge.core.graphics.Bitmap icon = createMapForgeIcon(Color.RED, rotationAngle);
            marker.setBitmap(icon);
        }
    }
    
    @Override
    public void removeAISVesselMarker(String mmsi) {
        Marker marker = aisMarkers.remove(mmsi);
        if (marker != null) {
            layers.remove(marker);
        }
    }
    
    @Override
    public void clearAISVesselMarkers() {
        for (Marker marker : aisMarkers.values()) {
            layers.remove(marker);
        }
        aisMarkers.clear();
    }
    
    @Override
    public void centerOnPosition(double latitude, double longitude) {
        LatLong position = new LatLong(latitude, longitude);
        mapView.getModel().mapViewPosition.setCenter(position);
    }
    
    @Override
    public void setZoom(float zoom) {
        mapView.getModel().mapViewPosition.setZoomLevel((byte) zoom);
    }
    
    @Override
    public float getZoom() {
        return mapView.getModel().mapViewPosition.getZoomLevel();
    }
    
    @Override
    public void addLayer(String layerId, Object layerData) {
        // Реализация добавления слоев для MapForge
    }
    
    @Override
    public void removeLayer(String layerId) {
        // Реализация удаления слоев
    }
    
    @Override
    public void setMarkerClickListener(MarkerClickListener listener) {
        this.markerClickListener = listener;
    }
    
    private org.mapsforge.core.graphics.Bitmap createMapForgeIcon(int color, double course) {
        // Создаем простую иконку для MapForge
        // В реальном приложении нужно конвертировать Android Bitmap в MapForge Bitmap
        // Пока возвращаем null - это заглушка
        return null;
    }
    
    public MapView getMapView() {
        return mapView;
    }
}
