from ctypes import *


class Aques:
    @classmethod
    def main (cls, text: str) -> bytearray | None:
        return cls.__synthe_utf8 (text, speed = 100)

    @staticmethod
    def __synthe_utf8 (text, speed, phont_file = None) -> bytearray | None:
        if phont_file is None:
            phont = None
        else:
            with open (phont_file, 'rb') as f:
                phont = f.read ()

        aqkoe = cdll.LoadLibrary ('libAqKanji2Koe.so')
        dic_path: str = './aq_dic'
        err = c_int (0)
        aqkoe.AqKanji2Koe_Create.restype = c_void_p
        handle = aqkoe.AqKanji2Koe_Create (dic_path.encode ('utf-8'), byref (err))
        koe: str = ''
        aqkoe.AqKanji2Koe_Convert.restype = c_int
        aqkoe.AqKanji2Koe_Convert (handle, text.encode ('utf-8'), koe, 4096)

        aqtk = cdll.LoadLibrary ('libAquesTalk2Eva.so')
        aqtk.AquesTalk2_Synthe_Utf8.restype = POINTER (ARRAY (c_ubyte, 0))
        size = c_int (0)
        wav_p = aqtk.AquesTalk2_Synthe_Utf8 (koe.encode ('utf-8'), speed,
                                             byref (size), phont)

        if not bool (wav_p):
            return None

        wav_p = cast (wav_p, POINTER (ARRAY (c_ubyte, size.value)))
        wav = bytearray (wav_p.contents)
        aqtk.AquuesTalk2_FreeWave (wav_p)

        return wav

