#include "struc.h"

/*Startadressen für die Zeiger next,anfang und ende*/
void start(void)
{
 next=anfang=ende=NULL;
}

void sortieren(char gen[],char tit[],char reg[],char dar[],char f[],char j[])
{
 ARCHIV *zeiger1, *zeiger2, *zeiger3;

 if((zeiger2=(ARCHIV *)malloc(sizeof(ARCHIV))) == NULL)
  {
   fehler_curses("Ich konnte keinen Speicher reservieren....versuchen sie es erneut!");
   return;
  }
 strcpy(zeiger2->genere, gen);
 strcpy(zeiger2->titel, tit);
 strcpy(zeiger2->regie, reg);
 strcpy(zeiger2->darsteller, dar);
 strcpy(zeiger2->fsk, f);
 strcpy(zeiger2->jahr, j);

 /*1.Element ? */
 if(anfang==NULL)
   {
    if((anfang=(ARCHIV *)malloc(sizeof(ARCHIV))) == NULL)
    {
     fehler_curses("Ich konnte keinen Speicher reservieren....versuchen sie es erneut!");
     return;
   }
     strcpy(anfang->genere, gen);
     strcpy(anfang->titel, tit);
     strcpy(anfang->regie, reg);
     strcpy(anfang->darsteller, dar);
     strcpy(anfang->fsk, f);
     strcpy(anfang->jahr, j);

    anfang->next=NULL;
    ende=anfang;
    ende->previous=NULL;
    }
 else
  {
    zeiger1=anfang;

    while((zeiger1->next != NULL )  && (comp(zeiger1, zeiger2) <0))
       zeiger1=zeiger1->next;

    if(zeiger1->next == NULL)   //hinten anhängen
     {
      if((zeiger1->next=(ARCHIV *) malloc(sizeof(ARCHIV))) == NULL)
       {
        fehler_curses("Ich konnte keinen Speicher reservieren....versuchen sie es erneut!");
        return;
       }
      zeiger3=zeiger1;
      zeiger1=zeiger1->next;

      strcpy(zeiger1->genere, gen);
      strcpy(zeiger1->titel, tit);
      strcpy(zeiger1->regie, reg);
      strcpy(zeiger1->darsteller, dar);
      strcpy(zeiger1->fsk, f);
      strcpy(zeiger1->jahr, j);

      zeiger1->next=NULL;
      ende=zeiger1;
      zeiger1->previous=zeiger3;
     }
    else if(zeiger1==anfang && (comp(zeiger1, zeiger2)>=0)) //vorne anhängen
     {
      if((anfang=(ARCHIV *)malloc(sizeof(ARCHIV))) == NULL)
        {
         fehler_curses("Ich konnte keinen Speicher reservieren....versuchen sie es erneut!");
         return;
        }
     strcpy(anfang->genere, gen);
     strcpy(anfang->titel, tit);
     strcpy(anfang->regie, reg);
     strcpy(anfang->darsteller, dar);
     strcpy(anfang->fsk, f);
     strcpy(anfang->jahr, j);
     anfang->next=zeiger1;
       anfang->previous=NULL;
       zeiger1->previous=anfang;
     }
    else if(comp(zeiger1, zeiger2) >=0) //mittendrin
     {
      zeiger3=anfang;
      while(zeiger3->next != zeiger1)
         zeiger3=zeiger3->next;

      zeiger2->previous=zeiger3;
      zeiger2->next=zeiger1;
      zeiger1->previous=zeiger2;
      zeiger3->next=zeiger2;
      }
    else
     //Fehler-Routine für curses schreiben
       exit(0);
  }
}

/*Vergleichsfunktion*/
int comp(ARCHIV *arch, ARCHIV *neu)
{
  int ret=strcmp(arch->titel,neu->titel);
  return ret;
}


/*Löschen eines Filmes aus der Liste*/
void loesche(char wen[])
{
 ARCHIV *zeiger ,*zeiger1, *zeiger2;
 int found=0;
/*Ist überhaupt ein Element vorhanden?*/
 if(anfang != NULL)
 {
  /*Ist unser 1.Element das von uns gesuchte (wen[]) ?*/
  if(strcmp(anfang->titel,wen) == 0)
   {
     zeiger=anfang->next;
      if(zeiger == NULL)
        {
          free(anfang);
          anfang=NULL;
          ende=NULL;
          return;
        }
       zeiger->previous=NULL;
       free(anfang);
       anfang=zeiger;
       return;
   }
  /*Ist das letzte Element das von uns gesuchte ? */
  else if(strcmp(ende->titel,wen) == 0)
   {
     zeiger=ende->previous;
     zeiger->next=NULL;
     zeiger1=ende;
     ende=zeiger;
     free(zeiger1);
     return;
   }
  else
   {
   /*Es ist nicht das 1.Element zu löschen. Wir suchen in
     der weiteren Kette ob das zu löschende Element vor-
     handen ist*/
    zeiger=anfang;
    while(zeiger->next != NULL)
      {
        zeiger1=zeiger->next;
        /*Ist die Adresse von zeiger1 der gesuchte Namen?*/
        if(strcmp(zeiger1->titel,wen) == 0)
          {
            /*Falls ja dann.....*/
             zeiger->next=zeiger1->next;
             zeiger2=zeiger1->next;
             zeiger2->previous=zeiger;
             free(zeiger1);
             return;
          }
        zeiger=zeiger1;
       }//Ende while
    }//Ende else
  }//Ende if(anfang != NULL)
 fehler_curses("         Ich kann den Film  nicht im Archiv finden ?!?!?!         ");
}



ARCHIV *searching(char film[])
{
 ARCHIV *zeiger;

 if(anfang == NULL)
  {
   fehler_curses("            Es befinden sich keine Filme in der Liste                ");
   return NULL;
  }

 zeiger=anfang;
 while((zeiger != NULL)  &&  (strcmp(zeiger->titel, film) != 0))
   zeiger=zeiger->next;

 return zeiger; //Entweder NULL oder den gefundenen Film
}


int loading(FILE *file)
{
 ARCHIV zeiger;

 if(open_for_read(&file))
  {
     while(fread(&zeiger,sizeof(ARCHIV),1,file))
        sortieren(zeiger.genere, zeiger.titel, zeiger.regie, zeiger.darsteller, zeiger.fsk, zeiger.jahr);
      return SUCCESS;
  }
 return ERROR;
}


int open_for_read(FILE **file)
{
 if((*file = fopen(DAT ,"r")) == NULL)
  {
     fehler_curses("          Konnte \"video.dat\" nicht zum lesen oeffnen!             ");
     return ERROR;
  }
  return SUCCESS;
}


int create_new_file(FILE **file)
{
 if((*file = fopen(DAT ,"w+")) == NULL)
  {
    fehler_curses("            Konnte \"video.dat\" nicht zum nicht erzeugen !                 ");
    return ERROR;
  }
 return SUCCESS;
}


void save_file(FILE *file)
{
 ARCHIV *zeiger;

 /*Im "w+" - Modus oeffnen*/
 if(file_open_for_write(&file))
 {
  zeiger=anfang;
  while(zeiger != NULL)
  {
     fwrite(zeiger,sizeof(ARCHIV),1,file);
     zeiger=zeiger->next;
  }
 }
 fclose(file);
}


int file_open_for_write(FILE **file)
{
 if((*file = fopen(DAT, "w+")) == NULL)
  {
   fehler_curses("        Konnte \"video.dat\" nicht zum schreiben oeffnen!           ");
   return ERROR;
  }
 return SUCCESS;
}




