#ifndef TrajH
#define TrajH

// 1) find traj
// 2) calculate time of this traj
// 3) <> with prev traj time
// 4) if this time < DataTime then EXIT

#define EndStat "Aeroport"

#include "Stations.c"
#include "ConMatrix.c"


struct Traj {
 int c;
 int time;
 int *point;
};

static CMatrix sm, m;
static int size_m = 0, data_time = 0;

static int start_p, end_p;

struct Traj cur_traj, prev_traj;  // NOT STATIC!


//------------ Init Traj --------------
void InitTraj(struct Traj *t){
 t -> c = 0;
 t -> time = 0;
}

//------------ Init Traj --------------
void DestTraj(struct Traj *t){
 t -> c = 0;
 t -> time = 0;
 free(t -> point);
}

//------------ Init Traj --------------
void AddPointTraj(struct Traj *t, int p){
 t -> c++;
 t -> point = realloc(t -> point, sizeof(int) * t->c);
 t -> point[t->c-1] = p;
}


//------------ Init Traj --------------
void PrintTraj(struct Traj *t, struct Stations *stat){
int i = t->c-1;
printf(stat->items[  t->point[t->c-1 - i] ]);
 for (i = 1; i< t->c; i++) {
  printf("-> %s ", stat->items[  t->point[t->c-1 - i] ]);
  }
}



//------------ FIND TRAJECOTRY -------------
// 2 - now forming trajectory
// 1 - go back
//

//         ------- TUpIK? -------
char Deadlock(int p){
 int i;
  for (i=0; i<size_m; i++)
   if ((m[p][i] > 0) || (m[i][p] > 0))
    return 0;

  return 1;
}


char FindTraj(int p){
 int i;
 char res;
  if (end_p == p)  {
    if (TestCMatrix(sm, size_m))
      return 2;   }  // Forming of trajectory


  //  else
     {
        if (Deadlock(p))
           return 1;  // do BACK_UP of matrix;
        else
           for (i=0; i<size_m; i++)  // recursion call
            if (sm[i][p] > 0)
             {
               sm[i][p]=0; // ? may be - sm[i][p]--;
               res = FindTraj(i);

              if (res == 2)
              {
               AddPointTraj(&cur_traj, p);
               return 2;
              } 
              if (res == 1) sm[i][p]++;
             }
     }

}

//----------- Base function ---------------
struct Traj BaseFunc(struct Stations *stat, int sel, int t, CMatrix m1, CMatrix sm1){


  end_p = GetStationID(EndStat, stat);
  start_p = sel;
  data_time = t;

  m = m1;
  sm = sm1;
  size_m = stat -> c;

  InitTraj(&cur_traj);

   FindTraj(start_p);


 return cur_traj;
}

#endif
