#include <stdio.h>
#include <stdlib.h>

#include "structures.h"
#include "prototypes.h"


int main(int argc, char *argv[])
{

    int i = 0, j;
    char nomFichier[100] = "";
    Couleur tabPixel[LARGEUR_IMAGE][HAUTEUR_IMAGE];

    for (i = 0; i < LARGEUR_IMAGE; i++)
    {
        for (j = 0; j < HAUTEUR_IMAGE; j++)
        {
            tabPixel[i][j].r = 0;
            tabPixel[i][j].g = 0;
            tabPixel[i][j].b = 0;
        }

    }





    printf("Entrez le nom du fichier a lire\n");
    scanf("%s", nomFichier);
    printf("\n\n\n");
    RepertoireDObjets objets = litPov(nomFichier);



    printf("Nombre de camera : %d \n", objets.nbCamera);
    printf("Nombre de lumiere : %d \n", objets.nbLumiere);
    printf("Nombre de fond d'ecran : %d \n", objets.nbBackground);
    printf("Nombre de plan : %d \n", objets.nbPlan);
    printf("Nombre de cube : %d \n", objets.nbBox);
    printf("Nombre de sphere : %d \n", objets.nbSphere);
    printf("Nombre de cylindre : %d \n", objets.nbCylindre);
    printf("Nombre de cone : %d \n", objets.nbCone);
    printf("Nombre de torus : %d \n", objets.nbTorus);
    printf("\n\n\n");


    for (i = 0; i < objets.nbCamera; i++)
    {
        printf("La camera %d est en (%lf, %lf, %lf) et est dirige vers (%lf, %lf, %lf)",
                i+1, objets.camera[i].location.x, objets.camera[i].location.y, objets.camera[i].location.z,
                objets.camera[i].lookAt.x, objets.camera[i].lookAt.y, objets.camera[i].lookAt.z);
        printf("\n\n");
    }
    printf("\n\n");

    for (i = 0; i < objets.nbLumiere; i++)
    {
        printf("La lumiere %d est emise depuis (%lf, %lf, %lf) et sa couleur est (%d, %d, %d)",
                i+1, objets.lumiere[i].location.x, objets.lumiere[i].location.y, objets.lumiere[i].location.z,
                objets.lumiere[i].couleur.r, objets.lumiere[i].couleur.g, objets.lumiere[i].couleur.b);
        printf("\n\n");
    }
    printf("\n\n");

    for (i = 0; i < objets.nbBackground; i++)
    {
        printf("La couleur du background %d est (%d, %d, %d)", i+1, objets.background[i].couleur.r, objets.background[i].couleur.g, objets.background[i].couleur.b);
        printf("\n\n");
    }
    printf("\n\n");

    for (i = 0; i < objets.nbPlan; i++)
    {
        printf("Plan %d. Son vecteur normal est (%lf, %lf, %lf), sa hauteur est %lf et sa couleur est (%d, %d, %d)",
                i+1, objets.plan[i].vecteurNormal.x, objets.plan[i].vecteurNormal.y, objets.plan[i].vecteurNormal.z, objets.plan[i].hauteur,
                objets.plan[i].couleur.r, objets.plan[i].couleur.g, objets.plan[i].couleur.b);
        printf("\n\n");
    }
    printf("\n\n");

    for (i = 0; i < objets.nbBox; i++)
    {
        printf("Cube %d est situe par les points (%lf, %lf, %lf) et (%lf, %lf, %lf) et sa couleur est (%d, %d, %d)",
                i+1, objets.box[i].point1.x, objets.box[i].point1.y, objets.box[i].point1.z, objets.box[i].point2.x, objets.box[i].point2.y, objets.box[i].point2.z,
                objets.box[i].couleur.r, objets.box[i].couleur.g, objets.box[i].couleur.b);
        printf("\n\n");
    }
    printf("\n\n");

    for (i = 0; i < objets.nbSphere; i++)
    {
        printf("Sphere %d, son centre est en (%lf, %lf, %lf), son rayon est %lf et sa couleur est (%d, %d, %d)",
                i+1, objets.sphere[i].centre.x, objets.sphere[i].centre.y, objets.sphere[i].centre.z, objets.sphere[i].rayon,
                objets.sphere[i].couleur.r, objets.sphere[i].couleur.g, objets.sphere[i].couleur.b);
        printf("\n\n");
    }
    printf("\n\n");

    for (i = 0; i < objets.nbCylindre; i++)
    {
        printf("Cylindre %d, son premier centre est en (%lf, %lf, %lf), son deuxieume centre est en (%lf, %lf, %lf), son rayon est %lf et sa couleur est (%d, %d, %d)",
                i+1, objets.cylindre[i].centre1.x, objets.cylindre[i].centre1.y, objets.cylindre[i].centre1.z,
                objets.cylindre[i].centre2.x, objets.cylindre[i].centre2.y, objets.cylindre[i].centre2.z,
                objets.cylindre[i].rayon, objets.cylindre[i].couleur.r, objets.cylindre[i].couleur.g, objets.cylindre[i].couleur.b);
        printf("\n\n");
    }
    printf("\n\n");

    for (i = 0; i < objets.nbCone; i++)
    {
        printf("Cone %d, son premier centre est en (%lf, %lf, %lf), son deuxieume centre est en (%lf, %lf, %lf), son premier rayon est %lf, son deuxieme rayon est %lf et sa couleur est (%d, %d, %d)",
                i+1, objets.cone[i].centre1.x, objets.cone[i].centre1.y, objets.cone[i].centre1.z, objets.cone[i].centre2.x, objets.cone[i].centre2.y, objets.cone[i].centre2.z,
                objets.cone[i].rayon1, objets.cone[i].rayon2, objets.cone[i].couleur.r, objets.cone[i].couleur.g, objets.cone[i].couleur.b);
        printf("\n\n");
    }
    printf("\n\n");

    for (i = 0; i < objets.nbTorus; i++)
    {
        printf("Torus %d, son premier rayon est %lf, son deuxieme rayon est %lf et sa couleur est (%d, %d, %d)",
                i+1, objets.torus[i].rayon1, objets.torus[i].rayon2, objets.torus[i].couleur.r, objets.torus[i].couleur.g, objets.torus[i].couleur.b);
        printf("\n\n");
    }
    printf("\n\n");





    creerImage2D(objets, tabPixel);

    i = 0;

    while (nomFichier[i] != '\0')
    {
	i++;
    }

    nomFichier[i-3] = 'p';
    nomFichier[i-2] = 'p';
    nomFichier[i-1] = 'm';

    ecritPPM(nomFichier, tabPixel);


    return 0;
}




void initCam (Camera *cam)
{
    cam->location.x = 0.0;
    cam->location.y = 0.0;
    cam->location.z = 0.0;
    cam->lookAt.x = 0.0;
    cam->lookAt.y = 0.0;
    cam->lookAt.z = 0.0;
}

void initLumiere (Lumiere *lum)
{
    lum->location.x = 0.0;
    lum->location.y = 0.0;
    lum->location.z = 0.0;
    lum->couleur.r = 0;
    lum->couleur.g = 0;
    lum->couleur.b = 0;
}

void initBackground (Background *bgd)
{
    bgd->couleur.r = 0;
    bgd->couleur.g = 0;
    bgd->couleur.b = 0;
}


void initPlan (Plan *p)
{
    p->vecteurNormal.x = 0.0;
    p->vecteurNormal.y = 0.0;
    p->vecteurNormal.z = 0.0;
    p->hauteur = 0.0;
    p->couleur.r = 0;
    p->couleur.g = 0;
    p->couleur.b = 0;
}

void initBox (Box *b)
{
    b->point1.x = 0.0;
    b->point1.y = 0.0;
    b->point1.z = 0.0;
    b->point2.x = 0.0;
    b->point2.y = 0.0;
    b->point2.z = 0.0;
    b->couleur.r = 0;
    b->couleur.g = 0;
    b->couleur.b = 0;
}

void initSphere (Sphere *s)
{
    s->centre.x = 0.0;
    s->centre.y = 0.0;
    s->centre.z = 0.0;
    s->rayon = 0.0;
    s->couleur.r = 0;
    s->couleur.g = 0;
    s->couleur.b = 0;
}

void initCylindre (Cylindre *cy)
{
    cy->centre1.x = 0.0;
    cy->centre1.y = 0.0;
    cy->centre1.z = 0.0;
    cy->centre2.x = 0.0;
    cy->centre2.y = 0.0;
    cy->centre2.z = 0.0;
    cy->rayon = 0.0;
    cy->couleur.r = 0;
    cy->couleur.g = 0;
    cy->couleur.b = 0;
}

void initCone (Cone *co)
{
    co->centre1.x = 0.0;
    co->centre1.y = 0.0;
    co->centre1.z = 0.0;
    co->centre2.x = 0.0;
    co->centre2.y = 0.0;
    co->centre2.z = 0.0;
    co->rayon1 = 0.0;
    co->rayon2 = 0.0;
    co->couleur.r = 0;
    co->couleur.g = 0;
    co->couleur.b = 0;
}

void initTorus (Torus *t)
{
    t->position.x = 0.0;
    t->position.y = 0.0;
    t->position.z = 0.0;
    t->rayon1 = 0.0;
    t->rayon2 = 0.0;
    t->couleur.r = 0;
    t->couleur.g = 0;
    t->couleur.b = 0;
}




