#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 --------------
int FindTrajTime(struct Traj *t, CMatrix m1){
 int i, res=0;
  for (i = 1; i<t->c; i++)
   res += m1[ t->point[i] ][ t->point[i-1] ] ;

  t->time = res;
 return res;  
}



//------------ Init Traj --------------
void PrintTraj(struct Traj *t, struct Stations *stat){
int i = 0;

if (t->c <= 0) { printf("\n   Cannot find :( "); return;}  
  printf("\n   %s", stat->items[  t->point[t->c-1] ]);
   for (i = 1; i < t->c; i++) {
    printf(" -> %s", stat->items[  t->point[t->c-1 - i] ]);
   }

  printf("\n   Total time: %d", t->time);
}



//------------ 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;
 int res = 0;

  if (end_p == p)
    if (TestCMatrix(sm, size_m, p))
    {
      DestTraj(&cur_traj);
      InitTraj(&cur_traj);
     return 3;   // Forming of trajectory
     }

     {
      //  if (Deadlock(p))
       //    return 1;  // do BACK_UP of matrix;
       // else
          { //-----------------------------------------------------

           res = -2;

           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 == 3)
              {
                printf("\nRET2\n");
               AddPointTraj(&cur_traj, i);
               return 3;
              }
              if (res == 1) sm[i][p]=1;
             }


            if (res == -2) // +++++++++++++++++++ TO RETURN, if this was tupik !!! +++++++++


             for (i=0; i<size_m; i++)  // recursion call
            if (sm[p][i] > 0)
             {
               sm[p][i]=0; // ? may be - sm[i][p]--;
               res = FindTraj(i);

              if (res == 3)
              {
                printf("\nRET2\n");
               AddPointTraj(&cur_traj, i);
               return 3;
              }
              if (res == 1) sm[p][i]=1;
             }
              //-------------------------------------------------

            // DeadLock -

            if (res == -2)
             return 1;

          }

     }

    printf("suxxx\n");
   return -1;
}

//----------- 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
