package com.grigowashere.aismap;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.view.ViewGroup;
import android.graphics.Color;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.android.material.bottomsheet.BottomSheetDialog;

import com.grigowashere.aismap.controllers.AppController;
import com.grigowashere.aismap.controllers.MapController;
import com.grigowashere.aismap.maps.MapInterface;
import com.grigowashere.aismap.models.Vessel;
import com.grigowashere.aismap.models.AISVessel;
import com.grigowashere.aismap.sensors.CompassSensor;
import com.grigowashere.aismap.view.CompassView;
import com.grigowashere.aismap.view.CoordinatesDockWidget;
import com.grigowashere.aismap.view.BaseDockWidget;
import com.grigowashere.aismap.utils.SettingsManager;
import com.grigowashere.aismap.utils.LogSender;
import com.grigowashere.aismap.utils.MIDToCountry;
import com.yandex.mapkit.mapview.MapView;
import java.util.List;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    
    private static final String TAG = "MainActivity";
    private static final int PERMISSION_REQUEST_CODE = 1001;
    private static final int SETTINGS_REQUEST_CODE = 1002;
    
    // Статическая переменная для отслеживания инициализации Яндекс.Карт
    private static boolean isYandexMapsInitialized = false;
    
    private AppController appController;
    private MapController mapController;
    private MapInterface mapInterface;
    private MapView mapView;
    private SettingsManager settingsManager;
    
    private Button btnCenterOnVessel;
    private Button btnMapOrientation;
    private Button btnSettings;
    private Button btnAisTargets;
    private LinearLayout controlPanel;
    private CompassView compassView;
    private CompassSensor compassSensor;
    private CoordinatesDockWidget coordinatesWidget;
    private TextView tvGpsAge;
    private TextView tvAisAge;
    private android.os.Handler messageAgeHandler;
    private Runnable messageAgeRunnable;
    
    // BottomSheet для отображения информации о нашем судне
    private BottomSheetDialog ownVesselBottomSheet;
    private View bottomSheetView;
    
    // BottomSheet для отображения информации об AIS судне
    private BottomSheetDialog aisVesselBottomSheet;
    private View aisBottomSheetView;
    private AISVessel currentAISVessel; // Текущее AIS судно в BottomSheet
    private android.os.Handler timeUpdateHandler; // Handler для обновления времени
    private Runnable timeUpdateRunnable; // Runnable для обновления времени
    
    // Автоматическое обновление BottomSheet
    private android.os.Handler bottomSheetUpdateHandler; // Handler для обновления BottomSheet
    private Runnable bottomSheetUpdateRunnable; // Runnable для обновления BottomSheet
    private static final int BOTTOM_SHEET_UPDATE_INTERVAL = 1000; // Обновление каждую секунду

    // Отложенное центрирование из внешнего интента
    private Double pendingCenterLat = null;
    private Double pendingCenterLon = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // Инициализируем Яндекс.Карты перед setContentView
        initializeYandexMaps();
        
        setContentView(R.layout.activity_main);
        
        initializeViews();
        initializeControllers();
        // checkPermissions() будет вызван в onStart
    }
    
    private void initializeViews() {
        mapView = findViewById(R.id.map_view);
        btnCenterOnVessel = findViewById(R.id.btn_center_vessel);
        btnMapOrientation = findViewById(R.id.btn_map_orientation);
        btnSettings = findViewById(R.id.btn_settings);
        btnAisTargets = findViewById(R.id.btn_ais_targets);
        controlPanel = findViewById(R.id.control_panel);
        compassView = findViewById(R.id.compass_view);
        coordinatesWidget = findViewById(R.id.coordinates_widget);
        tvGpsAge = findViewById(R.id.tv_gps_age);
        tvAisAge = findViewById(R.id.tv_ais_age);
        
        // Инициализируем магнитный компас
        compassSensor = new CompassSensor(this);
        
        initializeBottomSheet();
        setupButtonListeners();
        setupCompass();
        setupCoordinatesWidget();
        setupMessageAgesUpdater();
    }
    
    private void setupButtonListeners() {
        btnCenterOnVessel.setOnClickListener(v -> centerOnVessel());
        btnMapOrientation.setOnClickListener(v -> toggleMapOrientation());
        btnSettings.setOnClickListener(v -> showSettings());
        if (btnAisTargets != null) {
            btnAisTargets.setOnClickListener(v -> openAisTargets());
        }
        
        // Кнопка для показа информации о судне
//        Button btnShowVesselInfo = findViewById(R.id.btn_show_vessel_info);
//        if (btnShowVesselInfo != null) {
//            btnShowVesselInfo.setOnClickListener(v -> showOwnVesselBottomSheet());
//        }
    }
    
    private void setupCompass() {
        // Устанавливаем начальный азимут (например, север)
        compassView.setAzimuth(0);
        
        // Устанавливаем компас в dock-режим вверху экрана
        compassView.post(() -> {
            compassView.setDocked(true, true, 0, 0);
            compassView.invalidate(); // Принудительная отрисовка
        });
        
        // Настраиваем слушатель изменения размера док-виджета
        compassView.setOnDockResizeListener(newHeight -> {
            Log.d(TAG, "Compass dock height changed to: " + newHeight);
            // Обновляем позицию панели управления при любом изменении размера docked виджета
            updateControlPanelPosition();
        });
        
        // Настраиваем слушатель изменения состояния docked
        compassView.setOnDockStateChangeListener((isDocked, isTop) -> {
            Log.d(TAG, "Compass dock state changed: docked=" + isDocked + ", top=" + isTop);
            
            // Перепозиционируем все docked виджеты
            BaseDockWidget.repositionAllDockedWidgets((ViewGroup) compassView.getParent());
            
            updateControlPanelPosition();
        });
        //smt changed
        // Настраиваем магнитный компас
        if (compassSensor.isAvailable()) {
            compassSensor.startListening(new CompassSensor.CompassListener() {
        //check how git is working
                @Override
                public void onCompassChanged(float azimuth) {
                    // Обновляем компас в UI потоке
                    runOnUiThread(() -> {
                        compassView.setAzimuth(azimuth);
                        compassView.setMagneticCompass(azimuth);
                        
                        // Обновляем магнитный компас в модели нашего судна
                        if (appController != null) {
                            Vessel ourVessel = appController.getOwnVessel();
                            if (ourVessel != null) {
                                ourVessel.setMagneticCompass(azimuth);
                            }
                        }
                    });
                }
            });
            Log.d(TAG, "Magnetic compass started");
        } else {
            Log.w(TAG, "Magnetic compass not available");
        }
        
        // Принудительная отрисовка
        compassView.invalidate();
        
        // Инициализируем начальную позицию панели управления
        compassView.post(() -> {
            updateControlPanelPosition();
        });
    }
    
    private void setupCoordinatesWidget() {
        // Настраиваем слушатель изменения размера dock-виджета
        coordinatesWidget.setOnDockResizeListener(newHeight -> {
            Log.d(TAG, "Coordinates dock height changed to: " + newHeight);
            // Обновляем позицию панели управления при любом изменении размера docked виджета
            updateControlPanelPosition();
        });
        
        // Настраиваем слушатель изменения состояния docked
        coordinatesWidget.setOnDockStateChangeListener((isDocked, isTop) -> {
            Log.d(TAG, "Coordinates dock state changed: docked=" + isDocked + ", top=" + isTop);
            
            // Перепозиционируем все docked виджеты
            BaseDockWidget.repositionAllDockedWidgets((ViewGroup) coordinatesWidget.getParent());
            
            updateControlPanelPosition();
        });
        
        // Устанавливаем виджет координат в dock-режим внизу экрана
        coordinatesWidget.post(() -> {
            Log.d(TAG, "Setting coordinates widget to dock mode");
            coordinatesWidget.setDocked(true, false, 0, 0); // false = dock снизу
            coordinatesWidget.invalidate(); // Принудительная отрисовка
            
            // Принудительно обновляем виджет с тестовыми данными
            Vessel testVessel = new Vessel();
            testVessel.setLatitude(55.7558);
            testVessel.setLongitude(37.6176);
            testVessel.setSpeed(5.5);
            testVessel.setCourse(45.0);
            testVessel.setAccuracy(3.0f);
            coordinatesWidget.updateVessel(testVessel);
            
            updateControlPanelPosition();
        });
    }

    private void setupMessageAgesUpdater() {
        messageAgeHandler = new android.os.Handler(android.os.Looper.getMainLooper());
        messageAgeRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                    if (appController != null) {
                        int gpsSec = appController.getSecondsSinceLastGPSMessage();
                        int aisSec = appController.getSecondsSinceLastAISMessage();
                        if (tvGpsAge != null) {
                            tvGpsAge.setText(gpsSec >= 0 ? ("GPS: " + gpsSec + " сек назад") : "GPS: --");
                            tvGpsAge.setTextColor(getAgeColor(gpsSec));
                        }
                        if (tvAisAge != null) {
                            tvAisAge.setText(aisSec >= 0 ? ("AIS: " + aisSec + " сек назад") : "AIS: --");
                            tvAisAge.setTextColor(getAgeColor(aisSec));
                        }
                    }
                } catch (Exception ignored) {}
                messageAgeHandler.postDelayed(this, 1000);
            }
        };
        // Стартуем после первичной инициализации
        messageAgeHandler.postDelayed(messageAgeRunnable, 1000);
    }

    private int getAgeColor(int seconds) {
        if (seconds < 0) {
            // Нет данных
            return Color.parseColor("#F44336"); // красный
        }
        if (seconds < 30) {
            return Color.parseColor("#4CAF50"); // зелёный
        } else if (seconds < 300) {
            return Color.parseColor("#FFC107"); // жёлтый
        } else {
            return Color.parseColor("#F44336"); // красный
        }
    }
    
    private void onUpdateCompass(float azimuth, List<AISVessel> nearbyVessels) {
        if (compassView != null) {
            compassView.setAzimuth(azimuth);
            compassView.updateNearbyVessels(nearbyVessels);
        }
    }
    
    /**
     * Инициализирует BottomSheet для отображения информации о нашем судне
     */
    private void initializeBottomSheet() {
        // Инициализация Handler для обновления времени
        timeUpdateHandler = new android.os.Handler(android.os.Looper.getMainLooper());
        timeUpdateRunnable = new Runnable() {
            @Override
            public void run() {
                if (currentAISVessel != null && aisVesselBottomSheet != null && aisVesselBottomSheet.isShowing()) {
                    updateAISTimeAgo();
                }
                // Планируем следующее обновление через 1 секунду
                timeUpdateHandler.postDelayed(this, 1000);
            }
        };
        
        // Инициализация Handler для автоматического обновления BottomSheet
        bottomSheetUpdateHandler = new android.os.Handler(android.os.Looper.getMainLooper());
        bottomSheetUpdateRunnable = new Runnable() {
            @Override
            public void run() {
                // Обновляем BottomSheet нашего судна, если он открыт
                if (ownVesselBottomSheet != null && ownVesselBottomSheet.isShowing()) {
                    updateBottomSheetUI();
                }
                
                // Обновляем AIS BottomSheet, если он открыт
                if (aisVesselBottomSheet != null && aisVesselBottomSheet.isShowing() && currentAISVessel != null) {
                    updateAISBottomSheetUI(currentAISVessel);
                }
                
                // Планируем следующее обновление
                bottomSheetUpdateHandler.postDelayed(this, BOTTOM_SHEET_UPDATE_INTERVAL);
            }
        };
        
        // Инициализация BottomSheet для нашего судна
        ownVesselBottomSheet = new BottomSheetDialog(this);
        bottomSheetView = getLayoutInflater().inflate(R.layout.bottom_sheet_own_vessel, null);
        ownVesselBottomSheet.setContentView(bottomSheetView);
        
        // Настраиваем кнопку закрытия
        ImageButton btnClose = bottomSheetView.findViewById(R.id.btn_close_bottom_sheet);
        btnClose.setOnClickListener(v -> {
            ownVesselBottomSheet.dismiss();
            // Восстанавливаем обработчики кликов после закрытия
            restoreMarkerClickListeners();
            // Останавливаем автоматическое обновление
            stopBottomSheetAutoUpdate();
        });
        
        // Настраиваем поведение BottomSheet
        ownVesselBottomSheet.setCanceledOnTouchOutside(true);
        ownVesselBottomSheet.setCancelable(true);
        
        // Добавляем слушатель закрытия BottomSheet
        ownVesselBottomSheet.setOnDismissListener(dialog -> {
            // Восстанавливаем обработчики кликов после закрытия
            restoreMarkerClickListeners();
            // Останавливаем автоматическое обновление
            stopBottomSheetAutoUpdate();
        });
        
        // Инициализация BottomSheet для AIS судов
        aisVesselBottomSheet = new BottomSheetDialog(this);
        aisBottomSheetView = getLayoutInflater().inflate(R.layout.bottom_sheet_ais_vessel, null);
        aisVesselBottomSheet.setContentView(aisBottomSheetView);
        
        // Настраиваем кнопку закрытия для AIS BottomSheet
        ImageButton btnCloseAIS = aisBottomSheetView.findViewById(R.id.btn_close_ais_bottom_sheet);
        btnCloseAIS.setOnClickListener(v -> {
            aisVesselBottomSheet.dismiss();
            stopTimeUpdate();
            // Восстанавливаем обработчики кликов после закрытия
            restoreMarkerClickListeners();
            // Останавливаем автоматическое обновление
            stopBottomSheetAutoUpdate();
        });
        
        // Настраиваем поведение AIS BottomSheet
        aisVesselBottomSheet.setCanceledOnTouchOutside(true);
        aisVesselBottomSheet.setCancelable(true);
        
        // Добавляем слушатель закрытия BottomSheet
        aisVesselBottomSheet.setOnDismissListener(dialog -> {
            stopTimeUpdate();
            // Восстанавливаем обработчики кликов после закрытия
            restoreMarkerClickListeners();
            // Останавливаем автоматическое обновление
            stopBottomSheetAutoUpdate();
        });
    }
    
    private void initializeControllers() {
        // Инициализация менеджера настроек
        settingsManager = new SettingsManager(this);
        
        // Инициализация главного контроллера
        appController = new AppController(this);
        
        // Инициализация контроллера карты
        mapController = new MapController(this);
        
        // Устанавливаем callback для обновления UI

        // Запускаем Foreground Service для фоновых обновлений AIS/GPS
        try {
            android.content.Intent svc = new android.content.Intent(this, com.grigowashere.aismap.services.AISForegroundService.class);
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                startForegroundService(svc);
            } else {
                startService(svc);
            }
        } catch (Exception e) {
            android.util.Log.e("MainActivity", "Не удалось запустить ForegroundService: " + e.getMessage(), e);
        }
        appController.setUIUpdateCallback(new AppController.ExtendedUIUpdateCallback() {
            @Override
            public void onVesselPositionUpdated(Vessel vessel) {
                updateVesselPositionUI(vessel);
                // Обновляем наше судно в компасе
                if (compassView != null) {
                    compassView.setOurVessel(vessel);
                }
            }
            
            @Override
            public void onGPSQualityUpdated(Vessel vessel) {
                updateGPSQualityUI(vessel);
            }
            
            @Override
            public void onShowOwnVesselBottomSheet() {
                Log.i(TAG, "onShowOwnVesselBottomSheet callback получен в MainActivity");
                showOwnVesselBottomSheet();
            }
            
            @Override
            public void onShowAISVesselInfo(AISVessel vessel) {
                showAISVesselBottomSheet(vessel);
            }
            
            @Override
            public void onUpdateCompass(float azimuth, List<AISVessel> nearbyVessels) {
                if (compassView != null) {
                    compassView.setAzimuth(azimuth);
                    compassView.updateNearbyVessels(nearbyVessels);
                }
            }
        });
    }
    
    private void startControllers() {
        // Загружаем настройки и применяем их
        applySettings();
        
        // Запускаем все слушатели
        appController.startAllListeners();
    }
    
    /**
     * Обновляет статус в UI
     */
    private void updateStatusUI() {
        // Обновляем статус в UI
//        TextView tvStatus = findViewById(R.id.tv_status);
//        TextView tvAisCount = findViewById(R.id.tv_ais_count);
//
//        if (tvStatus != null) {
//            tvStatus.setText("Статус: GPS активен, UDP готов");
//        }
//
//        if (tvAisCount != null) {
//            tvAisCount.setText("AIS суда: 0");
//        }
    }
    
    /**
     * Обновляет позицию судна в UI
     */
    private void updateVesselPositionUI(Vessel vessel) {
        runOnUiThread(() -> {
            if (vessel == null) return;
            
            // Обновляем статус
//            TextView tvStatus = findViewById(R.id.tv_status);
//            if (tvStatus != null) {
//                tvStatus.setText("Статус: GPS активен, данные получены");
//            }
            
            // Обновляем виджет координат
            if (coordinatesWidget != null) {
                coordinatesWidget.updateVessel(vessel);
            }
            
            // Обновляем BottomSheet, если он открыт
            if (ownVesselBottomSheet != null && ownVesselBottomSheet.isShowing()) {
                updateBottomSheetUI();
            }
        });
    }
    
    /**
     * Обновляет качество GPS в UI
     */
    private void updateGPSQualityUI(Vessel vessel) {
        runOnUiThread(() -> {
            if (vessel == null) return;
            
            // Обновляем BottomSheet, если он открыт
            if (ownVesselBottomSheet != null && ownVesselBottomSheet.isShowing()) {
                updateBottomSheetUI();
            }
        });
    }
    
    private void toggleUDP() {
        boolean isEnabled = appController.isUDPEnabled();
        
        if (isEnabled) {
            appController.setUDPEnabled(false);
            Toast.makeText(this, "UDP слушатель отключен", Toast.LENGTH_SHORT).show();
        } else {
            appController.setUDPEnabled(true);
            Toast.makeText(this, "UDP слушатель включен", Toast.LENGTH_SHORT).show();
        }
        
        // Обновляем заголовок меню
        invalidateOptionsMenu();
    }
    
    private void toggleGPS() {
        boolean isEnabled = appController.isAndroidNMEAEnabled();
        
        if (isEnabled) {
            appController.setAndroidNMEAEnabled(false);
            Toast.makeText(this, "GPS слушатель отключен", Toast.LENGTH_SHORT).show();
        } else {
            appController.setAndroidNMEAEnabled(true);
            Toast.makeText(this, "GPS слушатель включен", Toast.LENGTH_SHORT).show();
        }
        
        // Обновляем заголовок меню
        invalidateOptionsMenu();
    }
    
    private void centerOnVessel() {
        appController.centerOnOwnVessel();
        Toast.makeText(this, "Карта центрирована на судне", Toast.LENGTH_SHORT).show();
    }
    
    private void toggleMapOrientation() {
        // TODO: Реализовать переключение ориентации карты
        // Состояния: север, курс, компас
        Toast.makeText(this, "Переключение ориентации карты (в разработке)", Toast.LENGTH_SHORT).show();
    }
    
    private void togglePathTracking() {
        boolean currentState = settingsManager.isPathTrackingEnabled();
        boolean newState = !currentState;
        
        settingsManager.setPathTrackingEnabled(newState);
        
        // Обновляем состояние в карте
        if (mapInterface instanceof com.grigowashere.aismap.maps.YandexMapImpl) {
            ((com.grigowashere.aismap.maps.YandexMapImpl) mapInterface).setPathTrackingEnabled(newState);
        }
        
        String message = newState ? "Отслеживание путей включено" : "Отслеживание путей выключено";
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
        
        // Обновляем меню
        invalidateOptionsMenu();
    }
    
    private void showSettings() {
        Intent intent = new Intent(this, SettingsActivity.class);
        startActivityForResult(intent, SETTINGS_REQUEST_CODE);
    }

    private void openAisTargets() {
        Intent intent = new Intent(this, AisTargetsActivity.class);
        startActivity(intent);
    }
    
    /**
     * Обновляет позицию панели управления в зависимости от состояния docked виджетов
     */
    private void updateControlPanelPosition() {
        if (controlPanel != null) {
            // Используем postDelayed для предотвращения частых обновлений layout
            controlPanel.postDelayed(() -> {
                try {
                    // Получаем текущие параметры layout
                    android.widget.RelativeLayout.LayoutParams params = 
                        (android.widget.RelativeLayout.LayoutParams) controlPanel.getLayoutParams();
                
                int topMargin = dpToPx(16); // По умолчанию отступ сверху
                int bottomMargin = dpToPx(16); // По умолчанию отступ снизу
                
                // Вычисляем общую высоту всех docked виджетов сверху
                int totalTopHeight = 0;
                if (compassView != null && compassView.isDocked() && compassView.isDockTop()) {
                    totalTopHeight += compassView.getHeight();
                    Log.d(TAG, "Compass docked top, height: " + compassView.getHeight());
                }
                if (coordinatesWidget != null && coordinatesWidget.isDocked() && coordinatesWidget.isDockTop()) {
                    totalTopHeight += coordinatesWidget.getHeight();
                    Log.d(TAG, "Coordinates docked top, height: " + coordinatesWidget.getHeight());
                }
                
                // Вычисляем общую высоту всех docked виджетов снизу
                int totalBottomHeight = 0;
                if (compassView != null && compassView.isDocked() && !compassView.isDockTop()) {
                    totalBottomHeight += compassView.getHeight();
                    Log.d(TAG, "Compass docked bottom, height: " + compassView.getHeight());
                }
                if (coordinatesWidget != null && coordinatesWidget.isDocked() && !coordinatesWidget.isDockTop()) {
                    totalBottomHeight += coordinatesWidget.getHeight();
                    Log.d(TAG, "Coordinates docked bottom, height: " + coordinatesWidget.getHeight());
                }
                
                // Устанавливаем отступы с учетом всех docked виджетов
                if (totalTopHeight > 0) {
                    topMargin = totalTopHeight + dpToPx(8); // + небольшой отступ
                }
                if (totalBottomHeight > 0) {
                    bottomMargin = totalBottomHeight + dpToPx(8); // + небольшой отступ
                }
                
                // Устанавливаем отступы
                params.topMargin = topMargin;
                params.bottomMargin = bottomMargin;
                
                // Применяем новые параметры
                controlPanel.setLayoutParams(params);
                
                    Log.d(TAG, "Control panel position updated: " +
                          "topMargin=" + topMargin + "px, " +
                          "bottomMargin=" + bottomMargin + "px, " +
                          "totalTopHeight=" + totalTopHeight + "px, " +
                          "totalBottomHeight=" + totalBottomHeight + "px, " +
                          "compassDocked=" + (compassView != null ? compassView.isDocked() : false) + 
                          ", compassTop=" + (compassView != null ? compassView.isDockTop() : false) +
                          ", coordinatesDocked=" + (coordinatesWidget != null ? coordinatesWidget.isDocked() : false) +
                          ", coordinatesTop=" + (coordinatesWidget != null ? coordinatesWidget.isDockTop() : false));
                } catch (Exception e) {
                    Log.e(TAG, "Ошибка при обновлении позиции панели управления: " + e.getMessage(), e);
                }
            }, 50); // Задержка 50мс для throttling
        }
    }
    

    
    private void clearAIS() {
        appController.clearAISVessels();
        Toast.makeText(this, "AIS суда очищены", Toast.LENGTH_SHORT).show();
    }
    
    /**
     * Конвертирует dp в px
     */
    private int dpToPx(int dp) {
        return (int) (dp * getResources().getDisplayMetrics().density);
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        
        // Запускаем карту через контроллер
        if (mapController != null) {
            Log.i(TAG, "Запускаем карту...");
            mapController.startMap();
            
            // Инициализируем карту
            Log.i(TAG, "Инициализируем карту...");
            mapInterface = mapController.initializeMap("yandex", mapView);
            Log.i(TAG, "mapInterface получен: " + (mapInterface != null ? "успешно" : "null"));
            
            // Устанавливаем интерфейс карты в главный контроллер
            if (mapInterface != null) {
                Log.i(TAG, "Устанавливаем mapInterface в AppController...");
                appController.setMapInterface(mapInterface);
                Log.i(TAG, "mapInterface установлен в AppController");
                
                mapInterface.initialize();
                Log.i(TAG, "Карта инициализирована");

                // Применяем отложенное центрирование, если было
                applyPendingCenterIfAny();
                
                // Инициализируем отслеживание путей
                if (mapInterface instanceof com.grigowashere.aismap.maps.YandexMapImpl) {
                    boolean pathTrackingEnabled = settingsManager.isPathTrackingEnabled();
                    ((com.grigowashere.aismap.maps.YandexMapImpl) mapInterface).setPathTrackingEnabled(pathTrackingEnabled);
                    Log.i(TAG, "Отслеживание путей: " + (pathTrackingEnabled ? "включено" : "выключено"));
                }
                
                // Проверяем, что все настроено правильно
                Log.i(TAG, "Проверяем настройку карты...");
                
                // Дополнительная проверка обработчиков кликов
                Log.i(TAG, "Проверяем обработчики кликов...");
                if (mapInterface instanceof com.grigowashere.aismap.maps.YandexMapImpl) {
                    com.grigowashere.aismap.maps.YandexMapImpl yandexMap = (com.grigowashere.aismap.maps.YandexMapImpl) mapInterface;
                    yandexMap.refreshMarkerClickListeners();
                    Log.i(TAG, "Обработчики кликов обновлены");
                }
            } else {
                Log.e(TAG, "Не удалось получить mapInterface!");
            }
        }
        
        // Обрабатываем возможный интент центрирования
        handleCenterIntentIfAny(getIntent());

        // Проверяем разрешения и запускаем контроллеры
        checkPermissions();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        handleCenterIntentIfAny(intent);
    }

    private void handleCenterIntentIfAny(Intent intent) {
        if (intent == null) return;
        if (intent.hasExtra("center_lat") && intent.hasExtra("center_lon")) {
            double lat = intent.getDoubleExtra("center_lat", 0);
            double lon = intent.getDoubleExtra("center_lon", 0);
            Log.i(TAG, "Получен интент центрирования: lat=" + lat + ", lon=" + lon);
            if (lat != 0 || lon != 0) {
                if (mapInterface != null) {
                    Log.i(TAG, "Центрируем карту немедленно");
                    mapInterface.centerOnPosition(lat, lon);
                } else {
                    // Сохраняем для применения после инициализации карты
                    Log.i(TAG, "Сохраняем координаты для отложенного центрирования");
                    pendingCenterLat = lat;
                    pendingCenterLon = lon;
                }
            }
            // Сбрасываем, чтобы не повторялось при поворотах
            intent.removeExtra("center_lat");
            intent.removeExtra("center_lon");
            intent.removeExtra("center_mmsi");
        }
    }

    private void applyPendingCenterIfAny() {
        if (mapInterface == null) return;
        if (pendingCenterLat != null && pendingCenterLon != null) {
            Log.i(TAG, "Применяем отложенное центрирование: lat=" + pendingCenterLat + ", lon=" + pendingCenterLon);
            mapInterface.centerOnPosition(pendingCenterLat, pendingCenterLon);
            pendingCenterLat = null;
            pendingCenterLon = null;
        }
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        
        // Останавливаем карту
        if (mapInterface != null) {
            mapInterface.cleanup();
        }
        
        // Не останавливаем слушатели здесь, чтобы UDP продолжал работать в фоне
        // if (appController != null) {
        // 	appController.stopAllListeners();
        // }
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        
        // Останавливаем обновление времени
        stopTimeUpdate();
        
        // Останавливаем автоматическое обновление BottomSheet
        stopBottomSheetAutoUpdate();
        
        // Останавливаем магнитный компас
        if (compassSensor != null) {
            compassSensor.stopListening();
        }
        
        // Освобождаем ресурсы
        if (appController != null) {
            appController.cleanup();
        }
        
        if (mapController != null) {
            mapController.cleanup();
        }
        
        // Останавливаем LogSender
        LogSender.shutdown();
    }
    
    @Override
    public void onConfigurationChanged(android.content.res.Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        
        // Обрабатываем изменения конфигурации (например, поворот экрана)
        if (mapInterface != null) {
            // Можно добавить логику для обработки изменений конфигурации карты
        }
    }
    
    /**
     * Проверяет необходимые разрешения
     */
    private void checkPermissions() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
                != PackageManager.PERMISSION_GRANTED) {
            
            ActivityCompat.requestPermissions(this, 
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
                PERMISSION_REQUEST_CODE);
        } else {
            // Разрешения уже получены, запускаем контроллеры
            startControllers();
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Разрешение получено, запускаем контроллеры
                startControllers();
            } else {
                // Разрешение не получено
                Toast.makeText(this, "Для работы приложения необходимо разрешение на доступ к местоположению", 
                    Toast.LENGTH_LONG).show();
            }
        }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        if (requestCode == SETTINGS_REQUEST_CODE) {
            if (resultCode == RESULT_OK && data != null) {
                boolean settingsChanged = data.getBooleanExtra("settings_changed", false);
                boolean needsRestart = data.getBooleanExtra("needs_restart", false);
                
                if (settingsChanged) {
                    Log.i(TAG, "Настройки изменены, применяем изменения");
                    
                    if (needsRestart) {
                        Log.i(TAG, "Требуется перезапуск сервисов");
                        restartServices();
                    } else {
                        Log.i(TAG, "Применяем настройки без перезапуска");
                        applySettings();
                    }
                    
                    Toast.makeText(this, "Настройки применены", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
    
    // Меню
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // Обновляем состояние элементов меню
        MenuItem gpsItem = menu.findItem(R.id.menu_gps);
        MenuItem udpItem = menu.findItem(R.id.menu_udp);
        
        if (gpsItem != null) {
            gpsItem.setTitle(appController.isAndroidNMEAEnabled() ? "GPS ✓" : "GPS");
        }
        
        if (udpItem != null) {
            udpItem.setTitle(appController.isUDPEnabled() ? "UDP ✓" : "UDP");
        }
        
        MenuItem pathItem = menu.findItem(R.id.menu_path_tracking);
        if (pathItem != null) {
            boolean pathEnabled = settingsManager.isPathTrackingEnabled();
            pathItem.setTitle(pathEnabled ? "Пути ✓" : "Пути");
        }
        
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        
        if (id == R.id.menu_gps) {
            toggleGPS();
            return true;
        } else if (id == R.id.menu_udp) {
            toggleUDP();
            return true;
        } else if (id == R.id.menu_clear_ais) {
            clearAIS();
            return true;
        } else if (id == R.id.menu_path_tracking) {
            togglePathTracking();
            return true;
        }
        
        return super.onOptionsItemSelected(item);
    }
    
    /**
     * Показывает BottomSheet с информацией о нашем судне
     */
    private void showOwnVesselBottomSheet() {
        if (ownVesselBottomSheet != null && !ownVesselBottomSheet.isShowing()) {
            updateBottomSheetUI();
            ownVesselBottomSheet.show();
            
            // Запускаем автоматическое обновление BottomSheet
            startBottomSheetAutoUpdate();
        }
    }
    
    /**
     * Обновляет UI BottomSheet с актуальными данными
     */
    private void updateBottomSheetUI() {
        if (bottomSheetView == null) return;
        
        Vessel vessel = appController.getOwnVessel();
        if (vessel == null) return;
        
        // Убеждаемся, что обновление происходит в главном потоке
        runOnUiThread(() -> {
            if (bottomSheetView == null) return;
            
            Vessel currentVessel = appController.getOwnVessel();
            if (currentVessel == null) return;
            
            // Обновляем все поля в BottomSheet
            TextView tvStatus = bottomSheetView.findViewById(R.id.bottom_sheet_status);
            TextView tvPosition = bottomSheetView.findViewById(R.id.bottom_sheet_position);
            TextView tvCourse = bottomSheetView.findViewById(R.id.bottom_sheet_course);
            TextView tvSpeed = bottomSheetView.findViewById(R.id.bottom_sheet_speed);
            TextView tvAltitude = bottomSheetView.findViewById(R.id.bottom_sheet_altitude);
            TextView tvAccuracy = bottomSheetView.findViewById(R.id.bottom_sheet_accuracy);
            TextView tvGPSQuality = bottomSheetView.findViewById(R.id.bottom_sheet_gps_quality);
            TextView tvSatellites = bottomSheetView.findViewById(R.id.bottom_sheet_satellites);
            TextView tvDOP = bottomSheetView.findViewById(R.id.bottom_sheet_dop);
            TextView tvFixTime = bottomSheetView.findViewById(R.id.bottom_sheet_fix_time);
            TextView tvFixQuality = bottomSheetView.findViewById(R.id.bottom_sheet_fix_quality);
        
            // Статус
            if (tvStatus != null) {
                if (currentVessel.getLatitude() != 0 && currentVessel.getLongitude() != 0) {
                    tvStatus.setText("Статус: GPS активен, данные получены");
                } else {
                    tvStatus.setText("Статус: Ожидание GPS данных...");
                }
            }
            
            // Координаты
            if (tvPosition != null) {
                if (currentVessel.getLatitude() != 0 && currentVessel.getLongitude() != 0) {
                    String positionText = String.format("📍 Координаты: %.6f, %.6f", 
                        currentVessel.getLatitude(), currentVessel.getLongitude());
                    tvPosition.setText(positionText);
                } else {
                    tvPosition.setText("📍 Координаты: Не определены");
                }
            }
            
            // Курс
            if (tvCourse != null) {
                if (currentVessel.getCourse() > 0) {
                    String courseText = String.format("🧭 Курс: %.1f°", currentVessel.getCourse());
                    tvCourse.setText(courseText);
                } else {
                    tvCourse.setText("🧭 Курс: --°");
                }
            }
            
            // Скорость
            if (tvSpeed != null) {
                if (currentVessel.getSpeed() > 0) {
                    String speedText = String.format("⚡ Скорость: %.1f узлов", currentVessel.getSpeed());
                    tvSpeed.setText(speedText);
                } else {
                    tvSpeed.setText("⚡ Скорость: -- узлов");
                }
            }
            
            // Высота
            if (tvAltitude != null) {
                if (currentVessel.getAltitude() != 0) {
                    String altitudeText = String.format("🏔️ Высота: %.1f м", currentVessel.getAltitude());
                    tvAltitude.setText(altitudeText);
                } else {
                    tvAltitude.setText("🏔️ Высота: -- м");
                }
            }
            
            // Точность
            if (tvAccuracy != null) {
                if (currentVessel.getAccuracy() > 0) {
                    String accuracyText = String.format("🎯 Точность: %.1f м", currentVessel.getAccuracy());
                    tvAccuracy.setText(accuracyText);
                } else {
                    tvAccuracy.setText("🎯 Точность: -- м");
                }
            }
            
            // Качество GPS
            if (tvGPSQuality != null) {
                if (currentVessel.getGPSQualityDescription() != null) {
                    String qualityText = String.format("📊 Качество GPS: %s", currentVessel.getGPSQualityDescription());
                    tvGPSQuality.setText(qualityText);
                } else {
                    tvGPSQuality.setText("📊 Качество GPS: --");
                }
            }
            
            // Спутники
            if (tvSatellites != null) {
                if (currentVessel.getSatellites() > 0) {
                    String satellitesText = String.format("Спутники: %d/%d", 
                        currentVessel.getActiveSatellites(), currentVessel.getSatellites());
                    tvSatellites.setText(satellitesText);
                } else {
                    tvSatellites.setText("Спутники: --/--");
                }
            }
            
            // DOP
            if (tvDOP != null) {
                if (currentVessel.getPdop() > 0) {
                    String dopText = String.format("📈 DOP: PDOP=%.2f HDOP=%.2f VDOP=%.2f", 
                        currentVessel.getPdop(), currentVessel.getHdop(), currentVessel.getVdop());
                    tvDOP.setText(dopText);
                } else {
                    tvDOP.setText("📈 DOP: PDOP=-- HDOP=-- VDOP=--");
                }
            }
            
            // Время фикса
            if (tvFixTime != null) {
                if (currentVessel.getFixTime() > 0) {
                    java.util.Date fixDate = new java.util.Date(currentVessel.getFixTime());
                    String fixTimeText = String.format("🕐 Время фикса: %s", 
                        new java.text.SimpleDateFormat("HH:mm:ss", java.util.Locale.getDefault()).format(fixDate));
                    tvFixTime.setText(fixTimeText);
                } else {
                    tvFixTime.setText("🕐 Время фикса: --");
                }
            }
            
            // Качество фикса
            if (tvFixQuality != null) {
                if (currentVessel.getFixQuality() != null) {
                    String fixQualityText = String.format("🔒 Качество фикса: %s", currentVessel.getFixQuality());
                    tvFixQuality.setText(fixQualityText);
                } else {
                    tvFixQuality.setText("🔒 Качество фикса: --");
                }
            }
        });
    }
    
    /**
     * Показывает BottomSheet с информацией об AIS судне
     */
    private void showAISVesselBottomSheet(AISVessel vessel) {
        if (aisVesselBottomSheet != null && !aisVesselBottomSheet.isShowing()) {
            currentAISVessel = vessel;
            updateAISBottomSheetUI(vessel);
            aisVesselBottomSheet.show();
            startTimeUpdate();
            
            // Запускаем автоматическое обновление BottomSheet
            startBottomSheetAutoUpdate();
        }
    }
    
    /**
     * Запускает обновление времени
     */
    private void startTimeUpdate() {
        if (timeUpdateHandler != null && timeUpdateRunnable != null) {
            timeUpdateHandler.postDelayed(timeUpdateRunnable, 1000);
        }
    }
    
    /**
     * Останавливает обновление времени
     */
    private void stopTimeUpdate() {
        if (timeUpdateHandler != null && timeUpdateRunnable != null) {
            timeUpdateHandler.removeCallbacks(timeUpdateRunnable);
        }
        currentAISVessel = null;
    }
    
    /**
     * Запускает автоматическое обновление BottomSheet
     */
    private void startBottomSheetAutoUpdate() {
        if (bottomSheetUpdateHandler != null && bottomSheetUpdateRunnable != null) {
            // Останавливаем предыдущее обновление, если оно запущено
            bottomSheetUpdateHandler.removeCallbacks(bottomSheetUpdateRunnable);
            // Запускаем новое обновление
            bottomSheetUpdateHandler.postDelayed(bottomSheetUpdateRunnable, BOTTOM_SHEET_UPDATE_INTERVAL);
            Log.i(TAG, "Автоматическое обновление BottomSheet запущено");
        }
    }
    
    /**
     * Останавливает автоматическое обновление BottomSheet
     */
    private void stopBottomSheetAutoUpdate() {
        if (bottomSheetUpdateHandler != null && bottomSheetUpdateRunnable != null) {
            bottomSheetUpdateHandler.removeCallbacks(bottomSheetUpdateRunnable);
            Log.i(TAG, "Автоматическое обновление BottomSheet остановлено");
        }
    }
    
    /**
     * Обновляет только время назад для AIS судна
     */
    private void updateAISTimeAgo() {
        if (aisBottomSheetView == null || currentAISVessel == null) return;
        
        TextView tvTimeAgo = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_time_ago);
        if (tvTimeAgo != null && currentAISVessel.getLastUpdate() != null) {
            long secondsAgo = java.time.Duration.between(currentAISVessel.getLastUpdate(), java.time.LocalDateTime.now()).getSeconds();
            String timeAgoText = formatTimeAgo(secondsAgo);
            tvTimeAgo.setText("⏱️ Время назад: " + timeAgoText);
        }
    }
    
    /**
     * Обновляет UI AIS BottomSheet с актуальными данными
     */
    private void updateAISBottomSheetUI(AISVessel vessel) {
        if (aisBottomSheetView == null || vessel == null) return;
        
        // Обновляем текущее судно, если это то же самое судно
        if (currentAISVessel != null && currentAISVessel.getMmsi() != null && 
            currentAISVessel.getMmsi().equals(vessel.getMmsi())) {
            currentAISVessel = vessel;
        }
        
        // Убеждаемся, что обновление происходит в главном потоке
        runOnUiThread(() -> {
            if (aisBottomSheetView == null || vessel == null) return;
        
            // Обновляем все поля в AIS BottomSheet
            TextView tvTitle = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_title);
            TextView tvMmsi = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_mmsi);
            TextView tvCallsign = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_callsign);
            TextView tvImo = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_imo);
            TextView tvType = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_type);
            TextView tvPosition = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_position);
            TextView tvCourse = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_course);
            TextView tvRot = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_rot);
            TextView tvHeading = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_heading);
            TextView tvSpeed = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_speed);
            TextView tvDimensions = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_dimensions);
            TextView tvDraft = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_draft);
            TextView tvDestination = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_destination);
            TextView tvEta = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_eta);
            TextView tvNavStatus = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_nav_status);
            TextView tvClass = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_class);
            TextView tvSignal = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_signal);
            TextView tvLastUpdate = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_last_update);
            TextView tvTimeAgo = aisBottomSheetView.findViewById(R.id.bottom_sheet_ais_time_ago);
        
            // Заголовок
            if (tvTitle != null) {
                String name = vessel.getVesselName() != null && !vessel.getVesselName().isEmpty() 
                    ? vessel.getVesselName() 
                    : "AIS СУДНО";
                String flag = getFlagEmojiForMMSI(vessel.getMmsi());
                String title = (flag != null ? flag + " " : "") + "🚢 " + name;
                tvTitle.setText(title);
            }
            
            // MMSI
            if (tvMmsi != null) {
                tvMmsi.setText("🆔 MMSI: " + (vessel.getMmsi() != null ? vessel.getMmsi() : "--"));
            }
            
            // Название судна

            
            // Позывной
            if (tvCallsign != null) {
                tvCallsign.setText("📻 Позывной: " + (vessel.getCallSign() != null ? vessel.getCallSign() : "--"));
            }
            
            // IMO
            if (tvImo != null) {
                tvImo.setText("🏷️ IMO: " + (vessel.getImo() > 0 ? String.valueOf(vessel.getImo()) : "--"));
            }
            
            // Тип судна
            if (tvType != null) {
                tvType.setText("🚢 Тип: " + (vessel.getVesselType() != null ? vessel.getVesselType() : "--"));
            }
            
            // Координаты
            if (tvPosition != null) {
                if (vessel.getLatitude() != 0 && vessel.getLongitude() != 0) {
                    String positionText = String.format("📍 Координаты: %.6f, %.6f", 
                        vessel.getLatitude(), vessel.getLongitude());
                    tvPosition.setText(positionText);
                } else {
                    tvPosition.setText("📍 Координаты: --");
                }
            }
            
            // Курс (COG)
            if (tvCourse != null) {
                if (vessel.getCourse() > 0) {
                    String courseText = String.format("🧭 COG: %.1f°", vessel.getCourse());
                    tvCourse.setText(courseText);
                } else {
                    tvCourse.setText("🧭 COG: --°");
                }
            }
            
            // Скорость поворота (ROT)
            if (tvRot != null) {
                double rot = vessel.getRateOfTurn();
                if (rot != 0) {
                    String rotText = String.format("🔄 ROT: %.1f°/мин", rot);
                    tvRot.setText(rotText);
                } else {
                    tvRot.setText("🔄 ROT: --°/мин");
                }
            }
            
            // Направление (HDG)
            if (tvHeading != null) {
                if (vessel.getHeading() > 0) {
                    String headingText = String.format("🧭 HDG: %.1f°", vessel.getHeading());
                    tvHeading.setText(headingText);
                } else {
                    tvHeading.setText("🧭 HDG: --°");
                }
            }
            
            // Скорость
            if (tvSpeed != null) {
                if (vessel.getSpeed() > 0) {
                    String speedText = String.format("⚡ Скорость: %.1f узлов", vessel.getSpeed());
                    tvSpeed.setText(speedText);
                } else {
                    tvSpeed.setText("⚡ Скорость: -- узлов");
                }
            }
            
            // Размеры
            if (tvDimensions != null) {
                if (vessel.getLength() > 0 && vessel.getWidth() > 0) {
                    String dimensionsText = String.format("📏 Размеры: %.1f x %.1f м", 
                        vessel.getLength(), vessel.getWidth());
                    tvDimensions.setText(dimensionsText);
                } else {
                    tvDimensions.setText("📏 Размеры: --");
                }
            }
        
            // Осадка
            if (tvDraft != null) {
                if (vessel.getDraft() > 0) {
                    String draftText = String.format("🌊 Осадка: %.1f м", vessel.getDraft());
                    tvDraft.setText(draftText);
                } else {
                    tvDraft.setText("🌊 Осадка: -- м");
                }
            }
            
            // Пункт назначения
            if (tvDestination != null) {
                tvDestination.setText("🎯 Назначение: " + (vessel.getDestination() != null ? vessel.getDestination() : "--"));
            }
            
            // ETA
            if (tvEta != null) {
                if (vessel.getEta() != null) {
                    String etaText = String.format("⏰ ETA: %s", 
                        vessel.getEta().format(java.time.format.DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")));
                    tvEta.setText(etaText);
                } else {
                    tvEta.setText("⏰ ETA: --");
                }
            }
            
            // Навигационный статус
            if (tvNavStatus != null) {
                tvNavStatus.setText("🚦 Статус: " + (vessel.getNavigationalStatus() != null ? vessel.getNavigationalStatus() : "--"));
            }
            
            // Класс судна
            if (tvClass != null) {
                tvClass.setText("📋 Класс: " + (vessel.getVesselClass() != null ? vessel.getVesselClass() : "--"));
            }
            
            // Сила сигнала
            if (tvSignal != null) {
                if (vessel.getSignalStrength() > 0) {
                    String signalText = String.format("📶 Сигнал: %d", vessel.getSignalStrength());
                    tvSignal.setText(signalText);
                } else {
                    // Показываем качество позиции по AIS Accuracy биту
                    String qualityText = vessel.isPositionAccuracy() ? "📶 Точность: высокая" : "📶 Точность: низкая";
                    tvSignal.setText(qualityText);
                }
            }
            
            // Последнее обновление
            if (tvLastUpdate != null) {
                if (vessel.getLastUpdate() != null) {
                    String lastUpdateText = String.format("🕐 Обновлено: %s", 
                        vessel.getLastUpdate().format(java.time.format.DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")));
                    tvLastUpdate.setText(lastUpdateText);
                } else {
                    tvLastUpdate.setText("🕐 Обновлено: --");
                }
            }
        
            // Время назад
            if (tvTimeAgo != null) {
                if (vessel.getLastUpdate() != null) {
                    long secondsAgo = java.time.Duration.between(vessel.getLastUpdate(), java.time.LocalDateTime.now()).getSeconds();
                    String timeAgoText = formatTimeAgo(secondsAgo);
                    tvTimeAgo.setText("⏱️ Время назад: " + timeAgoText);
                } else {
                    tvTimeAgo.setText("⏱️ Время назад: --");
                }
            }
        });
    }
    
    /**
     * Форматирует время назад в читаемый вид
     */
    private String formatTimeAgo(long seconds) {
        if (seconds < 60) {
            return seconds + " сек";
        } else if (seconds < 3600) {
            long minutes = seconds / 60;
            return minutes + " мин";
        } else if (seconds < 86400) {
            long hours = seconds / 3600;
            return hours + " ч";
        } else {
            long days = seconds / 86400;
            return days + " дн";
        }
    }

    /**
     * Возвращает флаг-эмодзи по MMSI через MID->ISO2.
     */
    private String getFlagEmojiForMMSI(String mmsi) {
        try {
            if (mmsi == null || mmsi.length() < 3) return null;
            String mid = mmsi.substring(0, 3);
            String iso2 = MIDToCountry.MID_TO_COUNTRY.get(mid);
            if (iso2 == null || iso2.length() != 2) return null;
            char a = Character.toUpperCase(iso2.charAt(0));
            char b = Character.toUpperCase(iso2.charAt(1));
            int base = 0x1F1E6;
            int cp1 = base + (a - 'A');
            int cp2 = base + (b - 'A');
            return new String(Character.toChars(cp1)) + new String(Character.toChars(cp2));
        } catch (Exception ignored) {
            return null;
        }
    }
    
    /**
     * Восстанавливает обработчики кликов для маркеров
     */
    private void restoreMarkerClickListeners() {
        Log.i(TAG, "Восстанавливаем обработчики кликов для маркеров");
        if (mapInterface instanceof com.grigowashere.aismap.maps.YandexMapImpl) {
            com.grigowashere.aismap.maps.YandexMapImpl yandexMap = (com.grigowashere.aismap.maps.YandexMapImpl) mapInterface;
            yandexMap.refreshMarkerClickListeners();
            Log.i(TAG, "Обработчики кликов восстановлены");
        }
    }
    
    /**
     * Тестирует работу кликов по маркерам
     */
    private void testMarkerClicks() {
        Log.i(TAG, "Тестируем работу кликов по маркерам");
        Toast.makeText(this, "Тестируем клики по маркерам", Toast.LENGTH_SHORT).show();
        
        // Восстанавливаем обработчики кликов
        restoreMarkerClickListeners();
        
        // Проверяем, что маркеры существуют
        Vessel ownVessel = appController.getOwnVessel();
        if (ownVessel != null && ownVessel.getLatitude() != 0 && ownVessel.getLongitude() != 0) {
            Log.i(TAG, "Наше судно найдено, координаты: " + ownVessel.getLatitude() + ", " + ownVessel.getLongitude());
            Toast.makeText(this, "Наше судно найдено, попробуйте кликнуть по маркеру", Toast.LENGTH_LONG).show();
        } else {
            Log.w(TAG, "Наше судно не найдено или координаты равны 0");
            Toast.makeText(this, "Наше судно не найдено", Toast.LENGTH_SHORT).show();
        }
        
        // Проверяем AIS суда
        List<AISVessel> aisVessels = appController.getAISVessels();
        if (!aisVessels.isEmpty()) {
            Log.i(TAG, "Найдено AIS судов: " + aisVessels.size());
            Toast.makeText(this, "Найдено AIS судов: " + aisVessels.size(), Toast.LENGTH_SHORT).show();
        } else {
            Log.w(TAG, "AIS суда не найдены");
            Toast.makeText(this, "AIS суда не найдены", Toast.LENGTH_SHORT).show();
        }
    }
    
    /**
     * Инициализирует Яндекс.Карты
     */
    private void initializeYandexMaps() {
        if (!isYandexMapsInitialized) {
            try {
                // Инициализация Яндекс.Карт
                com.yandex.mapkit.MapKitFactory.setApiKey("9ae1917c-2049-4927-9d1e-29dd0d3e8ebc");
                com.yandex.mapkit.MapKitFactory.initialize(this);
                isYandexMapsInitialized = true;
                
                // Устанавливаем флаг в MapController
                MapController.setYandexMapsInitialized(true);
                
                Log.i(TAG, "Яндекс.Карты успешно инициализированы");
            } catch (Exception e) {
                Log.e(TAG, "Ошибка инициализации Яндекс.Карт: " + e.getMessage(), e);
            }
        }
    }
    
    /**
     * Применяет настройки к контроллерам
     */
    private void applySettings() {
        if (settingsManager == null || appController == null) {
            Log.w(TAG, "SettingsManager или AppController не инициализированы");
            return;
        }
        
        try {
            // Применяем UDP настройки
            int udpPort = settingsManager.getUDPPort();
            boolean udpEnabled = settingsManager.isUDPEnabled();
            
            appController.setUDPPort(udpPort);
            appController.setUDPEnabled(udpEnabled);
            
            // Применяем NMEA настройки
            boolean androidNMEAEnabled = settingsManager.isAndroidNMEAEnabled();
            boolean udpNMEAEnabled = settingsManager.isUDPNMEAEnabled();
            
            appController.setAndroidNMEAEnabled(androidNMEAEnabled);
            appController.setUDPNMEAEnabled(udpNMEAEnabled);
            
            // Применяем режим данных
            String dataMode = settingsManager.getDataMode();
            appController.setDataMode(dataMode);
            
            Log.i(TAG, "Настройки применены: " + settingsManager.getSettingsSummary());
            
        } catch (Exception e) {
            Log.e(TAG, "Ошибка при применении настроек: " + e.getMessage(), e);
            Toast.makeText(this, "Ошибка при применении настроек", Toast.LENGTH_SHORT).show();
        }
    }
    
    /**
     * Перезапускает сервисы с новыми настройками
     */
    private void restartServices() {
        if (appController == null) {
            Log.w(TAG, "AppController не инициализирован");
            return;
        }
        
        try {
            Log.i(TAG, "Перезапускаем сервисы...");
            
            // Останавливаем все слушатели
            appController.stopAllListeners();
            
            // Применяем новые настройки
            applySettings();
            
            // Перезапускаем UDP слушатель с новым портом, если нужно
            if (settingsManager.shouldRestartUDP(appController.getUDPPort(), appController.isUDPEnabled())) {
                appController.restartUDPListener();
            }
            
            // Запускаем слушатели с новыми настройками
            appController.startAllListeners();
            
            Log.i(TAG, "Сервисы успешно перезапущены");
            Log.i(TAG, "Статус настроек: " + appController.getSettingsStatus());
            
        } catch (Exception e) {
            Log.e(TAG, "Ошибка при перезапуске сервисов: " + e.getMessage(), e);
            Toast.makeText(this, "Ошибка при перезапуске сервисов", Toast.LENGTH_SHORT).show();
        }
    }
}