#pragma once

#include <map>
#include <optional>
#include <string>

#include <QVector2D>

#include "GameConfig.h"
#include "ShipLayout.h"

#include "entt/entity/entity.hpp"

class EntityAdmin;

class ShipSystem
{
public:
    ShipSystem(const GameConfig& config, EntityAdmin& admin);

    entt::entity spawn(const std::string& schematicId, QVector2D position,
                       bool isEnemy = false,
                       const std::optional<ShipLayoutConfig>& layout = std::nullopt);
    void despawn(entt::entity entity);

    // Reset all movement intents to inactive before behavior systems run.
    void clearMovementIntents();

    // Set the rally point that newly spawned player combat ships will loiter at.
    void setRallyPoint(QVector2D point);

    // Release all gathered player combat ships to advance toward the enemy.
    void triggerRallyDeparture();

    // Controls whether newly spawned player ships receive a RetreatBehavior. The
    // balancing tool disables this so arena fights stay symmetric and aggressive
    // (REQ-BAL-SIM-AI); the main game keeps it enabled (REQ-SHP-RETREAT).
    void setRetreatEnabled(bool enabled);

private:
    const GameConfig& m_config;
    EntityAdmin&      m_admin;
    QVector2D         m_rallyPoint;
    bool              m_retreatEnabled = true;
};
