#include "i2c_annexe.h"
#include "Localisation.h"
#include "Monitoring.h"
#include "Strategie.h"
#include "Trajectoire.h"
#include "Trajet.h"
#include "Geometrie.h"

enum etat_action_t Gateau_pousse_proche(enum couleur_t couleur, uint32_t step_ms){
    static enum {
        ALLER_1,
        ALLER_2,
        ALLER_3
    } etat=ALLER_1;
    float point_x, point_y;
    float angle_fin;
    struct trajectoire_t trajectoire;
    
    
    switch(etat){
        case ALLER_1:
            if(couleur == COULEUR_BLEU){
                angle_fin = 90. * DEGRE_EN_RADIAN;
                point_x = 310;
            }else{
                angle_fin = 205. * DEGRE_EN_RADIAN;
                point_x = 1700;
            }
            angle_fin = Geometrie_get_angle_optimal(Localisation_get().angle_radian, angle_fin);

            Trajet_config(100, 250);
            Trajectoire_droite(&trajectoire, Localisation_get().x_mm, Localisation_get().y_mm, point_x, 3000 - 380,
                        Localisation_get().angle_radian, angle_fin);

            if(parcourt_trajet_simple(trajectoire, step_ms) == ACTION_TERMINEE){
                etat=ALLER_2;
                i2c_annexe_deplie_bras();
            }
            break;
        
        case ALLER_2:
            if(couleur == COULEUR_BLEU){
                angle_fin = 90. * DEGRE_EN_RADIAN;
                point_x = 310;
            }else{
                angle_fin = 205. * DEGRE_EN_RADIAN;
                point_x = 1700;
            }
            angle_fin = Geometrie_get_angle_optimal(Localisation_get().angle_radian, angle_fin);

            Trajet_config(500,250);
            Trajectoire_droite(&trajectoire, Localisation_get().x_mm, Localisation_get().y_mm, point_x, 3000 - 1700,
                        Localisation_get().angle_radian, angle_fin);

            if(parcourt_trajet_simple(trajectoire, step_ms) == ACTION_TERMINEE){
                i2c_annexe_plie_bras();
                etat=ALLER_3;
            }
            break;
        
        case ALLER_3:
            if(couleur == COULEUR_BLEU){
                angle_fin = -150. * DEGRE_EN_RADIAN;
                point_x = 225;
            }else{
                angle_fin = 30. * DEGRE_EN_RADIAN;
                point_x = 1775;
            }
            angle_fin = Geometrie_get_angle_optimal(Localisation_get().angle_radian, angle_fin);

            Trajet_config(250, 250);
            Trajectoire_droite(&trajectoire, Localisation_get().x_mm, Localisation_get().y_mm, point_x, 3000 - 1600,
                        Localisation_get().angle_radian, angle_fin);

            if(parcourt_trajet_simple(trajectoire, step_ms) == ACTION_TERMINEE){
                etat=ALLER_1;
                return ACTION_TERMINEE;
            }
            break;

    }
    return ACTION_EN_COURS;

}