use anyhow::Result;

#[cfg(windows)]
pub fn main(_socket: &str) -> Result<()> {
    // It looks like we can't get an async stdio stream on Windows from smol.
    panic!("--nc isn't yet supported on Windows");
}

/// The main function for when Zed is running in netcat mode
#[cfg(not(windows))]
pub fn main(socket: &str) -> Result<()> {
    use futures::{AsyncReadExt as _, AsyncWriteExt as _, FutureExt as _, io::BufReader, select};
    use net::async_net::UnixStream;
    use smol::{Unblock, io::AsyncBufReadExt};

    smol::block_on(async {
        let socket_stream = UnixStream::connect(socket).await?;
        let (socket_read, mut socket_write) = socket_stream.split();
        let mut socket_reader = BufReader::new(socket_read);

        let mut stdout = Unblock::new(std::io::stdout());
        let stdin = Unblock::new(std::io::stdin());
        let mut stdin_reader = BufReader::new(stdin);

        let mut socket_line = Vec::new();
        let mut stdin_line = Vec::new();

        loop {
            select! {
                bytes_read = socket_reader.read_until(b'\n', &mut socket_line).fuse() => {
                    if bytes_read? == 0 {
                        break
                    }
                    stdout.write_all(&socket_line).await?;
                    stdout.flush().await?;
                    socket_line.clear();
                }
                bytes_read = stdin_reader.read_until(b'\n', &mut stdin_line).fuse() => {
                    if bytes_read? == 0 {
                        break
                    }
                    socket_write.write_all(&stdin_line).await?;
                    socket_write.flush().await?;
                    stdin_line.clear();
                }
            }
        }

        anyhow::Ok(())
    })
}
