/**
 * projectM -- Milkdrop-esque visualisation SDK
 * Copyright (C)2003-2004 projectM Team
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * See 'LICENSE.txt' included within this release
 *
 */
#include <stdio.h>

#include "Common.hpp"
#include "fatal.h"
#include "KeyHandler.hpp"
#include "event.h"
#include "BeatDetect.hpp"
#include "PresetChooser.hpp"
#include "Renderer.hpp"
#include "projectM.hpp"

#include <iostream>
#include "TimeKeeper.hpp"


void selectRandom (const bool hardCut);
void selectNext (const bool hardCut);
void selectPrevious (const bool hardCut);


class Preset;
interface_t current_interface = DEFAULT_INTERFACE;


void
refreshConsole ()
{
  switch (current_interface) {
  case MENU_INTERFACE:
    // unimplemented
    break;
  case SHELL_INTERFACE:
    // unimplemented
    break;
  case EDITOR_INTERFACE:
    // unimplemented
    break;
  case DEFAULT_INTERFACE:
    break;
  case BROWSER_INTERFACE:
    // unimplemented
    break;
  default:
    break;
  }
}

void
projectM::key_handler (
projectMEvent     event,
projectMKeycode   keycode,
projectMModifier  modifier
)
{
  switch (event) {
  case PROJECTM_KEYDOWN:

    //default_key_handler ();
    switch (current_interface) {
    case MENU_INTERFACE:
//    menu_key_handler (this, event, keycode);
      break;

    case SHELL_INTERFACE:
//    shell_key_handler ();
      break;

    case EDITOR_INTERFACE:
//    editor_key_handler (event,keycode);
      break;

    case BROWSER_INTERFACE:
//    browser_key_handler (event,keycode,modifier);
      break;

    case DEFAULT_INTERFACE:
      default_key_handler (event, keycode);
      break;

    default:
      default_key_handler (event, keycode);
      break;
    }
    break;

  default:
    break;
  }
}

void
projectM::default_key_handler (projectMEvent event, projectMKeycode keycode)
{
  switch (event) {

  case PROJECTM_KEYDOWN:

    switch (keycode) {
    case PROJECTM_K_UP:
      beatDetect->beat_sensitivity += 0.25;
      if (beatDetect->beat_sensitivity > 5.0) beatDetect->beat_sensitivity = 5.0;
      break;

    case PROJECTM_K_DOWN:
      beatDetect->beat_sensitivity -= 0.25;
      if (beatDetect->beat_sensitivity < 0) beatDetect->beat_sensitivity = 0;
      break;

    case PROJECTM_K_h:
      renderer->showhelp  = !renderer->showhelp;
      renderer->showstats = false;
      renderer->showfps   = false;
      /*  FIXME: should be 'break' here or folded into following case.  */

    case PROJECTM_K_F1:
      renderer->showhelp  = !renderer->showhelp;
      renderer->showstats = false;
      renderer->showfps   = false;
      break;

    case PROJECTM_K_y:
      this->setShuffleEnabled (!this->isShuffleEnabled());
      break;

    case PROJECTM_K_F5:
      if (!renderer->showhelp)
        renderer->showfps = !renderer->showfps;
      break;

    case PROJECTM_K_F4:
      if (!renderer->showhelp)
        renderer->showstats = !renderer->showstats;
      break;

    case PROJECTM_K_F3:
     {
      renderer->showpreset = !renderer->showpreset;
      break;
     }

    case PROJECTM_K_F2:
      renderer->showtitle = !renderer->showtitle;
      break;
#ifndef MACOS
    case PROJECTM_K_F9:
#else
    case PROJECTM_K_F8:
#endif

      renderer->studio = !renderer->studio;
      break;

    case PROJECTM_K_ESCAPE:
     {
      //          exit (1);
      break;
     }

    case PROJECTM_K_f:
      break;

    case PROJECTM_K_a:
      renderer->correction = !renderer->correction;
      break;

    case PROJECTM_K_b:
      break;

    case PROJECTM_K_n:
      selectNext (true);
      break;

    case PROJECTM_K_N:
      selectNext (false);
      break;

    case PROJECTM_K_r:
      selectRandom (true);
      break;

    case PROJECTM_K_R:
      selectRandom (false);
      break;

    case PROJECTM_K_p:
      selectPrevious (true);
      break;

    case PROJECTM_K_P:
      selectPrevious (false);
      break;

    case PROJECTM_K_l:
      renderer->noSwitch=!renderer->noSwitch;
      break;

    case PROJECTM_K_s:
      renderer->studio = !renderer->studio;

    case PROJECTM_K_i:
      break;

    case PROJECTM_K_z:
      break;

    case PROJECTM_K_0:
      //        nWaveMode=0;
      break;

    case PROJECTM_K_6:
      //        nWaveMode=6;
      break;

    case PROJECTM_K_7:
      //        nWaveMode=7;
      break;

    case PROJECTM_K_m:
      break;

    case PROJECTM_K_t:
      break;

    case PROJECTM_K_EQUALS:
    case PROJECTM_K_PLUS:
     {
      unsigned int index;

      if (selectedPresetIndex (index)) {
        const int oldRating = getPresetRating (index, HARD_CUT_RATING_TYPE);

        if (oldRating >= 6)
          break;

        const int rating = oldRating + 1;

        changePresetRating (index, rating, HARD_CUT_RATING_TYPE);
      }
      break;
     }

    case PROJECTM_K_MINUS:
     {
      unsigned int index;

      if (selectedPresetIndex (index)) {
        const int oldRating = getPresetRating (index, HARD_CUT_RATING_TYPE);

        if (oldRating <= 1)
          break;

        const int rating = oldRating - 1;

        changePresetRating (index, rating, HARD_CUT_RATING_TYPE);
      }
      break;
     }

    default:
      break;
    }
  default:
    break;
  }
}
