Documentation
use std::io::Write;

use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize)]
pub struct File {
    fileName: String,

    pointer: Option<usize>,
    nameLength: Option<usize>,
    filePnLength: Option<usize>,
    filePn: Option<usize>,
    fileLength: Option<usize>,
    fileCrc: Option<usize>,
    expansionPoint2: Option<Vec<u8>>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct Files {
    basePath: String,
    numberOfDataFiles: Option<usize>,
    files: Vec<File>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct TargetHwId {
    idLength: Option<usize>,
    id: String,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct SoftwareInformations {
    loadPnLength: Option<usize>,
    loadPn: String,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct HardwareInformations {
    numberOfTargetHwIds: Option<usize>,
    targets: Vec<TargetHwId>,
}

#[derive(Debug, Deserialize, Serialize)]
pub enum FormatVersion {}

#[derive(Debug, Deserialize, Serialize)]
pub struct Header {
    headerFileLength: Option<usize>,
    loadFileFormatVersion: Option<usize>,
    pointerToLoadPartNumberLength: Option<usize>,
    pointerToTargetHwIdList: Option<usize>,
    pointerToDataFileList: Option<usize>,
    pointerToSupportFileList: Option<usize>,
    pointerToUserDefinedData: Option<usize>,
    expansionPoint1: Option<Vec<u8>>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct FileItems {
    data: Files,
    support: Files,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct AdditionnalInformations {
    expansionPoint4: Option<Vec<u8>>,
    userDefinedData: Option<Vec<u8>>,
    headerFileCrc: Option<Vec<u8>>,
    load_crc: Option<Vec<u8>>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct LUH {
    header: Header,
    software: SoftwareInformations,
    hardware: HardwareInformations,
    files: FileItems,
    additionnal_informations: AdditionnalInformations,
}

impl LUH {

    fn pointer_to_support_file_list() {
        
    }

    pub fn to_writer(&self, mut o: impl Write) -> Vec<u8> {
        let output = vec![];

        // output.append(self.header.pn);
        
        o.write(&output).expect("failed to write");
        output
    }
}