# 一个简单的项目实践测试
from pathlib import Path
from Musicreater import load_plugin_from_module, MusiCreater
from Musicreater.plugins import _global_plugin_registry

load_plugin_from_module("Musicreater.builtin_plugins.midi_read")

from Musicreater.builtin_plugins.midi_read import MidiImportConfig

print("当前支持的导入格式：", _global_plugin_registry.supported_input_formats())
print("当前支持的导出格式：", _global_plugin_registry.supported_output_formats())

print(msct := MusiCreater.import_music(Path("./resources/测试片段.mid")))

print(msct.music)

# 如果要直接访问插件里面的函数：
# 为了确保类型安全，以下方法不建议使用，因为这本质上是越过了 MusiCreater 类而直接执行插件的函数
print(t := msct.midi_to_music_plugin.load(Path("./resources/测试片段.mid"), None))  # type: ignore
# 我们建议用这种方式来代替
t = _global_plugin_registry._music_input_plugins["midi_to_music_plugin"].load(
    Path("./resources/测试片段.mid"),
    MidiImportConfig(
        speed_multiplier=1.0,
    ),
)
# 或者
from Musicreater.plugins import MusicInputPluginBase

if isinstance((p := msct.midi_to_music_plugin), MusicInputPluginBase):
    t = p.load(Path("./resources/测试片段.mid"), None)

# 但是说实话，既然已经在 MusiCreater 类中提供了
# import_music、export_music、perform_operation_on_music 等方法，
# 那么我们不建议使用上面展示的调取插件的方式来执行插件内的函数。
msct.perform_operation_on_music

print(_global_plugin_registry)
print(msct._plugin_cache)
