use std::io::Write;

const HEADER_SIZE: usize = 8;

#[derive(Debug)]
struct Header {
    chunk_size: u32,
}

#[derive(Debug)]
pub struct CompressedTrainingDataFileWriter<T: Write> {
    file: T,
}

impl<T: Write> CompressedTrainingDataFileWriter<T> {
    pub fn new(file: T) -> std::io::Result<Self> {
        Ok(Self { file })
    }

    pub fn into_inner(self) -> std::io::Result<T> {
        Ok(self.file)
    }

    pub fn append(&mut self, data: &[u8]) -> std::io::Result<()> {
        let header = Header {
            chunk_size: data.len() as u32,
        };
        self.write_chunk_header(&header)?;
        self.file.write_all(data)?;
        Ok(())
    }

    fn write_chunk_header(&mut self, header: &Header) -> std::io::Result<()> {
        let mut buf = [0u8; HEADER_SIZE];
        buf[0] = b'B';
        buf[1] = b'I';
        buf[2] = b'N';
        buf[3] = b'P';
        buf[4] = (header.chunk_size & 0xFF) as u8;
        buf[5] = ((header.chunk_size >> 8) & 0xFF) as u8;
        buf[6] = ((header.chunk_size >> 16) & 0xFF) as u8;
        buf[7] = ((header.chunk_size >> 24) & 0xFF) as u8;
        self.file.write_all(&buf)
    }
}
