#!/usr/bin/env python3
"""Extract verified MIDI files from MIDDATA.MLK.

Format (little-endian):
  offset 0x00: u8   count (observed 20). NB: no ASCII magic.
  offset 0x01: entries, 9 bytes each:
      [1] u8  flag (1 = normal, 0 = also valid MIDI; meaning TBD)
      [4] u32 offset
      [4] u32 size
  Body: standard SMF (Format 0) MIDI streams starting at 0x01 + count*9.
         Each payload begins with the usual "MThd" header.

The output filenames use the same zero-based EXE ids used by the game:
`00.mid`..`19.mid`.
"""
import os, sys
from pathlib import Path

from audio_archive_manifest import load_mlk_archive

def extract(src, dst):
    path = Path(src)
    d = path.read_bytes()
    manifest = load_mlk_archive(path)
    os.makedirs(dst, exist_ok=True)
    for entry in manifest["entries"]:
        i = entry["exeIndex"]
        off = entry["offset"]
        size = entry["payloadBytes"]
        payload = d[off:off+size]
        with open(os.path.join(dst, f'{i:02d}.mid'), 'wb') as f:
            f.write(payload)
    flags = ', '.join(f'{flag}:{count}' for flag, count in sorted(manifest["entryFlagCounts"].items()))
    print(f'extracted {manifest["count"]} verified mid files -> {dst}/ (entry flags {flags})')

if __name__ == '__main__':
    src = sys.argv[1] if len(sys.argv) > 1 else 'MIDDATA.MLK'
    dst = sys.argv[2] if len(sys.argv) > 2 else 'extract_mlk'
    extract(src, dst)
