import sys
from typing import Final, type_check_only

if sys.platform == "win32":
    class MSIError(Exception): ...
    # Actual typename View, not exposed by the implementation
    @type_check_only
    class _View:
        def Execute(self, params: _Record | None = ...) -> None: ...
        def GetColumnInfo(self, kind: int) -> _Record: ...
        def Fetch(self) -> _Record: ...
        def Modify(self, mode: int, record: _Record) -> None: ...
        def Close(self) -> None: ...
        # Don't exist at runtime
        __new__: None  # type: ignore[assignment]
        __init__: None  # type: ignore[assignment]

    # Actual typename SummaryInformation, not exposed by the implementation
    @type_check_only
    class _SummaryInformation:
        def GetProperty(self, field: int) -> int | bytes | None: ...
        def GetPropertyCount(self) -> int: ...
        def SetProperty(self, field: int, value: int | str) -> None: ...
        def Persist(self) -> None: ...
        # Don't exist at runtime
        __new__: None  # type: ignore[assignment]
        __init__: None  # type: ignore[assignment]

    # Actual typename Database, not exposed by the implementation
    @type_check_only
    class _Database:
        def OpenView(self, sql: str) -> _View: ...
        def Commit(self) -> None: ...
        def GetSummaryInformation(self, updateCount: int) -> _SummaryInformation: ...
        def Close(self) -> None: ...
        # Don't exist at runtime
        __new__: None  # type: ignore[assignment]
        __init__: None  # type: ignore[assignment]

    # Actual typename Record, not exposed by the implementation
    @type_check_only
    class _Record:
        def GetFieldCount(self) -> int: ...
        def GetInteger(self, field: int) -> int: ...
        def GetString(self, field: int) -> str: ...
        def SetString(self, field: int, str: str) -> None: ...
        def SetStream(self, field: int, stream: str) -> None: ...
        def SetInteger(self, field: int, int: int) -> None: ...
        def ClearData(self) -> None: ...
        # Don't exist at runtime
        __new__: None  # type: ignore[assignment]
        __init__: None  # type: ignore[assignment]

    def UuidCreate() -> str: ...
    def FCICreate(cabname: str, files: list[tuple[str, str]], /) -> None: ...
    def OpenDatabase(path: str, persist: int, /) -> _Database: ...
    def CreateRecord(count: int, /) -> _Record: ...

    MSICOLINFO_NAMES: Final[int]
    MSICOLINFO_TYPES: Final[int]
    MSIDBOPEN_CREATE: Final[int]
    MSIDBOPEN_CREATEDIRECT: Final[int]
    MSIDBOPEN_DIRECT: Final[int]
    MSIDBOPEN_PATCHFILE: Final[int]
    MSIDBOPEN_READONLY: Final[int]
    MSIDBOPEN_TRANSACT: Final[int]
    MSIMODIFY_ASSIGN: Final[int]
    MSIMODIFY_DELETE: Final[int]
    MSIMODIFY_INSERT: Final[int]
    MSIMODIFY_INSERT_TEMPORARY: Final[int]
    MSIMODIFY_MERGE: Final[int]
    MSIMODIFY_REFRESH: Final[int]
    MSIMODIFY_REPLACE: Final[int]
    MSIMODIFY_SEEK: Final[int]
    MSIMODIFY_UPDATE: Final[int]
    MSIMODIFY_VALIDATE: Final[int]
    MSIMODIFY_VALIDATE_DELETE: Final[int]
    MSIMODIFY_VALIDATE_FIELD: Final[int]
    MSIMODIFY_VALIDATE_NEW: Final[int]

    PID_APPNAME: Final[int]
    PID_AUTHOR: Final[int]
    PID_CHARCOUNT: Final[int]
    PID_CODEPAGE: Final[int]
    PID_COMMENTS: Final[int]
    PID_CREATE_DTM: Final[int]
    PID_KEYWORDS: Final[int]
    PID_LASTAUTHOR: Final[int]
    PID_LASTPRINTED: Final[int]
    PID_LASTSAVE_DTM: Final[int]
    PID_PAGECOUNT: Final[int]
    PID_REVNUMBER: Final[int]
    PID_SECURITY: Final[int]
    PID_SUBJECT: Final[int]
    PID_TEMPLATE: Final[int]
    PID_TITLE: Final[int]
    PID_WORDCOUNT: Final[int]
