#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>

enum SceneState {
    STATE_INIT,
    STATE_SELECT_SERVER,
    STATE_SELECT_CHANNEL,
    STATE_LOBBY,
    STATE_WAIT_ROOM,
    STATE_GAME_PLAY,
    STATE_EXIT
};

void LogOutput(const std::string& scene, const std::string& msg, const std::string& type = "Normal") {
    std::cout << "[" << scene << "] ";
    if (type == "Error") std::cout << "❌ [ERROR] ";
    else if (type == "Warning") std::cout << "⚠️ [WARN] ";
    else if (type == "Packet") std::cout << "🌐 [PACKET] ";
    else std::cout << "⚙️ ";
    
    std::cout << msg << std::endl;
}

struct UserSession {
    std::string nick;
    int grade;
    int userIndex;
};

class KeroroGameEngine {
private:
    SceneState currentScene; 
    UserSession session;
    bool isRunning;

public:
    KeroroGameEngine() {
        currentScene = STATE_INIT;
        isRunning = true;
        session.nick = "Liebe"; 
        session.grade = 18;
        session.userIndex = 142;
        srand(static_cast<unsigned int>(time(NULL)));
    }

    void UpdateEngine() {
        if (currentScene == STATE_INIT) {
            LogOutput("Init", "Engine Kernel Creation Succeeded....");
            LogOutput("Init", "Best BackBuffer Format : X8R8G8B8 (DirectX 9)");
            LogOutput("Init", "Sound System Initialized (fmod.dll)");
            LogOutput("Init", "can't load file : ( Property/Script/FileLocation_Entity.xml )", "Error");
            LogOutput("Init", "Requesting Auth Code...", "Packet");
            currentScene = STATE_SELECT_SERVER;
        }
        else if (currentScene == STATE_SELECT_SERVER) {
            LogOutput("Server", "Connecting to Gateway Server...", "Packet");
            LogOutput("Server", "ServerNo [1] MaxUser [1400] NowUser [57]");
            currentScene = STATE_SELECT_CHANNEL;
        }
        else if (currentScene == STATE_SELECT_CHANNEL) {
            LogOutput("Channel", "cNetGDMS::ChannelInfo() Received", "Packet");
            LogOutput("Channel", "Ch [1]: Novice Channel 1 (49 Users) | Ch [2]: Free Channel 1 (1 User)");
            std::cout << "[Auth] ⚙️ Login Success! Welcome " << session.nick << " (Grade: " << session.grade << ")" << std::endl;
            currentScene = STATE_LOBBY;
        }
        else if (currentScene == STATE_LOBBY) {
            LogOutput("Lobby", "Entering CGameScene_LobbyExtension...");
            LogOutput("Lobby", "Still Has no Myuser info", "Warning");
            LogOutput("Lobby", "Room [5] 'The Very Last' (Solo Match)", "Packet");
            LogOutput("Lobby", "Room [10] 'Let's Fight' (Team Match)", "Packet");
            LogOutput("Lobby", "Joining Room 10...");
            currentScene = STATE_WAIT_ROOM;
        }
        else if (currentScene == STATE_WAIT_ROOM) {
            LogOutput("WaitRoom", "Joined Room 10.");
            std::cout << "[WaitRoom] ⚙️ [Member] " << session.nick << " (Me) - Ready" << std::endl;
            LogOutput("WaitRoom", "[Member] Eun-Byul-Chan (Host) - Ready", "Packet");
            std::cout << "\n=============================================\n";
            std::cout << "      🚀 GAME START - Loading Map...         \n";
            std::cout << "=============================================\n\n";
            currentScene = STATE_GAME_PLAY;
        }
        else if (currentScene == STATE_GAME_PLAY) {
            LogOutput("Game", "Loading Map Resource: [TF_File/My_Room_ball_TF.TF]");
            std::string battleActions[4];
            battleActions[0] = "Keroro Combo Attack connected successfully!";
            battleActions[1] = "Ultimate Skill [Lightning Strike] triggered!";
            battleActions[2] = "Enemy's dash attack successfully blocked!";
            battleActions[3] = "Weapon item acquired!";
            for(int i = 0; i < 3; ++i) {
                std::cout << " -> " << battleActions[rand() % 4] << std::endl;
            }
            std::cout << "\n---------------------------------------------\n";
            LogOutput("Game", "CGameScene_GamePlay::End - destroyUI");
            LogOutput("Game", "GameManager : remove complete cached Scene");
            currentScene = STATE_EXIT;
        }
        else if (currentScene == STATE_EXIT) {
            isRunning = false;
        }
    }

    void Run() {
        std::cout << "=== ONLINE C++ KERORO FIGHTER SIMULATOR ===\n\n";
        while (isRunning) {
            UpdateEngine();
        }
        std::cout << "\n=============================================\n";
        std::cout << "  Client terminated normally. (SUCCESS)       \n";
        std::cout << "=============================================\n";
    }
};

int main() {
    KeroroGameEngine engine;
    engine.Run();
    return 0;
}