from typing import assert_type
from uuid import UUID
from sqlmodel import Field as SQLField
from fastsprout.core import ReadField
from fastsprout.data.backend.sql import SQLEntity
from fastsprout.data.backend.sql import SQLSignpost
from fastsprout.testing.data import TestSQLite, TestPostgreSQL, TestSQLDatabase, TestMySQL, TestMariaDB, TestOracle

class CRM(SQLSignpost): ...

class IntegerRecord(SQLEntity[int]):
    id: ReadField[int] = SQLField(primary_key=True)

class UUIDRecord(SQLEntity[UUID]):
    id: ReadField[UUID] = SQLField(primary_key=True)

assert_type(TestSQLite(IntegerRecord, UUIDRecord), TestSQLDatabase[SQLSignpost])

assert_type(TestSQLite(), TestSQLDatabase[SQLSignpost])
assert_type(TestSQLite(signpost=CRM), TestSQLDatabase[CRM])

async def context() -> None:
    async with TestSQLite(signpost=CRM) as database:
        assert_type(database, TestSQLDatabase[CRM])
        assert_type(database.signpost, CRM)

async def postgres() -> None:
    async with TestPostgreSQL(signpost=CRM) as database:
        assert_type(database, TestSQLDatabase[CRM])
        assert_type(database.signpost, CRM)

async def mysql() -> None:
    async with TestMySQL(signpost=CRM) as database:
        assert_type(database, TestSQLDatabase[CRM])
        assert_type(database.signpost, CRM)
    async with TestMySQL() as default_database:
        assert_type(default_database, TestSQLDatabase[SQLSignpost])

async def mariadb() -> None:
    async with TestMariaDB(signpost=CRM) as database:
        assert_type(database, TestSQLDatabase[CRM])
        assert_type(database.signpost, CRM)
    async with TestMariaDB() as default_database:
        assert_type(default_database, TestSQLDatabase[SQLSignpost])

async def oracle() -> None:
    async with TestOracle(signpost=CRM) as database:
        assert_type(database, TestSQLDatabase[CRM])
        assert_type(database.signpost, CRM)
    async with TestOracle() as default_database:
        assert_type(default_database, TestSQLDatabase[SQLSignpost])
