package com.grigowashere.aismap.models;

import java.time.LocalDateTime;

/**
 * Модель AIS судна
 */
public class AISVessel {
    private String mmsi; // Maritime Mobile Service Identity
    private String vesselName; // название судна
    private String callSign; // позывной
    private int imo; // IMO номер
    private String vesselType; // тип судна
    private double latitude;
    private double longitude;
    private double course; // курс в градусах (0-360)
    private double speed; // скорость в узлах
    private double heading; // направление движения в градусах
    private double rateOfTurn; // скорость поворота в градусах/минуту
    private double length; // длина судна в метрах
    private double width; // ширина судна в метрах
    private double draft; // осадка в метрах
    private String destination; // пункт назначения
    private LocalDateTime eta; // предполагаемое время прибытия
    private LocalDateTime lastUpdate;
    private int signalStrength; // сила AIS сигнала
    private boolean isActive; // активно ли судно
    private String navigationalStatus; // навигационный статус
    private String lastSafetyMessage; // последнее сообщение безопасности
    private boolean positionAccuracy; // точность позиции
    private String vesselClass; // класс судна (Class A, Class B, Extended Class B)
    private String vendorId; // идентификатор производителя оборудования
    private boolean selected; // выделено ли судно на карте

    public AISVessel() {
        this.lastUpdate = LocalDateTime.now();
        this.isActive = true;
    }

    public AISVessel(String mmsi) {
        this();
        this.mmsi = mmsi;
    }

    // Геттеры и сеттеры
    public String getMmsi() { return mmsi; }
    public void setMmsi(String mmsi) { this.mmsi = mmsi; }

    public String getVesselName() { return vesselName; }
    public void setVesselName(String vesselName) { this.vesselName = vesselName; }

    public String getCallSign() { return callSign; }
    public void setCallSign(String callSign) { this.callSign = callSign; }

    public int getImo() { return imo; }
    public void setImo(int imo) { this.imo = imo; }

    public String getVesselType() { return vesselType; }
    public void setVesselType(String vesselType) { this.vesselType = vesselType; }

    public double getLatitude() { return latitude; }
    public void setLatitude(double latitude) { this.latitude = latitude; }

    public double getLongitude() { return longitude; }
    public void setLongitude(double longitude) { this.longitude = longitude; }

    public double getCourse() { return course; }
    public void setCourse(double course) { this.course = course; }

    public double getSpeed() { return speed; }
    public void setSpeed(double speed) { this.speed = speed; }

    public double getHeading() { return heading; }
    public void setHeading(double heading) { this.heading = heading; }

    public double getRateOfTurn() { return rateOfTurn; }
    public void setRateOfTurn(double rateOfTurn) { this.rateOfTurn = rateOfTurn; }

    public double getLength() { return length; }
    public void setLength(double length) { this.length = length; }

    public double getWidth() { return width; }
    public void setWidth(double width) { this.width = width; }

    public double getDraft() { return draft; }
    public void setDraft(double draft) { this.draft = draft; }

    public String getDestination() { return destination; }
    public void setDestination(String destination) { this.destination = destination; }

    public LocalDateTime getEta() { return eta; }
    public void setEta(LocalDateTime eta) { this.eta = eta; }

    public LocalDateTime getLastUpdate() { return lastUpdate; }
    public void setLastUpdate(LocalDateTime lastUpdate) { this.lastUpdate = lastUpdate; }

    public int getSignalStrength() { return signalStrength; }
    public void setSignalStrength(int signalStrength) { this.signalStrength = signalStrength; }

    public boolean isActive() { return isActive; }
    public void setActive(boolean active) { isActive = active; }

    public String getNavigationalStatus() { return navigationalStatus; }
    public void setNavigationalStatus(String navigationalStatus) { this.navigationalStatus = navigationalStatus; }

    public String getLastSafetyMessage() { return lastSafetyMessage; }
    public void setLastSafetyMessage(String lastSafetyMessage) { this.lastSafetyMessage = lastSafetyMessage; }

    public boolean isPositionAccuracy() { return positionAccuracy; }
    public void setPositionAccuracy(boolean positionAccuracy) { this.positionAccuracy = positionAccuracy; }

    public String getVesselClass() { return vesselClass; }
    public void setVesselClass(String vesselClass) { this.vesselClass = vesselClass; }

    public String getVendorId() { return vendorId; }
    public void setVendorId(String vendorId) { this.vendorId = vendorId; }

    public boolean isSelected() { return selected; }
    public void setSelected(boolean selected) { this.selected = selected; }

    /**
     * Обновляет позицию и курс судна
     */
    public void updatePosition(double latitude, double longitude, double course, double speed) {
        this.latitude = latitude;
        this.longitude = longitude;
        this.course = course;
        this.speed = speed;
        this.lastUpdate = LocalDateTime.now();
    }
    
    /**
     * Обновляет позицию, курс и скорость поворота судна
     */
    public void updatePosition(double latitude, double longitude, double course, double speed, double rateOfTurn) {
        this.latitude = latitude;
        this.longitude = longitude;
        this.course = course;
        this.speed = speed;
        this.rateOfTurn = rateOfTurn;
        this.lastUpdate = LocalDateTime.now();
    }

    /**
     * Проверяет, не устарели ли данные (больше 10 минут)
     * @deprecated Используйте isDataStale(int warningMinutes) для настраиваемого времени
     */
    @Deprecated
    public boolean isDataStale() {
        return LocalDateTime.now().minusMinutes(10).isAfter(lastUpdate);
    }
    
    /**
     * Проверяет, не устарели ли данные на указанное количество минут
     */
    public boolean isDataStale(int warningMinutes) {
        return LocalDateTime.now().minusMinutes(warningMinutes).isAfter(lastUpdate);
    }
    
    /**
     * Проверяет, нужно ли удалить данные (старше указанного количества минут)
     */
    public boolean shouldBeRemoved(int removeMinutes) {
        return LocalDateTime.now().minusMinutes(removeMinutes).isAfter(lastUpdate);
    }
    
    /**
     * Получает количество минут с последнего обновления
     */
    public long getMinutesSinceLastUpdate() {
        return java.time.Duration.between(lastUpdate, LocalDateTime.now()).toMinutes();
    }

    @Override
    public String toString() {
        return "AISVessel{" +
                "mmsi='" + mmsi + '\'' +
                ", name='" + vesselName + '\'' +
                ", lat=" + latitude +
                ", lon=" + longitude +
                ", course=" + course +
                ", speed=" + speed +
                ", rot=" + rateOfTurn +
                '}';
    }
}
