package com.grigowashere.aismap.controllers;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.grigowashere.aismap.sensors.CompassSensor;
import com.grigowashere.aismap.models.Vessel;
import com.grigowashere.aismap.models.AISVessel;
import java.util.List;

/**
 * Контроллер для управления магнитным компасом
 * Отвечает только за работу с компасом и обновление UI
 */
public class CompassController implements CompassSensor.CompassListener {
    
    private static final String TAG = "CompassController";
    
    private Context context;
    private CompassSensor compassSensor;
    private Handler uiHandler;
    
    // Диагностика
    private long lastCompassLogTime = 0;
    
    // Callbacks для уведомления других компонентов
    private CompassControllerListener listener;
    
    public interface CompassControllerListener {
        void onCompassChanged(float azimuth);
        void onCompassError(String error);
    }
    
    public CompassController(Context context) {
        this.context = context;
        this.compassSensor = new CompassSensor(context);
        this.uiHandler = new Handler(Looper.getMainLooper());
        Log.i(TAG, "Compass Controller инициализирован");
    }
    
    /**
     * Устанавливает слушателя для уведомлений
     */
    public void setListener(CompassControllerListener listener) {
        this.listener = listener;
    }
    
    /**
     * Запускает магнитный компас
     */
    public void startCompass() {
        if (compassSensor.isAvailable()) {
            compassSensor.startListening(this);
            Log.d(TAG, "Magnetic compass started");
        } else {
            Log.w(TAG, "Magnetic compass not available");
            if (listener != null) {
                listener.onCompassError("Магнитный компас недоступен на этом устройстве");
            }
        }
    }
    
    /**
     * Останавливает магнитный компас
     */
    public void stopCompass() {
        if (compassSensor.isListening()) {
            compassSensor.stopListening();
            Log.d(TAG, "Magnetic compass stopped");
        }
    }
    
    /**
     * Проверяет, доступен ли магнитный компас
     */
    public boolean isCompassAvailable() {
        return compassSensor.isAvailable();
    }
    
    /**
     * Проверяет, работает ли магнитный компас
     */
    public boolean isCompassActive() {
        return compassSensor.isListening();
    }
    
    /**
     * Получает статус компаса
     */
    public String getCompassStatus() {
        if (!isCompassAvailable()) {
            return "Магнитный компас недоступен";
        } else if (isCompassActive()) {
            return "Магнитный компас активен";
        } else {
            return "Магнитный компас остановлен";
        }
    }
    
    /**
     * Обновляет компас с данными судна и ближайшими судами
     */
    public void updateCompassWithVesselData(Vessel vessel, List<AISVessel> nearbyVessels) {
        if (vessel != null && listener != null) {
            float azimuth = (float) vessel.getCourse();
            
            // Используем UI Handler для обновления в главном потоке
            uiHandler.post(() -> {
                listener.onCompassChanged(azimuth);
            });
        }
    }
    
    // Реализация CompassSensor.CompassListener
    
    @Override
    public void onCompassChanged(float azimuth) {
        // Диагностика: логируем каждые 10 секунд
        long now = System.currentTimeMillis();
        if (now - lastCompassLogTime > 10000) {
            Log.d(TAG, "🧭 CompassController: onCompassChanged получен, azimuth=" + azimuth);
            lastCompassLogTime = now;
        }
        
        // Уведомляем слушателя в UI потоке
        uiHandler.post(() -> {
            // Диагностика: проверяем выполнение в UI потоке
            if (now - lastCompassLogTime > 10000) {
                Log.d(TAG, "🧭 CompassController: runOnUiThread выполняется для компаса");
            }
            
            if (listener != null) {
                listener.onCompassChanged(azimuth);
            }
        });
    }
    
    /**
     * Освобождает ресурсы
     */
    public void cleanup() {
        stopCompass();
        
        // Очищаем Handler для предотвращения утечек памяти
        if (uiHandler != null) {
            uiHandler.removeCallbacksAndMessages(null);
        }
        
        Log.i(TAG, "Compass Controller очищен");
    }
}
