//
// Created by koncord on 15.01.16.
//

#include "Packets/PacketPosition.hpp"
#include "Packets/PacketBaseInfo.hpp"
#include "components/openmw-mp/Packets/PacketEquiped.hpp"
#include "Packets/PacketAttributesAndStats.hpp"
#include "Packets/PacketAttack.hpp"
#include "Packets/PacketMainStats.hpp"
#include "Packets/PacketResurrect.hpp"
#include "Packets/PacketDie.hpp"
#include "Packets/PacketCell.hpp"
#include "Packets/PacketSendMyID.hpp"
#include "Packets/PacketDisconnect.hpp"
#include "Packets/PacketDrawState.hpp"
#include "Packets/PacketChatMessage.hpp"
#include "Packets/PacketCharGen.hpp"
#include "Packets/PacketAttribute.hpp"
#include "Packets/PacketSkill.hpp"
#include "Packets/PacketHandshake.hpp"
#include "Packets/PacketGUIBoxes.hpp"

#include "PacketsController.hpp"


mwmp::PacketsController::PacketsController(RakNet::RakPeerInterface *peer)
{
    packetPosition = new PacketPosition(peer);
    packetCell = new PacketCell(peer);
    packetBaseInfo = new PacketBaseInfo(peer);
    packetEquiped = new PacketEquiped(peer);
    attributesAndStats = new PacketAttributesAndStats(peer);
    packetAttack = new PacketAttack(peer);
    packetMainStats = new PacketMainStats(peer);
    packetResurrect = new PacketResurrect(peer);
    packetDie = new PacketDie(peer);
    packetDrawState = new PacketDrawState(peer);

    packetSendMyID = new PacketSendMyID(peer);
    packetDisconnect = new PacketDisconnect(peer);

    packetChatMessage = new PacketChatMessage(peer);
    packetCharGen = new PacketCharGen(peer);

    packetAttribute = new PacketAttribute(peer);
    packetSkill = new PacketSkill(peer);

    packetHandshake = new PacketHandshake(peer);

    packetGUIBoxes = new PacketGUIBoxes(peer);
}


mwmp::BasePacket *mwmp::PacketsController::GetPacket(RakNet::MessageID id)
{
    BasePacket * packet;
    switch (id)
    {
        case ID_GAME_UPDATE_POS:
            packet = packetPosition;
            break;
        case ID_GAME_CELL:
            packet = packetCell;
            break;
        case ID_GAME_BASE_INFO:
            packet = packetBaseInfo;
            break;
        case ID_GAME_UPDATE_EQUIPED:
            packet = packetEquiped;
            break;
        case ID_GAME_UPDATE_SKILLS:
            packet = attributesAndStats;
            break;
        case ID_GAME_ATTACK:
            packet = packetAttack;
            break;
        case ID_GAME_UPDATE_BASESTATS:
            packet = packetMainStats;
            break;
        case ID_GAME_RESURRECT:
            packet = packetResurrect;
            break;
        case ID_GAME_DIE:
            packet = packetDie;
            break;
        case ID_GAME_DRAWSTATE:
            packet = packetDrawState;
            break;
        case ID_USER_MYID:
            packet = packetSendMyID;
            break;
        case ID_USER_DISCONNECTED:
            packet = packetDisconnect;
            break;
        case ID_CHAT_MESSAGE:
            packet = packetChatMessage;
            break;
        case ID_GAME_CHARGEN:
            packet = packetCharGen;
            break;
        case ID_GAME_ATTRIBUTE:
            packet = packetAttribute;
            break;
        case ID_GAME_SKILL:
            packet = packetSkill;
            break;
        case ID_HANDSHAKE:
            packet = packetHandshake;
            break;
        case ID_GUI_MESSAGEBOX:
            packet = packetGUIBoxes;
            break;
        default:
            packet = 0;
    }
    return packet;
}

void mwmp::PacketsController::SetStream(RakNet::BitStream *inStream, RakNet::BitStream *outStream)
{
    packetPosition->SetStreams(inStream, outStream);
    packetCell->SetStreams(inStream, outStream);
    packetBaseInfo->SetStreams(inStream, outStream);
    packetEquiped->SetStreams(inStream, outStream);
    attributesAndStats->SetStreams(inStream, outStream);
    packetAttack->SetStreams(inStream, outStream);
    packetMainStats->SetStreams(inStream, outStream);
    packetResurrect->SetStreams(inStream, outStream);
    packetDie->SetStreams(inStream, outStream);
    packetDrawState->SetStreams(inStream, outStream);

    packetSendMyID->SetStreams(inStream, outStream);
    packetDisconnect->SetStreams(inStream, outStream);

    packetChatMessage->SetStreams(inStream, outStream);
    packetCharGen->SetStreams(inStream, outStream);

    packetAttribute->SetStreams(inStream, outStream);
    packetSkill->SetStreams(inStream, outStream);

    packetHandshake->SetStreams(inStream, outStream);

    packetGUIBoxes->SetStreams(inStream, outStream);
}