#include "laberint.hpp"
#include "teseus.hpp"
#include <fstream>
#include <iostream>
#include "particio.hpp"
#include "dedalus.hpp"
#include "eda/mem_din"

using namespace std;
void resol(laberint_teseus & lab, const posicio& inici, const posicio& fi) throw(error);
void infoparti(const particio<int>& p); 

int main() {

//  ifstream fitxer("test1.txt");
//  ifstream fitxer("juegos/laberint_3x3.txt");
//  ifstream fitxer("juegos/laberint_30x30.txt");
//  ifstream fitxer("juegos/laberint_3x3_ciclo.txt");
//  nat fil, col;
//  cambra c=cambra(false,true,false,false); // Al sud
//  paret p;
//  laberint_teseus l(fitxer);
//  nat i, j; // comptador
//  posicio pos;
  
  
/*  
  l.print(cout);

  resol(l,make_pair(1,3),make_pair(3,3));
*/



/*
  particio<int> pi;
  
  pi.afegir(2);
  pi.afegir(3);
  pi.afegir(4);
  pi.afegir(5);
  pi.afegir(1);

  pi.unir(5,2);
  infoparti(pi);

  pi.unir(2,1);
  infoparti(pi);

  pi.unir(3,4);
  infoparti(pi);
  pi.unir(3,2);
  infoparti(pi);
*/
 /* 
  util::Random r;
 
  nat nfiles=3;
  nat ncolum=5;
while (1) {
    i = (nat)((double)nfiles*r())+1;
    j = (nat)((double)ncolum*r())+1;

    p = paret((int)(4*r()));

  cout << i << "," << j << ", " << (int)p << endl;
 }

//  while (1) { cout << r() << endl; }
*/
try{
  laberint_teseus l(4,4);

  mem_din::print_memory_status_report(cout,0);
  dedalus::construir(l);

  l.print(cout);

resol(l,make_pair(1,1),make_pair(l.num_files(),l.num_columnes()));
  mem_din::print_memory_status_report(cout,0);
}
catch (error e) {
cout << "ERROR: " << e.modulo() << ": " << e.mensaje() << endl;

}

cout << "Y aquí acaba main." << endl;
}


void infoparti(const particio<int>& p) {
nat i;
cout << "Número de grups: " << p.size() << endl;
for(i=1;i<=5;++i) cout << "rep("<<i<<"): " << p.representant(i) << endl;

}

void resol(laberint_teseus & lab, const posicio& inici, const posicio& fi) throw(error)
{
  list<posicio> solu;
  posicio pos;
  
  try{
    cout << "Vaig a resoldre el lab. de " << lab.num_files() << "x" << lab.num_columnes() << " des de ";
    cout << inici.first << ", " << inici.second << " fins a " << fi.first << ", " << fi.second << endl;
    lab.resoldre(inici,fi,solu);

cout << "Solució de " <<solu.size() << " passos: " << endl;
while (solu.size()>0) {
pos=solu.front();
solu.pop_front();
cout<< pos.first << ", " << pos.second << endl;
}

  } catch (error e) {
  cout << "Error en " << e.modulo() << ":" << e.mensaje() << endl;
  }
  
  
}

/*

// Provar cambres

  for(p=paret("NORD");p<=paret("OEST");++p) {
    cout << "es pot passar pel " << p << "? " << c.hi_ha_porta(p) << endl;
  }
  
*/

  
/*

// Mostrar totes les cambres

  cout << "Ara mostraré totes les cambres" << endl;

  for(fil=1;fil<=l.num_files();++fil)
    for(col=1;col<=l.num_columnes();++col) {
      c=l(make_pair(fil,col));
      for(p=paret("NORD");p<=paret("OEST");++p) {
        cout << "A la cambra " << fil << " " << col;
        cout << " es pot passar per " << p << "?" << c.hi_ha_porta(p) << endl;
      }
    

    }
*/


//  util::Random r; while (1) cout << r() << endl;
