//
// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

#include "OSWindow.h"

#include <iostream>
#include <sstream>

#include "common/debug.h"

#ifndef DEBUG_EVENTS
#define DEBUG_EVENTS 0
#endif

#if DEBUG_EVENTS
static const char *MouseButtonName(MouseButton button)
{
    switch (button)
    {
      case MOUSEBUTTON_UNKNOWN:
        return "Unknown";
      case MOUSEBUTTON_LEFT:
        return "Left";
      case MOUSEBUTTON_RIGHT:
        return "Right";
      case MOUSEBUTTON_MIDDLE:
        return "Middle";
      case MOUSEBUTTON_BUTTON4:
        return "Button4";
      case MOUSEBUTTON_BUTTON5:
        return "Button5";
      default:
        UNREACHABLE();
        return nullptr;
    }
}

static const char *KeyName(Key key)
{
    switch (key)
    {
      case KEY_UNKNOWN:   return "Unknown";
      case KEY_A:         return "A";
      case KEY_B:         return "B";
      case KEY_C:         return "C";
      case KEY_D:         return "D";
      case KEY_E:         return "E";
      case KEY_F:         return "F";
      case KEY_G:         return "G";
      case KEY_H:         return "H";
      case KEY_I:         return "I";
      case KEY_J:         return "J";
      case KEY_K:         return "K";
      case KEY_L:         return "L";
      case KEY_M:         return "M";
      case KEY_N:         return "N";
      case KEY_O:         return "O";
      case KEY_P:         return "P";
      case KEY_Q:         return "Q";
      case KEY_R:         return "R";
      case KEY_S:         return "S";
      case KEY_T:         return "T";
      case KEY_U:         return "U";
      case KEY_V:         return "V";
      case KEY_W:         return "W";
      case KEY_X:         return "X";
      case KEY_Y:         return "Y";
      case KEY_Z:         return "Z";
      case KEY_NUM0:      return "Num0";
      case KEY_NUM1:      return "Num1";
      case KEY_NUM2:      return "Num2";
      case KEY_NUM3:      return "Num3";
      case KEY_NUM4:      return "Num4";
      case KEY_NUM5:      return "Num5";
      case KEY_NUM6:      return "Num6";
      case KEY_NUM7:      return "Num7";
      case KEY_NUM8:      return "Num8";
      case KEY_NUM9:      return "Num9";
      case KEY_ESCAPE:    return "Escape";
      case KEY_LCONTROL:  return "Left Control";
      case KEY_LSHIFT:    return "Left Shift";
      case KEY_LALT:      return "Left Alt";
      case KEY_LSYSTEM:   return "Left System";
      case KEY_RCONTROL:  return "Right Control";
      case KEY_RSHIFT:    return "Right Shift";
      case KEY_RALT:      return "Right Alt";
      case KEY_RSYSTEM:   return "Right System";
      case KEY_MENU:      return "Menu";
      case KEY_LBRACKET:  return "Left Bracket";
      case KEY_RBRACKET:  return "Right Bracket";
      case KEY_SEMICOLON: return "Semicolon";
      case KEY_COMMA:     return "Comma";
      case KEY_PERIOD:    return "Period";
      case KEY_QUOTE:     return "Quote";
      case KEY_SLASH:     return "Slash";
      case KEY_BACKSLASH: return "Backslash";
      case KEY_TILDE:     return "Tilde";
      case KEY_EQUAL:     return "Equal";
      case KEY_DASH:      return "Dash";
      case KEY_SPACE:     return "Space";
      case KEY_RETURN:    return "Return";
      case KEY_BACK:      return "Back";
      case KEY_TAB:       return "Tab";
      case KEY_PAGEUP:    return "Page Up";
      case KEY_PAGEDOWN:  return "Page Down";
      case KEY_END:       return "End";
      case KEY_HOME:      return "Home";
      case KEY_INSERT:    return "Insert";
      case KEY_DELETE:    return "Delete";
      case KEY_ADD:       return "Add";
      case KEY_SUBTRACT:  return "Substract";
      case KEY_MULTIPLY:  return "Multiply";
      case KEY_DIVIDE:    return "Divide";
      case KEY_LEFT:      return "Left";
      case KEY_RIGHT:     return "Right";
      case KEY_UP:        return "Up";
      case KEY_DOWN:      return "Down";
      case KEY_NUMPAD0:   return "Numpad 0";
      case KEY_NUMPAD1:   return "Numpad 1";
      case KEY_NUMPAD2:   return "Numpad 2";
      case KEY_NUMPAD3:   return "Numpad 3";
      case KEY_NUMPAD4:   return "Numpad 4";
      case KEY_NUMPAD5:   return "Numpad 5";
      case KEY_NUMPAD6:   return "Numpad 6";
      case KEY_NUMPAD7:   return "Numpad 7";
      case KEY_NUMPAD8:   return "Numpad 8";
      case KEY_NUMPAD9:   return "Numpad 9";
      case KEY_F1:        return "F1";
      case KEY_F2:        return "F2";
      case KEY_F3:        return "F3";
      case KEY_F4:        return "F4";
      case KEY_F5:        return "F5";
      case KEY_F6:        return "F6";
      case KEY_F7:        return "F7";
      case KEY_F8:        return "F8";
      case KEY_F9:        return "F9";
      case KEY_F10:       return "F10";
      case KEY_F11:       return "F11";
      case KEY_F12:       return "F12";
      case KEY_F13:       return "F13";
      case KEY_F14:       return "F14";
      case KEY_F15:       return "F15";
      case KEY_PAUSE:     return "Pause";
      default:            return "Unknown Key";
    }
}

static std::string KeyState(const Event::KeyEvent &event)
{
    if (event.Shift || event.Control || event.Alt || event.System)
    {
        std::ostringstream buffer;
        buffer << " [";

        if (event.Shift)
        {
            buffer << "Shift";
        }
        if (event.Control)
        {
            buffer << "Control";
        }
        if (event.Alt)
        {
            buffer << "Alt";
        }
        if (event.System)
        {
            buffer << "System";
        }

        buffer << "]";
        return buffer.str();
    }
    return "";
}

static void PrintEvent(const Event& event)
{
    switch (event.Type)
    {
      case Event::EVENT_CLOSED:
        std::cout << "Event: Window Closed" << std::endl;
        break;
      case Event::EVENT_MOVED:
        std::cout << "Event: Window Moved (" << event.Move.X
                  << ", " << event.Move.Y << ")" << std::endl;
        break;
      case Event::EVENT_RESIZED:
        std::cout << "Event: Window Resized (" << event.Size.Width
                  << ", " << event.Size.Height << ")" << std::endl;
        break;
      case Event::EVENT_LOST_FOCUS:
        std::cout << "Event: Window Lost Focus" << std::endl;
        break;
      case Event::EVENT_GAINED_FOCUS:
        std::cout << "Event: Window Gained Focus" << std::endl;
        break;
      case Event::EVENT_TEXT_ENTERED:
        // TODO(cwallez) show the character
        std::cout << "Event: Text Entered" << std::endl;
        break;
      case Event::EVENT_KEY_PRESSED:
        std::cout << "Event: Key Pressed (" << KeyName(event.Key.Code) << KeyState(event.Key) << ")" << std::endl;
        break;
      case Event::EVENT_KEY_RELEASED:
        std::cout << "Event: Key Released (" << KeyName(event.Key.Code) << KeyState(event.Key) << ")" << std::endl;
        break;
      case Event::EVENT_MOUSE_WHEEL_MOVED:
        std::cout << "Event: Mouse Wheel (" << event.MouseWheel.Delta << ")" << std::endl;
        break;
      case Event::EVENT_MOUSE_BUTTON_PRESSED:
        std::cout << "Event: Mouse Button Pressed " << MouseButtonName(event.MouseButton.Button) <<
                  " at (" << event.MouseButton.X << ", " << event.MouseButton.Y << ")" << std::endl;
        break;
      case Event::EVENT_MOUSE_BUTTON_RELEASED:
        std::cout << "Event: Mouse Button Released " << MouseButtonName(event.MouseButton.Button) <<
                  " at (" << event.MouseButton.X << ", " << event.MouseButton.Y << ")" << std::endl;
        break;
      case Event::EVENT_MOUSE_MOVED:
        std::cout << "Event: Mouse Moved (" << event.MouseMove.X
                  << ", " << event.MouseMove.Y << ")" << std::endl;
        break;
      case Event::EVENT_MOUSE_ENTERED:
        std::cout << "Event: Mouse Entered Window" << std::endl;
        break;
      case Event::EVENT_MOUSE_LEFT:
        std::cout << "Event: Mouse Left Window" << std::endl;
        break;
      case Event::EVENT_TEST:
        std::cout << "Event: Test" << std::endl;
        break;
      default:
        UNREACHABLE();
        break;
    }
}
#endif

OSWindow::OSWindow()
    : mX(0),
      mY(0),
      mWidth(0),
      mHeight(0)
{
}

OSWindow::~OSWindow()
{}

int OSWindow::getX() const
{
    return mX;
}

int OSWindow::getY() const
{
    return mY;
}

int OSWindow::getWidth() const
{
    return mWidth;
}

int OSWindow::getHeight() const
{
    return mHeight;
}

bool OSWindow::popEvent(Event *event)
{
    if (mEvents.size() > 0 && event)
    {
        *event = mEvents.front();
        mEvents.pop_front();
        return true;
    }
    else
    {
        return false;
    }
}

void OSWindow::pushEvent(Event event)
{
    switch (event.Type)
    {
      case Event::EVENT_MOVED:
        mX = event.Move.X;
        mY = event.Move.Y;
        break;
      case Event::EVENT_RESIZED:
        mWidth = event.Size.Width;
        mHeight = event.Size.Height;
        break;
      default:
        break;
    }

    mEvents.push_back(event);

#if DEBUG_EVENTS
    PrintEvent(event);
#endif
}

bool OSWindow::didTestEventFire()
{
    Event topEvent;
    while (popEvent(&topEvent))
    {
        if (topEvent.Type == Event::EVENT_TEST)
        {
            return true;
        }
    }

    return false;
}
