import pytest
from nonebug.app import App
from nonebot.compat import model_dump

from .utils import get_json


@pytest.mark.usefixtures("_clear_db")
async def test_subs_export(app: App, init_scheduler):
    from nonebot_plugin_saa import TargetQQGroup

    from nonebot_bison.config.db_config import config
    from nonebot_bison.types import Target as TTarget
    from nonebot_bison.config.db_model import User, Cookie
    from nonebot_bison.config.subs_io import subscribes_export

    await config.add_subscribe(
        TargetQQGroup(group_id=1232),
        target=TTarget(TTarget("weibo_id")),
        target_name="weibo_name",
        platform_name="weibo",
        cats=[],
        tags=[],
    )
    await config.add_subscribe(
        TargetQQGroup(group_id=2342),
        target=TTarget(TTarget("weibo_id")),
        target_name="weibo_name",
        platform_name="weibo",
        cats=[],
        tags=["kaltsit", "amiya"],
    )
    await config.add_subscribe(
        TargetQQGroup(group_id=2342),
        target=TTarget("bilibili_id"),
        target_name="bilibili_name",
        platform_name="bilibili",
        cats=[1, 2],
        tags=[],
    )
    cookie_id = await config.add_cookie(
        Cookie(
            site_name="weibo.com",
            content='{"cookie": "test"}',
            cookie_name="test cookie",
        )
    )
    await config.add_cookie_target(TTarget("weibo_id"), "weibo", cookie_id)

    data = await config.list_subs_with_all_info()
    assert len(data) == 3

    nbesf_data = await subscribes_export(lambda x: x)
    assert model_dump(nbesf_data) == get_json("v3/subs_export.json")

    nbesf_data_user_234 = await subscribes_export(
        lambda stmt: stmt.where(User.user_target == {"platform_type": "QQ Group", "group_id": 2342})
    )
    assert len(nbesf_data_user_234.groups) == 1
    assert len(nbesf_data_user_234.groups[0].subs) == 2
    assert model_dump(nbesf_data_user_234.groups[0].user_target) == {
        "group_id": 2342,
        "platform_type": "QQ Group",
    }


async def test_subs_import(app: App, init_scheduler):
    from nonebot_bison.config.db_config import config
    from nonebot_bison.config.subs_io import subscribes_import
    from nonebot_bison.config.subs_io.nbesf_model import v1, v2

    # v1
    nbesf_data_v1 = v1.nbesf_parser(get_json("v1/subs_export.json"))

    await subscribes_import(nbesf_data_v1)

    data = await config.list_subs_with_all_info()
    assert len(data) == 3

    # v2
    nbesf_data_v2 = v2.nbesf_parser(get_json("v2/subs_export.json"))

    await subscribes_import(nbesf_data_v2)
    data = await config.list_subs_with_all_info()
    assert len(data) == 6


async def test_subs_import_dup_err(app: App, init_scheduler):
    from nonebot_bison.config.db_config import config
    from nonebot_bison.config.subs_io import subscribes_import
    from nonebot_bison.config.subs_io.nbesf_model import v1, v2

    # v1
    nbesf_data_v1 = v1.nbesf_parser(get_json("v1/subs_export_has_subdup_err.json"))

    await subscribes_import(nbesf_data_v1)

    data = await config.list_subs_with_all_info()

    assert len(data) == 4

    # v2
    nbesf_data_v2 = v2.nbesf_parser(get_json("v2/subs_export_has_subdup_err.json"))

    await subscribes_import(nbesf_data_v2)

    data = await config.list_subs_with_all_info()

    assert len(data) == 8


async def test_subs_import_version_disorder(app: App, init_scheduler):
    from nonebot_bison.config.subs_io import subscribes_import
    from nonebot_bison.config.subs_io.utils import NBESFParseErr
    from nonebot_bison.config.subs_io.nbesf_model import v1, v2, v3

    # use v1 parse v2
    with pytest.raises(NBESFParseErr):
        v1.nbesf_parser(get_json("v2/subs_export_has_subdup_err.json"))
    # use v1 parse v3
    with pytest.raises(NBESFParseErr):
        v1.nbesf_parser(get_json("v3/subs_export_has_subdup_err.json"))

    # use v2 parse v1
    with pytest.raises(NBESFParseErr):
        v2.nbesf_parser(get_json("v1/subs_export_has_subdup_err.json"))
    # # use v2 parse v3
    # with pytest.raises(NBESFParseErr):
    #     v2.nbesf_parser(get_json("v3/subs_export_has_subdup_err.json"))

    # use v3 parse v1
    with pytest.raises(NBESFParseErr):
        v3.nbesf_parser(get_json("v1/subs_export_has_subdup_err.json"))
    # # use v3 parse v2
    # with pytest.raises(NBESFParseErr):
    #     v3.nbesf_parser(get_json("v2/subs_export_has_subdup_err.json"))
    # TODO: v3 parse v2 不会报错,但是v3 parse v1 会报错,似乎是有问题 (

    with pytest.raises(AssertionError):  # noqa: PT012
        nbesf_data = v2.nbesf_parser(get_json("v2/subs_export_has_subdup_err.json"))
        nbesf_data.version = 1
        await subscribes_import(nbesf_data)


async def test_subs_import_all_fail(app: App, init_scheduler):
    """只要文件格式有任何一个错误, 都不会进行订阅"""
    from nonebot_bison.config.subs_io.nbesf_model import v1, v2, v3
    from nonebot_bison.config.subs_io.nbesf_model.v1 import NBESFParseErr

    with pytest.raises(NBESFParseErr):
        v1.nbesf_parser(get_json("v1/subs_export_all_illegal.json"))

    with pytest.raises(NBESFParseErr):
        v2.nbesf_parser(get_json("v2/subs_export_all_illegal.json"))

    with pytest.raises(NBESFParseErr):
        v3.nbesf_parser(get_json("v3/subs_export_all_illegal.json"))