/*
 *  Copyright (C) 2004-2023 Savoir-faire Linux Inc.
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program. If not, see <https://www.gnu.org/licenses/>.
 */
#pragma once

#include <memory>
#include <functional>
#include <chrono>

#if defined(_MSC_VER)
#include <BaseTsd.h>
using ssize_t = SSIZE_T;
#endif

namespace dhtnet {

class IceTransport;
using IceRecvCb = std::function<ssize_t(unsigned char* buf, size_t len)>;

class IceSocket
{
private:
    std::shared_ptr<IceTransport> ice_transport_ {};
    int compId_ = -1;

public:
    IceSocket(std::shared_ptr<IceTransport> iceTransport, int compId)
        : ice_transport_(std::move(iceTransport))
        , compId_(compId)
    {}

    void close();
    ssize_t send(const unsigned char* buf, size_t len);
    ssize_t waitForData(std::chrono::milliseconds timeout);
    void setOnRecv(IceRecvCb cb);
    uint16_t getTransportOverhead();
    void setDefaultRemoteAddress(const IpAddr& addr);
    int getCompId() const { return compId_; };
};

}; // namespace jami
