import json

import pytest
from fastapi.testclient import TestClient
from mealie.schema.settings import SiteSettings
from mealie.schema.theme import SiteTheme
from tests.app_routes import AppRoutes


@pytest.fixture(scope="function")
def default_settings():
    return SiteSettings().dict(by_alias=True)


@pytest.fixture(scope="session")
def default_theme():
    return SiteTheme(id=1).dict()


@pytest.fixture(scope="session")
def new_theme():
    return {
        "id": 3,
        "name": "myTestTheme",
        "colors": {
            "primary": "#E58325",
            "accent": "#00457A",
            "secondary": "#973542",
            "success": "#43A047",
            "info": "#4990BA",
            "warning": "#FF4081",
            "error": "#EF5350",
        },
    }


def test_default_settings(api_client: TestClient, api_routes: AppRoutes, default_settings):
    response = api_client.get(api_routes.site_settings)

    assert response.status_code == 200

    assert json.loads(response.content) == default_settings


def test_update_settings(api_client: TestClient, api_routes: AppRoutes, default_settings, token):
    default_settings["language"] = "fr"
    default_settings["showRecent"] = False

    response = api_client.put(api_routes.site_settings, json=default_settings, headers=token)

    assert response.status_code == 200

    response = api_client.get(api_routes.site_settings)
    assert json.loads(response.content) == default_settings


def test_default_theme(api_client: TestClient, api_routes: AppRoutes, default_theme):
    response = api_client.get(api_routes.themes_id(1))
    assert response.status_code == 200
    assert json.loads(response.content) == default_theme


def test_create_theme(api_client: TestClient, api_routes: AppRoutes, new_theme, token):

    response = api_client.post(api_routes.themes_create, json=new_theme, headers=token)
    assert response.status_code == 201

    response = api_client.get(api_routes.themes_id(new_theme.get("id")), headers=token)
    assert response.status_code == 200
    assert json.loads(response.content) == new_theme


def test_read_all_themes(api_client: TestClient, api_routes: AppRoutes, default_theme, new_theme):
    response = api_client.get(api_routes.themes)
    assert response.status_code == 200
    response_dict = json.loads(response.content)
    assert default_theme in response_dict
    assert new_theme in response_dict


def test_read_theme(api_client: TestClient, api_routes: AppRoutes, default_theme, new_theme):
    for theme in [default_theme, new_theme]:
        response = api_client.get(api_routes.themes_id(theme.get("id")))
        assert response.status_code == 200
        assert json.loads(response.content) == theme


def test_update_theme(api_client: TestClient, api_routes: AppRoutes, token, default_theme, new_theme):
    theme_colors = {
        "primary": "#E12345",
        "accent": "#012345",
        "secondary": "#973542",
        "success": "#5AB1BB",
        "info": "#4990BA",
        "warning": "#FF4081",
        "error": "#EF4432",
    }

    new_theme["colors"] = theme_colors
    response = api_client.put(api_routes.themes_id(new_theme.get("id")), json=new_theme, headers=token)
    assert response.status_code == 200
    response = api_client.get(api_routes.themes_id(new_theme.get("id")))
    assert json.loads(response.content) == new_theme


def test_delete_theme(api_client: TestClient, api_routes: AppRoutes, default_theme, new_theme, token):
    for theme in [default_theme, new_theme]:
        response = api_client.delete(api_routes.themes_id(theme.get("id")), headers=token)

        assert response.status_code == 200
