#include "GameOverState.hxx"
#include "GameStateManager.hxx"

#include "HighScoreManager.hxx"
#include "../SDLRenderer.hxx"

GameOverState::GameOverState()
    :font_{"kenney_pixel.ttf"}
{
}

void GameOverState::on_enter(GameStateManager& gsm)
{
  SDL_ShowCursor(SDL_ENABLE);

  if (HighScoreManager::instance().has_new_score()) {
    name_input_.set_focus(true);
    name_input_.set_value("Anon");
    name_input_.set_visible(true);
  }
  else {
    name_input_.set_focus(false);
    name_input_.set_value("");
    name_input_.set_visible(false);
  }

  ok_button_.set_on_click([&gsm, this] {
    HighScoreManager::instance().provide_name_for_new_score(name_input_.value());
    gsm.replace_state(GameStates::MainMenu);
  });
}

void GameOverState::on_leave()
{
  SDL_StopTextInput();
  SDL_ShowCursor(SDL_DISABLE);
}

void GameOverState::on_event(GameStateManager& gsm, SDL_Event const& evt)
{
  name_input_.on_event(evt);

  if (evt.type==SDL_KEYUP) {
    switch (evt.key.keysym.scancode) {
    default:
      break;
    case SDL_SCANCODE_RETURN:
      HighScoreManager::instance().provide_name_for_new_score(name_input_.value());
      [[fallthrough]];
    case SDL_SCANCODE_ESCAPE:
      gsm.replace_state(GameStates::MainMenu);
      break;
    }
  }
}

void GameOverState::update(GameStateManager& gsm, std::chrono::milliseconds const delta_time)
{
  ok_button_.update();
  name_input_.update(delta_time);
}

void GameOverState::render(SDLRenderer& renderer)
{
  int width, height;
  SDL_GetRendererOutputSize(renderer, &width, &height);

  SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
  SDL_RenderClear(renderer);

  int base_y;
  auto const& hsm = HighScoreManager::instance();
  if (hsm.has_new_score()) {
    auto const score_text = "Congratulations, you made it to the top 10!\nYou reached "
        +std::to_string(hsm.get_new_score())
        +" points!\nPlease enter your name:";
    SDL_Surface* text_surface = TTF_RenderText_Solid_Wrapped(font_, score_text.c_str(),
        {255, 255, 255, SDL_ALPHA_OPAQUE}, 0);
    SDL_Texture* text = SDL_CreateTextureFromSurface(renderer, text_surface);
    SDL_FreeSurface(text_surface);
    int text_width, text_height;
    SDL_QueryTexture(text, nullptr, nullptr, &text_width, &text_height);
    // some up-scaling
    text_width *= 2;
    text_height *= 2;

    base_y = (height-(text_height+name_input_.get_bounding_box().h+ok_button_.get_bounding_box().h+30))/2;

    SDL_Rect render_quad = {(width-text_width)/2, base_y, text_width, text_height};
    SDL_RenderCopy(renderer, text, nullptr, &render_quad);
    SDL_DestroyTexture(text);

    name_input_.move((width-name_input_.get_bounding_box().w)/2, base_y += (text_height+20));
    name_input_.render(renderer);
    base_y += name_input_.get_bounding_box().h+10;
  }
  else {
    SDL_Surface* text_surface = TTF_RenderText_Solid(font_, "Game over!", {255, 255, 255, SDL_ALPHA_OPAQUE});
    SDL_Texture* text = SDL_CreateTextureFromSurface(renderer, text_surface);
    SDL_FreeSurface(text_surface);
    int text_width, text_height;
    SDL_QueryTexture(text, nullptr, nullptr, &text_width, &text_height);
    // some up-scaling
    text_width *= 2;
    text_height *= 2;

    base_y = (height-(text_height+ok_button_.get_bounding_box().h+20))/2;

    SDL_Rect render_quad = {(width-text_width)/2, base_y, text_width, text_height};
    SDL_RenderCopy(renderer, text, nullptr, &render_quad);
    SDL_DestroyTexture(text);

    base_y += text_height+20;
  }

  ok_button_.move((width-ok_button_.get_bounding_box().w)/2, base_y);
  ok_button_.render(renderer);

  SDL_RenderPresent(renderer);
}