#pragma once
#include "Stream.h"
#include "backend/TtyImpl.h"

namespace panda { namespace unievent {

struct ITtyListener     : IStreamListener     {};
struct ITtySelfListener : IStreamSelfListener {};

struct Tty : virtual Stream {
    using TtyImpl = backend::TtyImpl;
    using Mode       = TtyImpl::Mode;
    using WinSize    = TtyImpl::WinSize;

    static const HandleType TYPE;

    static void reset_mode ();

    Tty (fd_t fd, const LoopSP& loop = Loop::default_loop());

    const HandleType& type () const override;

    fd_t fd () const { return _fd; }

    excepted<net::SockAddr, ErrorCode> sockaddr () const override { return {}; }
    excepted<net::SockAddr, ErrorCode> peeraddr () const override { return {}; }

    virtual excepted<void, ErrorCode>    set_mode(Mode);
    virtual excepted<WinSize, ErrorCode> get_winsize ();

protected:
    StreamSP create_connection () override;
    void     on_reset          () override;

private:
    fd_t _fd;

    TtyImpl*    impl     () const { return static_cast<TtyImpl*>(BackendHandle::impl()); }
    HandleImpl* new_impl () override;
};
using TtySP = iptr<Tty>;

}}