# mypy: allow-untyped-defs

from dataclasses import asdict
from ..schema import FileMatchingMode, WebFeaturesFile, FeatureEntry, SpecialFileEnum, FeatureFile

import pytest
import re

@pytest.mark.parametrize(
    "input,expected_result,expected_exception_type,exception_message",
    [
        (
            {
                "features": [
                    {
                        "name": "feature1",
                        "files": ["file1", "file2"],
                    }
                ]
            },
            {
                "features": [
                    {
                        "name": "feature1",
                        "files": ["file1", "file2"],
                    }
                ]
            },
            None,
            None
        ),
        (
            {},
            None,
            ValueError,
            "Object missing required keys: ['features']"
        ),
        (
            {
                "features": [
                    {}
                ]
            },
            None,
            ValueError,
            "Object missing required keys: ['files', 'name']"
        ),
    ])
def test_web_features_file(input, expected_result, expected_exception_type, exception_message):
    if expected_exception_type:
        with pytest.raises(expected_exception_type, match=re.escape(exception_message)):
            WebFeaturesFile(input)
    else:
        assert expected_result == asdict(WebFeaturesFile(input))

@pytest.mark.parametrize(
    "input,expected_result",
    [
        (
            FeatureEntry({"name": "test1", "files":["file1"]}),
            False
        ),
        (
            FeatureEntry({"name": "test2", "files": SpecialFileEnum.RECURSIVE}),
            True
        ),
    ])
def test_does_feature_apply_recursively(input, expected_result):
    assert input.does_feature_apply_recursively() == expected_result

@pytest.mark.parametrize(
    "input_feature,input_files,expected_result,expected_match_mode",
    [
        (
            FeatureFile("*"),
            ["test.html", "TEST.HTML"],
            ["test.html", "TEST.HTML"],
            FileMatchingMode.INCLUDE,
        ),
        (
            FeatureFile("test.html"),
            ["test.html", "TEST.HTML"],
            ["test.html"],
            FileMatchingMode.INCLUDE,
        ),
        (
            FeatureFile("!test.html"),
            ["test.html", "TEST.HTML"],
            ["test.html"],
            FileMatchingMode.EXCLUDE,
        ),
        (
            FeatureFile("test*.html"),
            ["test.html", "test1.html", "TEST1.HTML", "test2.html", "test-2.html", "foo.html"],
            ["test.html", "test1.html", "test2.html", "test-2.html"],
            FileMatchingMode.INCLUDE,
        ),
        (
            FeatureFile("!test*.html"),
            ["test.html", "test1.html", "TEST1.HTML", "test2.html", "test-2.html", "foo.html"],
            ["test.html", "test1.html", "test2.html", "test-2.html"],
            FileMatchingMode.EXCLUDE,
        ),
    ])
def test_feature_file_match_files(input_feature, input_files, expected_result, expected_match_mode):
    assert input_feature.match_files(input_files) == expected_result
    assert input_feature.matching_mode == expected_match_mode
