#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif

#include <stdio.h>
#include <malloc.h>
#include <string.h>

#include <getopt.h>
#include <stdlib.h>
#include <vdr/interface.h>
#include <vdr/plugin.h>
#include <unistd.h>
#include "menu.h"
#include "config.h"
#include "cProjektBearbeiten.h"
#include "cMenuAufnahmeAuswahl.h"

// --- cProjektBearbeiten ------------------------------------------------------------
cProjektBearbeiten::cProjektBearbeiten(char* myBeschreibung) : cOsdMenu(myBeschreibung, 12, 6)
{
  beschreibung=myBeschreibung;
  zeigeEintraege();
  SetHelp();
}

cProjektBearbeiten::~cProjektBearbeiten(){
}

void cProjektBearbeiten::zeigeEintraege(){
  char *datei;
  char *titel;
  asprintf(&datei,"%s",VdrconvertSetup.gibDateiname(VdrconvertSetup.aktProjekttyp));
  FILE *fi = fopen (datei, "r");
  char *s;
  int groesse=0;
  cProjektBearbeitenItem *item;
  
  Clear();
  if (fi!=NULL){
#if VDRVERSNUM >= 10318
        cReadLine r;
    while ((s = r.Read(fi)) != NULL) {
#else
    while ((s=readline(fi))!=NULL){
#endif
      //printf("debug->%s<-\n",s);
      item=new cProjektBearbeitenItem(s);
      groesse+=item->gibGroesse();
      Add(item);
    }//while
  }else{//if
    FILE *fi = fopen (datei, "w");//Datei anlegen
    //TODO Fehlerabfrage
    fclose(fi);
  }//else

  if (groesse>=1000000){
    asprintf(&titel,"%s (%3.3f GB)",beschreibung, ((groesse*1.0)/1000000));
  }else if (groesse>=1000){
    asprintf(&titel,"%s (%3.3f MB)",beschreibung, ((groesse*1.0)/1000));
  }else{
    asprintf(&titel,"%s (%d B)",beschreibung,groesse);
  }

  SetTitle(titel);

  Display();

  free(datei);
  free(titel);
}

eOSState cProjektBearbeiten::eintragLoeschen(cProjektBearbeitenItem *item) {
  char *datei;
  char *datei2;
  asprintf(&datei,"%s",VdrconvertSetup.gibDateiname(VdrconvertSetup.aktProjekttyp));
  asprintf(&datei2,"%s.tmp",VdrconvertSetup.gibDateiname(VdrconvertSetup.aktProjekttyp));
  FILE *dateiOrg = fopen (datei, "r");
  FILE *dateiTmp = fopen (datei2, "w");

  char *s;
  
  if ((datei!=NULL)&&(dateiTmp!=NULL)){
#if VDRVERSNUM >= 10318
        cReadLine r;
    while ((s = r.Read(dateiOrg)) != NULL) {
#else
    while ((s=readline(dateiOrg))!=NULL){
#endif
      //printf("debug->%s<-\n",s);
      if (!(strcmp(item->dateiname,s)==0))
	fprintf(dateiTmp,"%s\n",s);
    }//while
  }else{//if
    //ERROR
  }
  fclose(dateiTmp);
  fclose(dateiOrg);
  rename(datei2,datei);
  zeigeEintraege();
  free(datei);
  free(datei2);
  return osContinue;
}


void cProjektBearbeiten::eintragHoch(cProjektBearbeitenItem *item) {
  char *datei;
  char *datei2;
  asprintf(&datei,"%s",VdrconvertSetup.gibDateiname(VdrconvertSetup.aktProjekttyp));
  asprintf(&datei2,"%s.tmp",VdrconvertSetup.gibDateiname(VdrconvertSetup.aktProjekttyp));
  FILE *dateiOrg = fopen (datei, "r");
  FILE *dateiTmp = fopen (datei2, "w");

  int i=0;
  char *s;
  char *s2=NULL;
  char liste[20][MaxFileName] = {"","","","","","","","","","","","","","","","","","","",""};
  
  if ((datei!=NULL)&&(dateiTmp!=NULL)){
#if VDRVERSNUM >= 10318
        cReadLine r;
    while ((s = r.Read(dateiOrg)) != NULL) {
#else
    while ((s=readline(dateiOrg))!=NULL){
#endif    
      strcpy(liste[i++],s);
    }//while
  }else{//if
    //ERROR
  }

  for (i=0;i<20;i++){
    if (strcmp(item->dateiname,liste[i])==0){
      if (i>0 && strcmp(liste[i-1],"")!=0){
	asprintf(&s2,"%s",liste[i-1]);
	strcpy(liste[i-1],liste[i]);
	strcpy(liste[i],s2);
	i++;
      }
    }
  }
  free(s2);
  
  if ((datei!=NULL)&&(dateiTmp!=NULL)){
    for (i=0;i<20;i++){
      if (strcmp(liste[i],"")!=0){
	fprintf(dateiTmp,"%s\n",liste[i]);
      }//if
    }//while
  }else{//if
    //ERROR
  }

  fclose(dateiTmp);
  fclose(dateiOrg);

  rename(datei2,datei);
  zeigeEintraege();
  free(datei);
  free(datei2);

  return;
}

void cProjektBearbeiten::eintragRunter(cProjektBearbeitenItem *item) {
  char *datei;
  char *datei2;
  asprintf(&datei,"%s",VdrconvertSetup.gibDateiname(VdrconvertSetup.aktProjekttyp));
  asprintf(&datei2,"%s.tmp",VdrconvertSetup.gibDateiname(VdrconvertSetup.aktProjekttyp));
  FILE *dateiOrg = fopen (datei, "r");
  FILE *dateiTmp = fopen (datei2, "w");

  int i=0;
  char *s;
  char *s2=NULL;
  char liste[20][MaxFileName] = {"","","","","","","","","","","","","","","","","","","",""};
  
  if ((datei!=NULL)&&(dateiTmp!=NULL)){
#if VDRVERSNUM >= 10318
        cReadLine r;
    while ((s = r.Read(dateiOrg)) != NULL) {
#else
    while ((s=readline(dateiOrg))!=NULL){
#endif
      strcpy(liste[i++],s);
    }//while
  }else{//if
    //ERROR
  }

  for (i=0;i<20;i++){
    if (strcmp(item->dateiname,liste[i])==0){
      if (i<20 && strcmp(liste[i+1],"")!=0){
	asprintf(&s2,"%s",liste[i+1]);
	strcpy(liste[i+1],liste[i]);
	strcpy(liste[i],s2);
	i++;
      }
    }
  }
  free(s2);
  
  
  if ((dateiOrg!=NULL)&&(dateiTmp!=NULL)){
    for (i=0;i<20;i++){
      if (strcmp(liste[i],"")!=0){
	fprintf(dateiTmp,"%s\n",liste[i]);
      }//if
    }//while
  }else{//if
    //ERROR
  }

  fclose(dateiTmp);
  fclose(dateiOrg);

  rename(datei2,datei);
  zeigeEintraege();
  free(datei);
  free(datei2);

  return;
}




eOSState cProjektBearbeiten::ProcessKey(eKeys Key){

  eOSState state = cOsdMenu::ProcessKey(Key);

  cProjektBearbeitenItem *item = (cProjektBearbeitenItem*)Get(Current());

  if (state == osUnknown) {
    switch (Key) {
    case kRed:
      if (!HasSubMenu()){
	AddSubMenu(new cMenuAufnahmeAuswahl());
      }
      break;
    case k8:
      if (!HasSubMenu())
	eintragRunter(item);
      break;
    case k2:
      if (!HasSubMenu())
	eintragHoch(item);
      break;
    case kYellow:
      if (item)
	eintragLoeschen(item);
      break;
    default:
      break;
    }//switch
  }//if

  //Die Zeilen sind notwendig, damit neu hinzugefügte Einträge auch sichtbar sind
  // wenns eine bessere Lösung gibt, nur her damit.
  if (HasSubMenu()){
    tmp=1;
  }
  if ((tmp==1)&&(!HasSubMenu())){
    zeigeEintraege();
    tmp=0;
  }

  return state;
}

void cProjektBearbeiten::SetHelp() {
  cOsdMenu::SetHelp(tr("add"),NULL,tr("del"),NULL);
}
