package com.grigowashere.aismap.controllers;

import android.content.Context;
import android.util.Log;
import com.grigowashere.aismap.services.NotificationService;
import com.grigowashere.aismap.models.AISVessel;

/**
 * Контроллер для управления уведомлениями
 * Отвечает только за показ уведомлений пользователю
 */
public class NotificationController {
    
    private static final String TAG = "NotificationController";
    
    private Context context;
    private NotificationService notificationService;
    
    // Callbacks для уведомления других компонентов
    private NotificationControllerListener listener;
    
    public interface NotificationControllerListener {
        void onNotificationShown(String type, String message);
        void onNotificationError(String error);
    }
    
    public NotificationController(Context context) {
        this.context = context;
        this.notificationService = new NotificationService(context);
        Log.i(TAG, "Notification Controller инициализирован");
    }
    
    /**
     * Устанавливает слушателя для уведомлений
     */
    public void setListener(NotificationControllerListener listener) {
        this.listener = listener;
    }
    
    /**
     * Показывает уведомление о новой AIS цели
     */
    public void notifyNewAISTarget() {
        if (notificationService != null && notificationService.areNotificationsEnabled()) {
            try {
                notificationService.notifyNewAISTarget();
                Log.i(TAG, "🔔 Уведомление о новой AIS цели показано");
                
                if (listener != null) {
                    listener.onNotificationShown("new_ais_target", "Новая AIS цель обнаружена");
                }
            } catch (Exception e) {
                Log.e(TAG, "Ошибка показа уведомления о новой AIS цели: " + e.getMessage(), e);
                if (listener != null) {
                    listener.onNotificationError(e.getMessage());
                }
            }
        } else {
            Log.d(TAG, "Уведомления отключены или сервис недоступен");
        }
    }
    
    /**
     * Показывает уведомление о safety-сообщении
     */
    public void notifySafetyMessage(String mmsi, String message) {
        if (notificationService != null && notificationService.areNotificationsEnabled()) {
            try {
                notificationService.notifySafetyMessage(mmsi, message);
                Log.i(TAG, "🔔 Safety-сообщение показано для MMSI: " + mmsi);
                
                if (listener != null) {
                    listener.onNotificationShown("safety_message", "Safety-сообщение от " + mmsi);
                }
            } catch (Exception e) {
                Log.e(TAG, "Ошибка показа safety-сообщения: " + e.getMessage(), e);
                if (listener != null) {
                    listener.onNotificationError(e.getMessage());
                }
            }
        } else {
            Log.d(TAG, "Уведомления отключены или сервис недоступен");
        }
    }
    
    /**
     * Показывает уведомление о GPS статусе
     */
    public void notifyGPSStatus(String status) {
        if (notificationService != null && notificationService.areNotificationsEnabled()) {
            try {
                // Здесь можно добавить специфичную логику для GPS уведомлений
                Log.i(TAG, "🔔 GPS статус: " + status);
                
                if (listener != null) {
                    listener.onNotificationShown("gps_status", "GPS статус: " + status);
                }
            } catch (Exception e) {
                Log.e(TAG, "Ошибка показа GPS уведомления: " + e.getMessage(), e);
                if (listener != null) {
                    listener.onNotificationError(e.getMessage());
                }
            }
        }
    }
    
    /**
     * Показывает уведомление об ошибке соединения
     */
    public void notifyConnectionError(String error) {
        if (notificationService != null && notificationService.areNotificationsEnabled()) {
            try {
                // Здесь можно добавить специфичную логику для уведомлений об ошибках
                Log.i(TAG, "🔔 Ошибка соединения: " + error);
                
                if (listener != null) {
                    listener.onNotificationShown("connection_error", "Ошибка соединения: " + error);
                }
            } catch (Exception e) {
                Log.e(TAG, "Ошибка показа уведомления об ошибке: " + e.getMessage(), e);
                if (listener != null) {
                    listener.onNotificationError(e.getMessage());
                }
            }
        }
    }
    
    /**
     * Проверяет, включены ли уведомления
     */
    public boolean areNotificationsEnabled() {
        return notificationService != null && notificationService.areNotificationsEnabled();
    }
    
    /**
     * Включает/выключает уведомления
     */
    public void setNotificationsEnabled(boolean enabled) {
        if (notificationService != null) {
            notificationService.setNotificationsEnabled(enabled);
            Log.i(TAG, "Уведомления: " + (enabled ? "включены" : "выключены"));
        }
    }
    
    /**
     * Получает статус уведомлений
     */
    public String getNotificationStatus() {
        return "Уведомления: " + (areNotificationsEnabled() ? "включены" : "выключены");
    }
    
    /**
     * Получает NotificationService для прямого доступа (если необходимо)
     */
    public NotificationService getNotificationService() {
        return notificationService;
    }
    
    /**
     * Освобождает ресурсы
     */
    public void cleanup() {
        if (notificationService != null) {
            notificationService.cleanup();
        }
        Log.i(TAG, "Notification Controller очищен");
    }
}
