"""
Costanti per il plugin qgSurf.

Questo modulo contiene tutte le costanti numeriche utilizzate nel codice,
sostituendo i "magic numbers" con valori nominati e documentati.
"""


class ProfileConstants:
    """Costanti per calcolo e visualizzazione profili."""
    
    # Padding per range elevazione
    Z_PADDING_FACTOR = 0.5
    """Fattore di padding per calcolo range elevazione plot.
    
    Usato per aggiungere spazio sopra e sotto il range naturale delle elevazioni.
    Valore: 0.5 significa aggiungere il 50% del delta_z sopra e sotto.
    """
    
    # Esagerazione verticale suggerita
    VERTICAL_EXAGGERATION_FACTOR = 0.2
    """Fattore per calcolo esagerazione verticale suggerita.
    
    Moltiplicato per il rapporto larghezza/altezza del profilo per ottenere
    un valore suggerito di esagerazione verticale.
    """
    
    # Distanze
    MAX_PROFILE_DISTANCE_METERS = 200.0
    """Distanza massima default per proiezione punti sul profilo (metri).
    
    Punti oltre questa distanza dal profilo non vengono proiettati.
    """
    
    MAX_PROFILE_DISTANCE_MAX_METERS = 10000.0
    """Distanza massima configurabile per proiezione punti (metri).
    
    Valore massimo consentito nell'interfaccia utente.
    """
    
    # Visualizzazione
    DEFAULT_PROFILE_LINEWIDTH = 0.8
    """Larghezza linea default per plot profili."""
    
    # Campionamento del DEM lungo il profilo

    OVERSAMPLING_CELL_SIZE_FRACTION = 0.5
    """Frazione della dimensione di cella del DEM sotto la quale si chiede conferma.

    La cella del DEM e' il limite informativo del campionamento: campionando a
    un passo piu' fitto non si estrae altra informazione dal raster, si
    interpola soltanto fra le stesse celle, moltiplicando punti e tempi di
    calcolo. Sotto meta' cella il sovracampionamento e' evidente e viene
    chiesta conferma.
    """

    SAMPLED_POINTS_CONFIRM_THRESHOLD = 200_000
    """Numero totale di punti campionati oltre il quale si chiede conferma.

    Il numero di punti (lunghezza complessiva delle tracce / passo di
    campionamento, per il numero di profili paralleli) determina il costo di
    campionamento, scrittura nel GeoPackage e disegno: oltre questo ordine di
    grandezza il plot inizia a essere lento da produrre e da manipolare.
    """

    SAMPLED_POINTS_MAX = 2_000_000
    """Numero totale di punti campionati oltre il quale il valore e' rifiutato.

    Non e' un limite fisico ma di praticabilita': valori che portano oltre
    questa soglia derivano tipicamente da un passo di campionamento inserito
    per errore (ad esempio in metri quando il CRS e' geografico, o viceversa).
    """

    # Range elevazione quando delta_z è zero
    ZERO_DELTA_Z_PADDING = 10.0
    """Padding da aggiungere quando delta_z è zero (metri).
    
    Usato per evitare range troppo ristretti quando tutte le elevazioni sono uguali.
    """


class BufferConstants:
    """Costanti per zone buffer."""
    
    DEFAULT_BUFFER_RADIUS_METERS = 5000.0
    """Raggio default per zone buffer (metri).
    
    Valore di default per buffer zone nelle intersezioni DEM-piano.
    Equivale a 5 km.
    """
    
    BUFFER_RADIUS_MIN_METERS = 1.0
    """Raggio minimo configurabile per buffer zone (metri)."""
    
    BUFFER_RADIUS_MAX_METERS = 100000.0
    """Raggio massimo configurabile per buffer zone (metri).
    
    Equivale a 100 km.
    """
    
    BUFFER_RADIUS_SINGLE_STEP_METERS = 100.0
    """Incremento singolo step per buffer radius (metri)."""


class DatabaseConstants:
    """Costanti per operazioni database."""
    
    DEFAULT_CHUNK_SIZE = 5000
    """Dimensione default per inserimenti batch nel database.
    
    Numero di record inseriti per volta per ottimizzare le performance
    durante inserimenti massivi.
    """


class UIConstants:
    """Costanti per interfaccia utente."""
    
    # Dimensioni finestre
    DEFAULT_WINDOW_WIDTH = 600
    """Larghezza default per finestre (pixel)."""
    
    DEFAULT_WINDOW_HEIGHT = 500
    """Altezza default per finestre (pixel)."""
    
    MIN_WINDOW_WIDTH = 200
    """Larghezza minima per finestre (pixel)."""
    
    MIN_WINDOW_HEIGHT = 200
    """Altezza minima per finestre (pixel)."""
    
    MAX_WINDOW_SIZE = 16777215
    """Dimensione massima per finestre (pixel).
    
    Valore massimo supportato da Qt.
    """
    
    # Dimensioni finestre specifiche
    ABOUT_DIALOG_MIN_WIDTH = 400
    """Larghezza minima per finestra About."""
    
    ABOUT_DIALOG_MIN_HEIGHT = 200
    """Altezza minima per finestra About."""
    
    SOLUTION_WIDGET_MIN_HEIGHT = 115
    """Altezza minima per widget soluzioni."""
    
    POINTS_WIDGET_MIN_HEIGHT = 80
    """Altezza minima per widget punti."""
    
    SOLUTIONS_WIDGET_MAX_HEIGHT = 140
    """Altezza massima per widget soluzioni."""
    
    # Parametri slider e dial
    DIP_DIRECTION_MIN = 2
    """Valore minimo per dial direzione di immersione."""
    
    DIP_DIRECTION_MAX = 360
    """Valore massimo per dial direzione di immersione."""
    
    DIP_DIRECTION_DEFAULT = 180
    """Valore default per dial direzione di immersione."""
    
    DIP_DIRECTION_NOTCH_TARGET = 30.0
    """Target per notch del dial direzione di immersione."""
    
    DIP_ANGLE_MIN = 0
    """Valore minimo per slider angolo di immersione (gradi)."""
    
    DIP_ANGLE_MAX = 90
    """Valore massimo per slider angolo di immersione (gradi)."""
    
    DIP_ANGLE_DEFAULT = 45
    """Valore default per slider angolo di immersione (gradi)."""
    
    DIP_ANGLE_TICK_INTERVAL = 15
    """Intervallo tick per slider angolo di immersione."""
    
    DIP_DIRECTION_SPINBOX_MIN = 0.0
    """Valore minimo per spinbox direzione di immersione."""
    
    DIP_DIRECTION_SPINBOX_MAX = 359.999
    """Valore massimo per spinbox direzione di immersione."""
    
    DIP_DIRECTION_SPINBOX_SINGLE_STEP = 1.0
    """Incremento singolo step per spinbox direzione di immersione."""
    
    DIP_ANGLE_SPINBOX_MIN = 0.0
    """Valore minimo per spinbox angolo di immersione."""
    
    DIP_ANGLE_SPINBOX_MAX = 90.0
    """Valore massimo per spinbox angolo di immersione."""
    
    DIP_ANGLE_SPINBOX_SINGLE_STEP = 0.1
    """Incremento singolo step per spinbox angolo di immersione."""
    
    DIP_ANGLE_SPINBOX_DEFAULT = 45
    """Valore default per spinbox angolo di immersione."""
    
    # Icone e marker
    DEFAULT_ICON_SIZE = 18
    """Dimensione default per icone (pixel)."""
    
    DEFAULT_PEN_WIDTH = 2
    """Larghezza penna default per marker."""
    
    DEFAULT_ICON_TYPE = 2
    """Tipo icona default."""
    
    DEFAULT_ICON_COLOR = 'limegreen'
    """Colore default per icone."""
    
    # Layout figure
    FIGURE_AXES_LEFT = 0.1
    """Posizione left per assi nelle figure combinate."""
    
    FIGURE_AXES_WIDTH = 0.8
    """Larghezza per assi nelle figure combinate."""
    
    # Colori random
    RANDOM_SATURATION_MIN = 0.6
    """Saturazione minima per colori random."""
    
    RANDOM_SATURATION_MAX = 0.9
    """Saturazione massima per colori random."""
    
    RANDOM_VALUE_MIN = 0.7
    """Valore minimo per colori random."""
    
    RANDOM_VALUE_MAX = 0.95
    """Valore massimo per colori random."""
    
    # Margini layout
    DEFAULT_LAYOUT_MARGINS = 10
    """Margini default per layout (pixel)."""


class GeometryConstants:
    """Costanti per geometrie e validazioni."""
    
    MIN_POINTS_FOR_LINE = 2
    """Numero minimo di punti richiesti per creare una linea."""
    
    MIN_POINTS_FOR_PROFILE = 2
    """Numero minimo di punti richiesti per creare un profilo."""
    
    MIN_PROFILE_LENGTH = 0.0
    """Lunghezza minima per un profilo valido."""
    
    # Validazioni angoli
    DIP_DIRECTION_NORMALIZED_MAX = 360.0
    """Valore massimo dopo normalizzazione direzione di immersione."""
    
    DIP_DIRECTION_NORMALIZED_MIN = 0.0
    """Valore minimo dopo normalizzazione direzione di immersione."""


class EPSGCodes:
    """Codici EPSG comuni."""
    
    WGS84 = 4326
    """EPSG:4326 - WGS84 Geographic Coordinate System."""
