from mdk.types.context import StateController, StateScope, TranslationMode
from mdk.types.expressions import Expression
from mdk.types.specifier import TypeSpecifier
from mdk.types.enums import StateType, MoveType, PhysicsType
from mdk.resources.animation import Animation
from typing import Callable

__all__ = ['build', 'library', 'statedef', 'create_statedef', 'template', 'trigger']

def build(def_file: str, output: str, run_mtl: bool = True, skip_templates: bool = False, locations: bool = True, compress: bool = False, preserve_ir: bool = False, target_folder: str = "mdk-out", debug_build: bool = False) -> None: ...
def library(inputs: list[Callable[..., None]], dirname: str = '', output: str | None = None, locations: bool = True) -> None: ...
def statefunc(mode: TranslationMode = TranslationMode.STANDARD) -> Callable[[Callable[..., None]], Callable[..., None]]: ...
def statedef(type: StateType | None = ..., movetype: MoveType | None = ..., physics: PhysicsType | None = ..., anim: int | Animation | None = None, velset: tuple[float, float] | None = None, ctrl: bool | None = None, poweradd: int | None = None, juggle: int | None = None, facep2: bool | None = None, hitdefpersist: bool | None = None, movehitpersist: bool | None = None, hitcountpersist: bool | None = None, sprpriority: int | None = None, stateno: int | None = None, scope: StateScope | None = None, mode: TranslationMode = TranslationMode.STANDARD) -> Callable[[Callable[[], None]], Callable[..., StateController]]: ...
def create_statedef(fn: Callable[[], None], type: Expression = ..., movetype: Expression = ..., physics: Expression = ..., anim: int | Animation | None = None, velset: tuple[float, float] | None = None, ctrl: bool | None = None, poweradd: int | None = None, juggle: int | None = None, facep2: bool | None = None, hitdefpersist: bool | None = None, movehitpersist: bool | None = None, hitcountpersist: bool | None = None, sprpriority: int | None = None, stateno: int | None = None, scope: StateScope | None = None, mode: TranslationMode = TranslationMode.STANDARD) -> Callable[..., StateController]: ...
def template(inputs: list[TypeSpecifier] = [], library: str | None = None, validator: Callable[..., dict[str, Expression]] | None = None) -> Callable[[Callable[..., None]], Callable[..., StateController]]: ...
def trigger(inputs: list[TypeSpecifier], result: TypeSpecifier, library: str | None = None, validator: Callable[..., dict[str, Expression]] | None = None) -> Callable[[Callable[..., Expression]], Callable[..., Expression]]: ...

class ControllerProps:
    def __init__(self, ignorehitpause: Expression | bool | None = None, persistent: Expression | int | None = None): ...
    def __enter__(self) -> ControllerProps: ...
    def __exit__(self, exc_type, exc_val, exc_tb) -> bool: ...