from datetime import datetime

import pytest
from flask import Flask

from fittrackee import VERSION
from fittrackee.application.models import AppConfig
from fittrackee.users.models import User

from ..utils import random_string


class TestConfigModel:
    def test_application_config(
        self, app: Flask, monkeypatch: pytest.MonkeyPatch
    ) -> None:
        monkeypatch.setenv('WEATHER_API_PROVIDER', 'darksky')
        app_config = AppConfig.query.first()
        app_config.admin_contact = 'admin@example.com'

        assert app_config.is_registration_enabled is True
        assert (
            app_config.map_attribution
            == app.config['TILE_SERVER']['ATTRIBUTION']
        )

        serialized_app_config = app_config.serialize()
        assert (
            serialized_app_config['admin_contact'] == app_config.admin_contact
        )
        assert (
            serialized_app_config['gpx_limit_import']
            == app_config.gpx_limit_import
        )
        assert serialized_app_config['is_email_sending_enabled'] is True
        assert serialized_app_config['is_registration_enabled'] is True
        assert (
            serialized_app_config['max_single_file_size']
            == app_config.max_single_file_size
        )
        assert (
            serialized_app_config['max_zip_file_size']
            == app_config.max_zip_file_size
        )
        assert serialized_app_config['max_users'] == app_config.max_users
        assert (
            serialized_app_config['map_attribution']
            == app_config.map_attribution
        )
        assert serialized_app_config['version'] == VERSION
        assert serialized_app_config['weather_provider'] == 'darksky'

    def test_it_returns_registration_disabled_when_users_count_exceeds_limit(
        self, app: Flask, user_1: User, user_2: User
    ) -> None:
        app_config = AppConfig.query.first()
        app_config.max_users = 2
        serialized_app_config = app_config.serialize()

        assert app_config.is_registration_enabled is False
        assert serialized_app_config['is_registration_enabled'] is False

    def test_it_returns_email_sending_disabled_when_no_email_url_provided(
        self, app_wo_email_activation: Flask, user_1: User, user_2: User
    ) -> None:
        app_config = AppConfig.query.first()
        serialized_app_config = app_config.serialize()

        assert serialized_app_config['is_email_sending_enabled'] is False

    @pytest.mark.parametrize(
        'input_weather_api_provider, expected_weather_provider',
        [
            ('darksky', 'darksky'),
            ('Visualcrossing', 'visualcrossing'),
            ('invalid_provider', None),
            ('', None),
        ],
    )
    def test_it_returns_weather_provider(
        self,
        app: Flask,
        input_weather_api_provider: str,
        expected_weather_provider: str,
        monkeypatch: pytest.MonkeyPatch,
    ) -> None:
        monkeypatch.setenv('WEATHER_API_PROVIDER', input_weather_api_provider)
        app_config = AppConfig.query.first()
        serialized_app_config = app_config.serialize()

        assert (
            serialized_app_config['weather_provider']
            == expected_weather_provider
        )

    def test_it_returns_privacy_policy(self, app: Flask) -> None:
        app_config = AppConfig.query.first()
        privacy_policy = random_string()
        privacy_policy_date = datetime.now()
        app_config.privacy_policy = privacy_policy
        app_config.privacy_policy_date = privacy_policy_date

        serialized_app_config = app_config.serialize()

        assert serialized_app_config["privacy_policy"] == privacy_policy
        assert (
            serialized_app_config["privacy_policy_date"] == privacy_policy_date
        )

    def test_it_returns_about(self, app: Flask) -> None:
        app_config = AppConfig.query.first()
        about = random_string()
        app_config.about = about

        serialized_app_config = app_config.serialize()

        assert serialized_app_config["about"] == about
