//
// Created by hoelshare on 22.05.17.
//

#include "GameClient.hpp"

void GameClient::createUIGameStart() {
    if (this->playerList) {
        this->playerList->Clear();
        Serial.println("GameClient::createUIGameStart - Clear");
    } else {
        this->playerList = new PlayerListMenu(9);
    }
    Serial.println("GameClient::createUIGameStart - new PlayerListMenu");
    playerList->setLeftAction([=]() { this->player->prevWeapon(); });
    playerList->setRightAction([=]() { this->player->nextWeapon(); });
    playerList->setDownAction([=]() { this->player->reload(); });
    playerList->setEnterAction([=]() { this->player->shot(); });
    Serial.println("GameClient::createUIGameStart - set Lambdas");
    LaserMenuItem *healthMI = new LaserMenuItem([]() {}, "/heart.bmp");
    LaserMenuItem *armorMI = new LaserMenuItem([]() {}, "/armor.bmp");
    LaserMenuItem *ammoMI = new LaserMenuItem([]() {}, "/ammo1.bmp");
    LaserMenuItem *nameMI = new LaserMenuItem([]() {}, nullptr);
    player->setHealthMenuItem(healthMI);
    player->setArmorMenuItem(armorMI);
    player->setAmmoMenuItem(ammoMI);
    playerList->addMenuItem(healthMI);
    playerList->addMenuItem(armorMI);
    playerList->addMenuItem(ammoMI);
    playerList->addMenuItem(nameMI);
    Serial.println("GameClient::createUIGameStart - added Lambdas");
    nameMI->setText(player->getNickname());
    Serial.println("GameClient::createUIGameStart - set Nickname");
    playerList->setDirty();
    reopen = true;
    Serial.println("GameClient::createUIGameStart - Ende");
}


void GameClient::startGame() {
    Serial.println("GameClient::startGame()");
    this->createUIGameStart();
    Serial.println("GameClient::startGame() - Ende");
}


void GameClient::joinGame(String ip) {
    badge->setVibrator(true);
    delay(200);
    badge->setVibrator(false);

    playerList->addMenuItem(new MenuItem(player->getNickname(), []() {}));

    ui->dispatchInput(badge->getJoystickState());
    ui->open(playerList);
    ui->draw();


    Serial.printf("Conn data:\n\tip: %s\n\tport: %d\n", ip.c_str(), SERVER_PORT);

    //client->connect(ip.c_str(), SERVER_PORT);
    Serial.printf("Trying to conncet!\n");
    if (!client->connect("192.168.42.175", 4803)){
        Serial.printf("Connect failed!\n");
    }
    Serial.printf("client->connect\n");
    client->print(player->getNickname());
    Serial.printf("client->print nickname\n");
    client->flush();
    Serial.printf("client->flush");

    Serial.printf("Receiving");
    String recv = client->readStringUntil('\n');
    Serial.printf("RECV: %s", recv.c_str());
}


void GameClient::update() {
    Serial.println("GameClient - Update");
    if(reopen) {
        reopen = false;
        ui->open(playerList);
    }
//    String lastHitBy;
//    int lastDamage;
//
//    if (wasHit(&lastHitBy, &lastDamage)){
//        player->hit(lastDamage);
//
//        tft.setCursor(20, 20);
//        tft.print("Hit by " + lastHitBy);
//    }

    Serial.println("GameClient - Update - Ende");
}

bool GameClient::wasHit(String* nick, int* damage, bool enable) {
    // TODO: Write 'real' code
    *nick = "otter";
    *damage = 10;

    return enable;

}