import { PackedMap } from "../util/PackedMap.ts";
import { cp930 } from "./cp930.ts";

export const IBMKanjiEncodeMap = new PackedMap((m) => {
  const decoder = cp930.createDecoder({ fatal: false });

  m.set(0xa6, 0x426a);
  m.set(0xa7, 0x446a);
  m.set(0xa8, 0x4460);
  m.set(0xb0, 0x44ed);
  m.set(0xb1, 0x444b);
  m.set(0xb4, 0x4450);
  m.set(0xb6, 0x4379);
  m.set(0xd7, 0x447a);
  m.set(0xf7, 0x447b);
  m.set(0x2014, 0x444a);
  m.set(0x2016, 0x447c);
  m.set(0x2212, 0x4260);
  m.set(0x301c, 0x43a1);
  m.set(0x4fe0, 0x52ec);
  m.set(0x525d, 0x5481);
  m.set(0x555e, 0x54d4);
  m.set(0x5699, 0x547d);
  m.set(0x56ca, 0x5190);
  m.set(0x5861, 0x4f5e);
  m.set(0x5c5b, 0x5443);
  m.set(0x5c62, 0x55c0);
  m.set(0x6414, 0x54a3);
  m.set(0x6451, 0x54cd);
  m.set(0x6522, 0x5b72);
  m.set(0x6805, 0x51f1);
  m.set(0x688e, 0x5bfe);
  m.set(0x6be1, 0x54d4);
  m.set(0x6d00, 0x5550);
  m.set(0x6f51, 0x54fa);
  m.set(0x7006, 0x5550);
  m.set(0x70ff, 0x52ec);
  m.set(0x7130, 0x53ee);
  m.set(0x7626, 0x54a4);
  m.set(0x79b1, 0x5553);
  m.set(0x7c1e, 0x54ca);
  m.set(0x7e48, 0x60f1);
  m.set(0x7e61, 0x52da);
  m.set(0x7e6b, 0x5373);
  m.set(0x8141, 0x61b0);
  m.set(0x8346, 0x53b3);
  m.set(0x840a, 0x52c9);
  m.set(0x841d, 0x53e8);
  m.set(0x841f, 0x52a1);
  m.set(0x8523, 0x53f8);
  m.set(0x87ec, 0x53e8);
  m.set(0x881f, 0x52a1);
  m.set(0x8ec0, 0x5353);
  m.set(0x8f91, 0x446e);
  m.set(0x91ac, 0x507f);
  m.set(0x91b1, 0x51fa);
  m.set(0x92ca, 0x547d);
  m.set(0x9830, 0x4eb3);
  m.set(0x9839, 0x66c8);
  m.set(0x985a, 0x55c1);
  m.set(0x9a52, 0x53da);
  m.set(0x9b7e, 0x53da);
  m.set(0x9dd7, 0x5464);
  m.set(0x9e7c, 0x4c7d);
  m.set(0x9eb4, 0x5261);
  m.set(0x9eb5, 0x555f);
  m.set(0xf86f, 0x446e);

  const buf = new Uint8Array(4);
  buf[0] = 0x0e;
  buf[3] = 0x0f;
  for (let hb = 0x40; hb <= 0xfe; hb++) {
    buf[1] = hb;
    for (let lb = 0x40; lb <= 0xfe; lb++) {
      buf[2] = lb;

      const decoded = decoder.decode(buf);
      if (decoded && decoded !== "\uFFFD") {
        m.set(decoded.charCodeAt(0), (hb << 8) | lb);
      }
    }
  }
});
