#include <ctype.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cMenuAufnahmeAuswahl.h"
#include "config.h"
#include <vdr/interface.h>

// --- cMenuAufnahmeAuswahlItem ----------------------------------------------------

class cMenuAufnahmeAuswahlItem : public cOsdItem {
private:
  char *fileName;
  char *name;
  int totalEntries, newEntries;
public:
  cMenuAufnahmeAuswahlItem(cRecording *Recording, int Level);
  ~cMenuAufnahmeAuswahlItem();
  void IncrementCounter(bool New);
  const char *Name(void) { return name; }
  const char *FileName(void) { return fileName; }
  bool IsDirectory(void) { return name != NULL; }
  };

cMenuAufnahmeAuswahlItem::cMenuAufnahmeAuswahlItem(cRecording *Recording, int Level)
{
  fileName = strdup(Recording->FileName());
  name = NULL;
  totalEntries = newEntries = 0;
  SetText(Recording->Title('\t', true, Level));
  if (*Text() == '\t')
     name = strdup(Text() + 2); // 'Text() + 2' to skip the two '\t'
}

cMenuAufnahmeAuswahlItem::~cMenuAufnahmeAuswahlItem()
{
  free(fileName);
  free(name);
}

void cMenuAufnahmeAuswahlItem::IncrementCounter(bool New)
{
  totalEntries++;
  if (New)
     newEntries++;
  char *buffer = NULL;
  asprintf(&buffer, "%d\t%d\t%s", totalEntries, newEntries, name);
  SetText(buffer, false);
}

// --- cMenuAufnahmeAuswahl -------------------------------------------------------
//angepasste Kopie vom vdr

cRecordings cMenuAufnahmeAuswahl::Recordings;
int cMenuAufnahmeAuswahl::helpKeys = -1;

cMenuAufnahmeAuswahl::cMenuAufnahmeAuswahl(const char *Base, int Level, bool OpenSubMenus)
:cOsdMenu(Base ? Base : tr("Recordings"), 6, 6)
{
  base = Base ? strdup(Base) : NULL;
  level = Setup.RecordingDirs ? Level : -1;
  Display(); // this keeps the higher level menus from showing up briefly when pressing 'Back' during replay
  if (!Base)
     Skins.Message(mtStatus, tr("scanning recordings..."));
  bool Loaded = Base || Recordings.Load();
  if (!Base)
     Skins.Message(mtStatus, NULL);
  if (Loaded) {
     cMenuAufnahmeAuswahlItem *LastItem = NULL;
     char *LastItemText = NULL;
     for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) {
         if (!Base || (strstr(recording->Name(), Base) == recording->Name() && recording->Name()[strlen(Base)] == '~')) {
            cMenuAufnahmeAuswahlItem *Item = new cMenuAufnahmeAuswahlItem(recording, level);
            if (*Item->Text() && (!LastItem || strcmp(Item->Text(), LastItemText) != 0)) {
               Add(Item);
               LastItem = Item;
               free(LastItemText);
               LastItemText = strdup(LastItem->Text()); // must use a copy because of the counters!
               }
            else
               delete Item;
            if (LastItem) {
	      SetCurrent(LastItem);
	      if (LastItem->IsDirectory())
		LastItem->IncrementCounter(recording->IsNew());
	    }
	 }
         }
     free(LastItemText);
     if (Current() < 0)
        SetCurrent(First());
     else if (OpenSubMenus && Open(true))
        return;
     }
  SetHelpKeys();
}

cMenuAufnahmeAuswahl::~cMenuAufnahmeAuswahl()
{
  helpKeys = -1;
  free(base);
}

void cMenuAufnahmeAuswahl::SetHelpKeys(void)
{
  cMenuAufnahmeAuswahlItem *ri = (cMenuAufnahmeAuswahlItem *)Get(Current());
  int NewHelpKeys = helpKeys;
  if (ri) {
    if (ri->IsDirectory())
      NewHelpKeys = 1;
    else {
      NewHelpKeys = 2;
    }
    if (NewHelpKeys != helpKeys) {
      switch (NewHelpKeys) {
      case 0: SetHelp(NULL); break;
      case 1: SetHelp(tr("open")); break;
      case 2: SetHelp(tr("add"));
      }
      helpKeys = NewHelpKeys;
    }
  }
}

bool cMenuAufnahmeAuswahl::Open(bool OpenSubMenus)
{
  cMenuAufnahmeAuswahlItem *ri = (cMenuAufnahmeAuswahlItem *)Get(Current());
  if (ri && ri->IsDirectory()) {
     const char *t = ri->Name();
     char *buffer = NULL;
     if (base) {
        asprintf(&buffer, "%s~%s", base, t);
        t = buffer;
        }
     AddSubMenu(new cMenuAufnahmeAuswahl(t, level + 1, OpenSubMenus));
     free(buffer);
     return true;
     }
  return false;
}

void cMenuAufnahmeAuswahl::Hinzufuegen(cMenuAufnahmeAuswahlItem *ri)
{
  char *datei;
  asprintf(&datei,"%s",VdrconvertSetup.gibDateiname(VdrconvertSetup.aktProjekttyp));
  FILE *fi = fopen (datei, "a");
  fprintf(fi,"%s\n",ri->FileName());
  fflush(fi);
  fclose(fi);
  free(datei);
  return;
}

eOSState cMenuAufnahmeAuswahl::ProcessKey(eKeys Key)
{

  eOSState state = cOsdMenu::ProcessKey(Key);
  cMenuAufnahmeAuswahlItem *ri = (cMenuAufnahmeAuswahlItem *)Get(Current());

  if (state == osUnknown) {
     switch (Key) {
       case kOk:
       case kRed:
	 if (ri ){
	   if(ri->IsDirectory()) {
	     Open(true);
	   }else{
	     if (Interface->Confirm(tr("really add?"))){
	       Hinzufuegen(ri);
	       state=osBack;
	     }
	   }
	 }
	 break;
       default: break;
       }
     }
  if (!HasSubMenu() && Key != kNone)
    SetHelpKeys();
  return state;
}
