package com.grigowashere.aismap.maps;

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

/**
 * Обертка для маркера с управлением жизненным циклом
 * Предотвращает финализацию объектов и обеспечивает стабильную работу
 */
public abstract class MarkerWrapper {
    
    protected String id;
    protected boolean isActive;
    protected long lastUpdateTime;
    protected long creationTime;
    
    // Константы для управления жизненным циклом
    private static final long MARKER_LIFETIME = 5000; // 5 секунд
    private static final long UPDATE_THROTTLE = 200; // 0.2 секунды между обновлениями
    
    public MarkerWrapper(String id) {
        this.id = id;
        this.isActive = true;
        this.creationTime = System.currentTimeMillis();
        this.lastUpdateTime = creationTime;
    }
    
    /**
     * Проверяет, нужно ли обновлять маркер
     */
    public boolean shouldUpdate() {
        long currentTime = System.currentTimeMillis();
        return (currentTime - lastUpdateTime) >= UPDATE_THROTTLE;
    }
    
    /**
     * Проверяет, не устарел ли маркер
     */
    public boolean isExpired() {
        long currentTime = System.currentTimeMillis();
        return (currentTime - creationTime) >= MARKER_LIFETIME;
    }
    
    /**
     * Обновляет время последнего обновления
     */
    public void markUpdated() {
        this.lastUpdateTime = System.currentTimeMillis();
    }
    
    /**
     * Проверяет, активен ли маркер
     */
    public boolean isActive() {
        return isActive && !isExpired();
    }
    
    /**
     * Деактивирует маркер
     */
    public void deactivate() {
        this.isActive = false;
    }
    
    /**
     * Получает ID маркера
     */
    public String getId() {
        return id;
    }
    
    /**
     * Абстрактный метод для проверки состояния маркера
     */
    public abstract boolean isValid();
    
    /**
     * Абстрактный метод для обновления позиции маркера
     */
    public abstract void updatePosition(double latitude, double longitude);
    
    /**
     * Абстрактный метод для обновления курса маркера
     */
    public abstract void updateCourse(double course);
    
    /**
     * Абстрактный метод для удаления маркера
     */
    public abstract void remove();
    
    /**
     * Абстрактный метод для обновления иконки маркера
     */
    public abstract void updateIcon();
    
    /**
     * Абстрактный метод для установки обработчика кликов
     */
    public abstract void setClickListener(Runnable clickHandler);
}
