///|
/// JWWファイルパーサー

///|
/// JWWシグネチャ
pub fn signature() -> Bytes {
  b"JwwData."
}

///|
/// JWWファイルをパースする
pub fn parse(data~ : Bytes) -> Document {
  // シグネチャ検証
  if data.length() < 8 {
    return Document::default()
  }
  let sig = Bytes::from_array(data.to_array()[0:8])
  if sig != signature() {
    return Document::default()
  }
  let reader = Reader::new(
    data=Bytes::from_array(data.to_array()[8:data.length()]),
  )

  // バージョン読み取り
  let version = reader.read_dword()

  // ヘッダー情報読み取り
  let memo = read_cstring(reader~)
  let paper_size = reader.read_dword()
  let write_layer_group = reader.read_dword()

  // レイヤグループ読み取り (16グループ)
  let layer_groups = Array::new()
  for _g_idx in 0..<16 {
    let state = reader.read_dword()
    let write_layer = reader.read_dword()
    let scale = reader.read_double()
    let protect = reader.read_dword()
    let layers = Array::new()
    for _l_idx in 0..<16 {
      let lay_state = reader.read_dword()
      let lay_protect = reader.read_dword()
      layers.push({ state: lay_state, protect: lay_protect, name: "" })
    }
    layer_groups.push({ state, write_layer, scale, protect, layers, name: "" })
  }

  // 印刷設定を読み取り
  let print_settings = parse_print_settings(reader~)

  // 日光設定を読み取り
  let sunpou_settings = parse_sunpou_settings(reader~)

  // レイヤ名を読み取り
  let layer_groups = parse_layer_names(reader~, layer_groups~)

  // エンティティリスト開始位置を探索
  let entity_offset = find_entity_list_offset(data~, version~)
  let (entities, block_defs, block_end_offset) = match entity_offset {
    Some(offset) => {
      let entity_result = parse_entity_list(data~, offset~, version~)
      // エンティティリストの直後にブロック定義リストがある
      let block_offset = offset + entity_result.bytes_consumed
      let block_result = parse_block_def_list(
        data~,
        offset=block_offset,
        version~,
      )
      (entity_result.entities, block_result.block_defs, block_result.end_offset)
    }
    None => (Array::new(), Array::new(), 0)
  }

  // Ver.7.00以上の場合、同梱画像をパース
  let embedded_images = if version >= 700 {
    parse_embedded_images(data~, offset=block_end_offset, version~)
  } else {
    Array::new()
  }

  // レイヤー名を設定
  let named_layer_groups = set_layer_names(layer_groups~)
  {
    version,
    memo,
    paper_size,
    write_layer_group,
    layer_groups: named_layer_groups,
    entities,
    block_defs,
    embedded_images,
    print_settings,
    sunpou_settings,
    metadata_settings: MetadataSettings::default(),
  }
}