#include "exam_pop_up_controller.h"
#include "apps_container.h"
#include <apps/i18n.h>
#include "global_preferences.h"
#include <assert.h>

ExamPopUpController::ExamPopUpController(ExamPopUpControllerDelegate * delegate) :
  ViewController(nullptr),
  m_contentView(this),
  m_isActivatingExamMode(false),
  m_delegate(delegate)
{
}

void ExamPopUpController::setActivatingExamMode(bool activatingExamMode) {
  if (m_isActivatingExamMode != activatingExamMode) {
    m_isActivatingExamMode = activatingExamMode;
    m_contentView.setMessages(activatingExamMode);
  }
}

View * ExamPopUpController::view() {
  return &m_contentView;
}

void ExamPopUpController::viewDidDisappear() {
  if (m_isActivatingExamMode == false) {
    m_delegate->examDeactivatingPopUpIsDismissed();
  }
}

void ExamPopUpController::didBecomeFirstResponder() {
  m_contentView.setSelectedButton(0, app());
}

bool ExamPopUpController::handleEvent(Ion::Events::Event event) {
  if (event == Ion::Events::Left && m_contentView.selectedButton() == 1) {
    m_contentView.setSelectedButton(0, app());
    return true;
  }
  if (event == Ion::Events::Right && m_contentView.selectedButton() == 0) {
    m_contentView.setSelectedButton(1, app());
    return true;
  }
  return false;
}

ExamPopUpController::ContentView::ContentView(Responder * parentResponder) :
  m_cancelButton(parentResponder, I18n::Message::Cancel, Invocation([](void * context, void * sender) {
    ExamPopUpController * controller = (ExamPopUpController *)context;
    Container * container = (Container *)controller->app()->container();
    container->activeApp()->dismissModalViewController();
    return true;
  }, parentResponder), KDFont::SmallFont),
  m_okButton(parentResponder, I18n::Message::Ok, Invocation([](void * context, void * sender) {
    ExamPopUpController * controller = (ExamPopUpController *)context;
    GlobalPreferences::ExamMode nextExamMode = controller->isActivatingExamMode() ? GlobalPreferences::ExamMode::Activate : GlobalPreferences::ExamMode::Deactivate;
    GlobalPreferences::sharedGlobalPreferences()->setExamMode(nextExamMode);
    AppsContainer * container = (AppsContainer *)controller->app()->container();
    if (controller->isActivatingExamMode()) {
      container->reset();
      Ion::LED::setColor(KDColorRed);
      Ion::LED::setBlinking(1000, 0.1f);
    } else {
      Ion::LED::setColor(KDColorBlack);
    }
    container->refreshPreferences();
    container->activeApp()->dismissModalViewController();
    return true;
  }, parentResponder), KDFont::SmallFont),
  m_warningTextView(KDFont::SmallFont, I18n::Message::Warning, 0.5, 0.5, KDColorWhite, KDColorBlack),
  m_messageTextView1(KDFont::SmallFont, I18n::Message::Default, 0.5, 0.5, KDColorWhite, KDColorBlack),
  m_messageTextView2(KDFont::SmallFont, I18n::Message::Default, 0.5, 0.5, KDColorWhite, KDColorBlack),
  m_messageTextView3(KDFont::SmallFont, I18n::Message::Default, 0.5, 0.5, KDColorWhite, KDColorBlack)
{
}

void ExamPopUpController::ContentView::drawRect(KDContext * ctx, KDRect rect) const {
  ctx->fillRect(bounds(), KDColorBlack);
}

void ExamPopUpController::ContentView::setSelectedButton(int selectedButton, App * app) {
  m_cancelButton.setHighlighted(selectedButton == 0);
  m_okButton.setHighlighted(selectedButton == 1);
  if (selectedButton == 0) {
    app->setFirstResponder(&m_cancelButton);
  } else {
    app->setFirstResponder(&m_okButton);
  }
}

int ExamPopUpController::ContentView::selectedButton() {
  if (m_cancelButton.isHighlighted()) {
    return 0;
  }
  return 1;
}

void ExamPopUpController::ContentView::setMessages(bool activingExamMode) {
  if (activingExamMode) {
    m_messageTextView1.setMessage(I18n::Message::ActiveExamModeMessage1);
    m_messageTextView2.setMessage(I18n::Message::ActiveExamModeMessage2);
    m_messageTextView3.setMessage(I18n::Message::ActiveExamModeMessage3);
  } else {
    m_messageTextView1.setMessage(I18n::Message::ExitExamMode1);
    m_messageTextView2.setMessage(I18n::Message::ExitExamMode2);
    m_messageTextView3.setMessage(I18n::Message::Default);
  }
}

int ExamPopUpController::ContentView::numberOfSubviews() const {
  return 6;
}

View * ExamPopUpController::ContentView::subviewAtIndex(int index) {
  switch (index) {
    case 0:
      return &m_warningTextView;
    case 1:
      return &m_messageTextView1;
    case 2:
      return &m_messageTextView2;
    case 3:
      return &m_messageTextView3;
    case 4:
      return &m_cancelButton;
    case 5:
      return &m_okButton;
    default:
      assert(false);
      return nullptr;
  }
}

void ExamPopUpController::ContentView::layoutSubviews() {
  KDCoordinate height = bounds().height();
  KDCoordinate width = bounds().width();
  KDCoordinate textHeight = KDFont::SmallFont->glyphSize().height();
  m_warningTextView.setFrame(KDRect(0, k_topMargin, width, textHeight));
  m_messageTextView1.setFrame(KDRect(0, k_topMargin+k_paragraphHeight+textHeight, width, textHeight));
  m_messageTextView2.setFrame(KDRect(0, k_topMargin+k_paragraphHeight+2*textHeight, width, textHeight));
  m_messageTextView3.setFrame(KDRect(0, k_topMargin+k_paragraphHeight+3*textHeight, width, textHeight));
  m_cancelButton.setFrame(KDRect(k_buttonMargin, height-k_buttonMargin-k_buttonHeight, (width-3*k_buttonMargin)/2, k_buttonHeight));
  m_okButton.setFrame(KDRect(2*k_buttonMargin+(width-3*k_buttonMargin)/2, height-k_buttonMargin-k_buttonHeight, (width-3*k_buttonMargin)/2, k_buttonHeight));
}
