// Copyright 2026 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

///|
/// Meta record entry.
pub struct MetaRecord {
  tag : @common.Tag
  data : Bytes
} derive(Show, ToJson)

///|
/// Parsed meta table.
pub struct MetaTable {
  version : Int
  flags : Int
  records : Array[MetaRecord]
} derive(Show, ToJson)

///|
/// Parse meta table bytes.
pub fn MetaTable::parse(data : BytesView) -> Result[MetaTable, SfntError] {
  let version = read_u32_int(data, 0)
  let flags = read_u32_int(data, 4)
  let map_offset = read_u32_int(data, 8)
  let map_count = read_u32_int(data, 12)
  match (version, flags, map_offset, map_count) {
    (Err(err), _, _, _) => Err(err)
    (_, Err(err), _, _) => Err(err)
    (_, _, Err(err), _) => Err(err)
    (_, _, _, Err(err)) => Err(err)
    (Ok(version), Ok(flags), Ok(map_offset), Ok(map_count)) => {
      if map_offset < 0 || map_count < 0 {
        return Err(InvalidFormat)
      }
      let offset = map_offset
      let count = map_count
      let table_len = data.length()
      if offset + count * 12 > table_len {
        return Err(UnexpectedEof)
      }
      let records : Array[MetaRecord] = []
      for i in 0.. return Err(err)
          (_, Err(err)) => return Err(err)
          (Ok(data_offset), Ok(data_length)) => {
            if data_offset < 0 || data_length < 0 {
              return Err(InvalidFormat)
            }
            let start = data_offset
            let end = start + data_length
            if end > table_len {
              return Err(UnexpectedEof)
            }
            let bytes : Array[Byte] = []
            for j in start.. Bytes? {
  for record in self.records {
    if record.tag == tag {
      return Some(record.data)
    }
  }
  None
}