// Leopold Clement
#include <stdio.h>
#include <math.h>
#include <sys/time.h>
#include "SDL2/SDL.h"

/*#include <exception.h>
#include <string.h>
#include <iostream.h>*/

struct timeval tv;

const int16_t LONGUEURE_TERRAIN = 800;
const int16_t LARGEUR_TERRAIN = 600;
const int16_t LARGEUR_BUT = 200;

const float VITESSE_TRANSLATION = 0.2;
const float VITESSE_ROTATION = 0.02;

typedef struct
{
    int up_key;
    int down_key;
    int right_key;
    int left_key;
} Controlleur;

typedef struct
{
    float x;
    float y;
    float theta;
} Vecteur;

typedef struct
{
    Vecteur position;
    char nom[25];
    Controlleur *control;
} Robot;

typedef struct
{
    Vecteur position;
    Vecteur vitesse;
    Robot *possession;
} Balle;

typedef struct
{
    int point_vert;
    int point_violet;
    int balle_en_jeu;
} Score;

void rendut_robot(Robot robot)
{
}
void rendut_balle(Balle balle)
{
}
void rendut_global(Robot robots[2], Balle balle)
{
}
float distance_vecteurs(Vecteur vect1, Vecteur vect2)
{
    return (sqrtf32(powf(vect1.x - vect2.x, 2) + powf(vect1.y - vect2.y, 2)));
}
Vecteur addition_vecteur(Vecteur vect1, Vecteur vect2)
{
    Vecteur vecteur_somme = {vect1.x + vect2.y, vect1.y + vect2.y, vect1.theta + vect2.theta};
    return vecteur_somme;
}

Vecteur projecteur_base_fixe(Vecteur vect, float theta)
{
    Vecteur vect_fixe = {0, 0, 0};
    vect_fixe.x = vect.x * cosf32(theta) - vect.y * sinf32(theta);
    vect_fixe.y = vect.x * sinf32(theta) + vect.y * cosf32(theta);
    return vect_fixe;
}

void deplacement_robot(SDL_Event events, Robot robot)
{
    if (events.key.keysym.sym == robot.control->up_key)
    {
        Vecteur avance_ref_robot = {VITESSE_TRANSLATION, 0, 0};
        Vecteur avance_ref_fixe = projecteur_base_fixe(avance_ref_robot, -robot.position.theta);
        robot.position = addition_vecteur(robot.position, avance_ref_fixe);
    }
    else if (events.key.keysym.sym == robot.control->down_key)
    {
        Vecteur avance_ref_robot = {-VITESSE_TRANSLATION, 0, 0};
        Vecteur avance_ref_fixe = projecteur_base_fixe(avance_ref_robot, -robot.position.theta);
        robot.position = addition_vecteur(robot.position, avance_ref_fixe);
    }
    if (events.key.keysym.sym == robot.control->left_key)
    {
        Vecteur rotation = {0, 0, VITESSE_ROTATION};
        robot.position = addition_vecteur(robot.position, rotation);
    }
    else if (events.key.keysym.sym == robot.control->right_key)
    {
        Vecteur rotation = {0, 0, -VITESSE_ROTATION};
        robot.position = addition_vecteur(robot.position, rotation);
    }
}
void pulsation_du_jeu(SDL_Renderer *prenderer, SDL_Event events, Robot robots[2], Balle balle, int *pisOpen)
{
    while (SDL_PollEvent(&events))
    {
        switch (events.type)
        {
        case SDL_QUIT:
            *pisOpen = 0;
            break;

        case SDL_KEYDOWN:
            char i;
            for(i = 0; i<2; i++) deplacement_robot(events, robots[i]);
        }
    }
    return;
}

int main(int argc, char *argv[])
{
    SDL_Window *pwindow;
    SDL_Renderer *prenderer;
    SDL_Event events;
    int isOpen = 1;
    unsigned long long last_tic = 0;

    // SDL_Rect rectangle1 = {20, 20, 100, 50};

    //Initialisation de SDL avec la vidéo
    if (SDL_Init(SDL_INIT_VIDEO) != 0)
        printf("il y a un souci d'initialisation");

    // make sure SDL cleans up before exit
    atexit(SDL_Quit);

    //Création d'une fenetre pointée par m_window et de son rendu pointé par m_rendered
    //largeur 640 et hauteur 480
    if (SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_SHOWN, &pwindow, &prenderer) != 0)
        printf("il y a un souci de création de fenêtre");

    //Paramètre de rendu de la fenetre (R,G,B et transparence a 255 pour opaque)
    SDL_SetRenderDrawColor(prenderer, 200, 200, 200, 255);
    SDL_RenderClear(prenderer);

    //Affichage de la fenetre
    SDL_RenderPresent(prenderer);

    while (isOpen)
    {
        gettimeofday(&tv, NULL);
        unsigned long long millisecondsSinceEpoch = (unsigned long long)(tv.tv_sec) * 1000 + (unsigned long long)(tv.tv_usec) / 1000;
        /* évènements de votre jeu */

        SDL_RenderPresent(prenderer); // mets à jour la fenêtre
    }

    SDL_DestroyRenderer(prenderer); //destruction du rendu
    SDL_DestroyWindow(pwindow);     //destruction de la fenetre
    SDL_Quit();

    return 0;
}
