#include <iostream>
#include <fstream>
#include <vector>
#include <string>

#include "Arquivo.h"
#include "Principal.h"

using namespace std;

typedef struct {
    REAL Y[RES], R2, RMS;
} Resultado;

typedef struct {
    INTG N;
    REAL DSS, DP, US, E1, E2;
    REAL X[DIM], Y[DIM];
} Simulacao;

static vector<Simulacao> simul;
static int regIdx;

void saveArq(string nomeArq, ios_base::openmode mode, bool fim)
{
    int i;
    static ofstream arq(nomeArq.c_str(), ios_base::out | mode);

    arq << N << endl;

    for (i=0; i<N; ++i)
      arq << X[i+1] << " ";
    arq  << endl;

    for (i=0; i<N; ++i)
      arq << Y[i+1] << " ";
    arq  << endl ;

    arq << DSS << " " << DP << endl;
    arq << US << " " << E1 << " " << E2 << endl;
    arq  << endl ;

    if (fim)
        arq.close();
}

int readArq(string nomeArq)
{
    int i;
    ifstream arq;
    Simulacao reg;

    arq.open(nomeArq.c_str());
    simul.clear();

    while (arq >> reg.N) {

        for (i=0; i<reg.N; ++i)
            arq >> reg.X[i];
        for (i=0; i<reg.N; ++i)
            arq >> reg.Y[i];
        arq >> reg.DSS >> reg.DP >> reg.US >> reg.E1 >> reg.E2;
        simul.push_back(reg);
    }
    arq.close();

    return readArq(FIRST);
}

int readArq(int sentido)
{
    int i;

    if (sentido == FIRST)
        regIdx = 0;
    else if (sentido == NEXT and regIdx < simul.size()-1)
        ++regIdx;
    else if (sentido == PREVIOUS and regIdx != 0)
        --regIdx;

    N = simul[regIdx].N;
    DSS = simul[regIdx].DSS;
    DP = simul[regIdx].DP;
    US = simul[regIdx].US;
    E1 = simul[regIdx].E1;
    E2 = simul[regIdx].E2;

    for (i=0; i<N; ++i) {
        X[i+1] = simul[regIdx].X[i];
        Y[i+1] = simul[regIdx].Y[i];
    }

     if (!regIdx) {
        if (simul.size() == 1)
            return UNIQUE;
        else
            return FIRST;
    }
    else if (regIdx == simul.size()-1)
        return LAST;
    else
        return MIDDLE;
}

