/*
 * cdda_conf.c: The music playlist manager
 *
 * See the README file for copyright information and how to reach the author.
 *
 * $Id: cdda_playlist.c,v 1.1.1.2 2005/06/27 13:34:02 cm Exp $
 */

#include "cdda_playlist.h"
#include "cdda_device.h"

// --- cCddaPlaylistItem--------------------------------------------------------

cCddaPlaylistItem::cCddaPlaylistItem(unsigned char Key) {
  key = Key;
}

cCddaPlaylistItem::~cCddaPlaylistItem() {
}

unsigned char cCddaPlaylistItem::SetKey(unsigned char Key) {
  return key = Key;
}

// --- cCddaPlaylist -----------------------------------------------------------

cCddaPlaylist::cCddaPlaylist() {
  playlistType = ptAll;
  po_currentItem = NULL;
}

cCddaPlaylist::~cCddaPlaylist() {
  po_currentItem = NULL;

  if (0 != cList<cCddaPlaylistItem>::Count())
    Clear();
}

cCddaPlaylistItem *cCddaPlaylist::Previous(cCddaPlaylistItem *item, bool set) {
  cCddaPlaylistItem *po_item = NULL;

  if (NULL == item)
    po_item = cList<cCddaPlaylistItem>::Prev(po_currentItem);
  else
    po_item = cList<cCddaPlaylistItem>::Prev(item);

  if (set && NULL != po_item)
    po_currentItem = po_item;

  return po_item;
}

cCddaPlaylistItem *cCddaPlaylist::Next(cCddaPlaylistItem *item, bool set) {
  cCddaPlaylistItem *po_item = NULL;

  if (NULL == item)
    po_item = cList<cCddaPlaylistItem>::Next(po_currentItem);
  else
    po_item = cList<cCddaPlaylistItem>::Next(item);

  if (set && NULL != po_item)
    po_currentItem = po_item;

  return po_item;
}

cCddaPlaylistItem *cCddaPlaylist::GetByKey(unsigned int key) {
  cCddaPlaylistItem *po_item = NULL;

  for (po_item = First(); NULL != po_item; po_item = Next(po_item)) {
    if (key == po_item->GetKey())
      break;
  }

  return po_item;
}

cCddaPlaylistItem *cCddaPlaylist::GetCurrent(void) {
  if (NULL == po_currentItem && 0 < cList<cCddaPlaylistItem>::Count())
    po_currentItem = cList<cCddaPlaylistItem>::First();

  return po_currentItem;
}

bool cCddaPlaylist::SetCurrent(int index) {
  if (0 <= index && index < cList<cCddaPlaylistItem>::Count())
    po_currentItem = cList<cCddaPlaylistItem>::Get(index);
  else
    return false;

  return true;
}

cCddaPlaylistItem *cCddaPlaylist::Add(void) {
  cCddaPlaylistItem *po_item = new cCddaPlaylistItem();

  if (NULL != po_item)
    cList<cCddaPlaylistItem>::Add(po_item);

  return po_item;
}

bool cCddaPlaylist::Remove(int index) {
  cCddaPlaylistItem *po_item = NULL;

  po_item = cList<cCddaPlaylistItem>::Get(index);

  if (NULL != po_item) {
    cList<cCddaPlaylistItem>::Del(po_item);
    po_item = NULL;
  } else
    return false;

  return true;
}

void cCddaPlaylist::Clear(void) {
  po_currentItem = NULL;
  cList<cCddaPlaylistItem>::Clear();
}

bool cCddaPlaylist::Load(unsigned int start, unsigned int first, unsigned int last) {
  unsigned int i = 0;

  switch (playlistType) {
    case ptSingle:
      Add()->SetKey(start);
      SetCurrent(0);
      break;
    case ptProgram:
      if (0 < cList<cCddaPlaylistItem>::Count()) {
        SetCurrent(0);
        break;
      }
      // fall through when type==ptProgram and no track is added to playlist
    case ptAll:
      for (i = first; i <= last; i++)
        Add()->SetKey(i);
      SetCurrent(start-1);
      break;
  }

  return true;
}

ePlaylistType cCddaPlaylist::SetType(ePlaylistType type) {
  return playlistType = type;
}
