Font_Lib = {
    "HZK12": {"size": 12, "desc": "宋体优化"},
    "HZK16": {"size": 16, "desc": "宋体优化"},
    "HZK32": {"size": 32, "desc": "宋体优化"},
    "HZK16S": {"size": 16, "desc": "宋体"},
    "HZK16F": {"size": 16, "desc": "仿宋"},
    "HZK16H": {"size": 16, "desc": "黑体"},
    "HZK16K": {"size": 16, "desc": "楷体"},
    "HZK16Y": {"size": 16, "desc": "幼圆"},
    "HZK16L": {"size": 16, "desc": "隶书(效果较差)"},
    "HZK16C": {"size": 16, "desc": "粗体"},
    "HZK16X": {"size": 16, "desc": "细"},
    "HZK16V": {"size": 16, "desc": "繁"},
    "HZK24F": {"size": 24, "desc": "仿宋汉字打印点阵"},
    "HZK24H": {"size": 24, "desc": "黑体汉字打印点阵"},
    "HZK24K": {"size": 24, "desc": "楷体汉字打印点阵"},
    "HZK24S": {"size": 24, "desc": "宋体汉字打印点阵"},
    "HZK24T": {"size": 24, "desc": "宋体符号打印点阵"},
    "HZK40S": {"size": 40, "desc": "宋体汉字"},
    "HZK40T": {"size": 40, "desc": "宋体符号"},
    "HZK48S": {"size": 48, "desc": "宋体汉字"},
    "HZK48T": {"size": 48, "desc": "宋体符号"},
}


class ChineseFontLibrary:
    def __init__(self, name, path="./font_lib/"):
        self.size = Font_Lib.get(name)['size']
        self.path = path
        self.fontname = name
        self.chinese_array = []
        self.linecache = self.size * ((self.size + 7) // 8 * 8) // 8

    def format_chinese_array_as_text(self):
        text_output = "#pragma once\n\n"
        text_output += "#ifndef HW_LIB_FONT_CHUC_H\n"
        text_output += "#define HW_LIB_FONT_CHUC_H\n\n"
        text_output += f"typedef struct {{\n"
        text_output += "    uint8_t unicode[2];\n"
        text_output += f"    uint8_t data[{self.size * ((self.size + 7) // 8 * 8) // 8}];\n"
        text_output += "} Chinese_t;\n\n"
        text_output += f"static uint8_t Hzk_size={self.size};\n\n"
        text_output += "static Chinese_t Hzk[] = {\n"
        line_size = self.size * self.size // 8
        line_size = line_size // 2
        for item in self.chinese_array:
            unicode_hex = ', '.join(f"0x{ord(char) >> 8:02X}, 0x{ord(char) & 0xFF:02X}" for char in item['name'])
            print(unicode_hex, end=",")
            text_output += f"    {{\n        // Original: {item['name']}\n"
            text_output += f"        {{ {unicode_hex} }},\n        {{\n            "
            bytes_str = ', '.join(f"0x{byte:02X}" for byte in item['data'])
            bytes_lines = [bytes_str[i:i + 6 * line_size] for i in range(0, len(bytes_str), 6 * line_size)]
            # 每行显示line_size个字节
            text_output += '\n            '.join(bytes_lines)
            text_output += ",\n        }\n    },\n"
        text_output += "};\n\n"
        text_output += "static Chinese_t* find_chinese_data(uint8_t unicode_high, uint8_t unicode_low) {\n"
        text_output += "    for (int i = 0; i < sizeof(Hzk) / sizeof(Chinese_t); ++i) {\n"
        text_output += "        if (Hzk[i].unicode[0] == unicode_high && Hzk[i].unicode[1] == unicode_low) {\n"
        text_output += "            return &Hzk[i];\n"
        text_output += "        }\n"
        text_output += "    }\n"
        text_output += "    return NULL;\n"
        text_output += "}\n"
        text_output += "\n#endif //HW_LIB_FONT_CHUC_H"
        return text_output

    def generate_chinese_struct(self, code):
        incode = code.encode('gb2312')  # 要读出的汉字
        qh, wh = incode[0] - 0xa0, incode[1] - 0xa0  # 占两个字节, 取其区位号
        offset = (94 * (qh - 1) + (wh - 1)) * self.linecache  # 得到偏移位置
        with open(self.path + self.fontname, "rb") as HZK:
            HZK.seek(offset)
            return HZK.read(self.linecache)

    def add_chinese_array(self, input_str: str):
        for char_code in input_str:
            char_struct = self.generate_chinese_struct(char_code)
            self.chinese_array.append({'name': char_code, 'data': char_struct})
        return self

    def write_chinese_array_output(self, filename='font_chuc.h'):
        text_output = self.format_chinese_array_as_text()
        with open(filename, 'w', encoding="utf8") as file:
            file.write(text_output)


if __name__ == '__main__':
    i = 0
    for k, v in Font_Lib.items():
        print(f"{i}:{k} - {v['size']} {v['desc']}")
        i += 1

    input_c = input(f"请输入需要的字体序号(q退出):")
    if input_c == 'q':
        exit()
    values_list = list(Font_Lib.values())
    keys_list = list(Font_Lib.keys())
    key_index = list(Font_Lib.values()).index(values_list[int(input_c)])
    print(
        f"已选择{int(input_c)}:{keys_list[key_index]} - {Font_Lib[keys_list[key_index]]['size']} {Font_Lib[keys_list[key_index]]['desc']}")
    font = ChineseFontLibrary(keys_list[key_index])
    input_c = input(f"请输入需要生成的字符(顺序无关):")
    print("将生成以下字符\n" + input_c)
    font.add_chinese_array(input_c)
    font.write_chinese_array_output()
