/*
 *  IXConnectionState.h
 *  Author: Benjamin Sergeant
 *  Copyright (c) 2019 Machine Zone, Inc. All rights reserved.
 */

#pragma once

#include <atomic>
#include <cstdint>
#include <functional>
#include <memory>
#include <string>

namespace ix
{
    using OnSetTerminatedCallback = std::function<void()>;

    class ConnectionState
    {
    public:
        ConnectionState();
        virtual ~ConnectionState() = default;

        virtual void computeId();
        virtual const std::string& getId() const;

        void setTerminated();
        bool isTerminated() const;

        const std::string& getRemoteIp();
        int getRemotePort();

        static std::shared_ptr<ConnectionState> createConnectionState();

    private:
        void setOnSetTerminatedCallback(const OnSetTerminatedCallback& callback);

        void setRemoteIp(const std::string& remoteIp);
        void setRemotePort(int remotePort);

    protected:
        std::atomic<bool> _terminated;
        std::string _id;
        OnSetTerminatedCallback _onSetTerminatedCallback;

        static std::atomic<uint64_t> _globalId;

        std::string _remoteIp;
        int _remotePort;

        friend class SocketServer;
    };
} // namespace ix