#pragma once
#ifndef SELECTION
#define SELECTION 1

#include "Area.h"
#include "MadMap.h"

//=======================Selection====================================
//area su cui è possibile applicare funzioni di modifica sulla mappa
//====================================================================
class Selection : public Area
{   
public:

    //===================applied========================================
    //true se una funzione è stata applicata consecutivamente più di una
    //volta; false altrimenti
    //==================================================================
    bool applied;

public:

    //===================Costruttore====================
    //non seleziona nessuna area all'interno della mappa
    //==================================================
    Selection(void);

    //===================Costruttore====================
    //seleziona un'area di ampiezza 1x1             <br>
    //                                              <br>
    //Parametri:                                    <br>
    //x. coordinata x della area selezionata        <br>
    //z. coordinata z della area selezionata        <br>
    //==================================================
    Selection(int x, int z);

    /**Distruttore*/
    ~Selection(void);

    //===================flat======================================
    //appiattisce tutta la zona selezionata nella map a al valore h
    //=============================================================
    void flat(MadMap *map, double h);

    //===================incline===================================
    //crea un piano inclinato nella map con pendenza k nell'area 
    //della selection   
    //=============================================================
    void incline(MadMap *map, double h);

    //===================level=====================================
    //livella ogni tile all'altezza del valore del campo C 
    //incrementato di k
    //=============================================================
    void level(MadMap *map, double k);

    //===================slide=====================================
    //alza senza dislivelli la selezione nella map di k
    //=============================================================
    void slide(MadMap *map, double k);

    
    //===================set========================================
    //permette selezionare un'area per la selection             <br>
    //                                                          <br>
    //Parametri                                                 <br>
    //returnfirstPick: un intero dove il modulo 100 è 
    //la coordinata X del primo elemento dell'area selezionata 
    //mentre la divisione intera per 100 è la coordinata Z del 
    //primo elemento dell'area selezionata                      <br>
    //
    //returnsecondPick: un intero dove il modulo 100 è l
    //a coordinata X dell'ultimo elemento dell'area selezionata
    //mentre la divisione intera per 100 è la coordinata Z 
    //dell'ultimo elemento dell'area selezionata
    //==============================================================
    void set(int rfp, int rlp);

    //===================up=========================================
    //alza tutta la zona selezionata nella map di un valore k
    //==============================================================
    void up(MadMap *map, double k);

    //===================zero=======================================
    //pone tutta la zona selezionata nella map all'altezza di k
    //==============================================================
    void zero(MadMap *map,double k);

    //===================pyramid====================================
    //crea una piramide nell'area selezionata di altezza k
    //==============================================================
    void pyramid(MadMap *map,double k);

    //===================function===================================
    //seleziona la funzione per modificare la mappa da applicare<br>
    //                                                          <br>
    //Parametri                                                 <br>
    //map: puntatore alla MadMap da modificare                  <br>
    //undomap: puntatore alla MadMap usata per l'undo           <br>
    //type: tipo del metodo della Selection da 
    //applicare(LEVEL,SLIDE,INCLINE,FLAT,UP,ZERO,PYRAMID        <br>
    //val: valore da passare al funzione di modifica della mappa<br>
    //==============================================================
    void function(MadMap *map, MadMap *undomap, int type, double val );
    
};


#endif