#include <iostream>
#include <fstream>
#include <stdint.h>
#include <string.h>
#include <assert.h>
#include "m3dme.h"

using namespace std;
using namespace M3D;
int main(int argc, char *argv[])
{
    if(argc<3) 
    {
        cerr<<"Usage: "<<argv[0]<<" <mesh file> <output file>"<<endl;
	return 1;
    }
    ifstream in(argv[1]);
    string tbuf;
    //Читаем кол-во вершин
    in>>tbuf;
    if(tbuf != "VN")
    {
        cerr<<__LINE__<<"Invalid input file format!"<<endl;
        return 1;
    }
    uint32_t vertex_count;
    in>>vertex_count;
    //Читаем кол-во индексов
    in>>tbuf;
    if(tbuf != "IN")
    {
        cerr<<__LINE__<<"Invalid input file format!"<<endl;
        return 1;
    }
    uint32_t index_count;
    in>>index_count;
    if(index_count%3!=0)
    {
        cerr<<__LINE__<<"Invalid model!"<<endl;
        return 1;
    }
    index_count/=3;
    //Читаем имя
    in>>tbuf;
    if(tbuf != "M")
    {
        cerr<<__LINE__<<"Invalid input file format!"<<endl;
        return 1;
    }
    string model_name;
    in>>model_name;
    
    cout<<"Model name:\""<<model_name<<"\" have "<<vertex_count<<" vertexes and "<<index_count<<" indexes"<<std::endl;
    
    
    M3DME_Vertex_Data *m3dm_vertex_data = new M3DME_Vertex_Data[vertex_count];
    M3DME_Index_Data *m3dm_index_data = new M3DME_Index_Data[index_count*3];
    
    //Считаем все вертексы
    for (uint32_t a=0;a<vertex_count; ++a)
    {
        in>>tbuf;
        if(tbuf != "V")
        {
            cerr<<__LINE__<<"Invalid input file format!"<<endl;
            return 1;
        }
	in>>m3dm_vertex_data[a].x;
	in>>m3dm_vertex_data[a].y;
	in>>m3dm_vertex_data[a].z;
	in>>m3dm_vertex_data[a].u;
	in>>m3dm_vertex_data[a].v;
	in>>m3dm_vertex_data[a].n_x;
	in>>m3dm_vertex_data[a].n_y;
	in>>m3dm_vertex_data[a].n_z;
    }
    //Считаем все фейсы
    for (uint32_t a=0;a<index_count; ++a)
    {
        in>>tbuf;
        if(tbuf != "F")
        {
            cerr<<__LINE__<<"Invalid input file format! Got:"<<tbuf<<" on index:"<<a<<endl;
            return 1;
        }
	in>>m3dm_index_data[3*a].index;
	in>>m3dm_index_data[3*a+1].index;
	in>>m3dm_index_data[3*a+2].index;
	float a;
	in>>a;
	in>>a;
	in>>a;
    }
    
    //Запишем файл.
    //заполним заголовок
    M3DME_Header m3dm_header;
    m3dm_header.vertex_data_size = vertex_count *sizeof(M3DME_Vertex_Data);
    m3dm_header.index_data_size = index_count *3 *sizeof(M3DME_Index_Data);
    m3dm_header.primitive_type = TRIANGLES;
    M3DME model;
    model.set_header( &m3dm_header );
    model.set_vertex_data( m3dm_vertex_data );
    model.set_index_data( m3dm_index_data );
    model.save( argv[2] );
    
    return 0;
}
