"""Unit tests for URL converter."""

import os
from pathlib import Path

import pytest

from webdrop_bridge.config import Config, URLMapping
from webdrop_bridge.core.url_converter import URLConverter


@pytest.fixture
def test_config():
    """Create test configuration with URL mappings."""
    return Config(
        app_name="Test App",
        app_version="1.0.0",
        log_level="INFO",
        log_file=None,
        allowed_roots=[],
        allowed_urls=[],
        webapp_url="https://dev.agravity.io/",
        url_mappings=[
            URLMapping(
                url_prefix="https://devagravitystg.file.core.windows.net/devagravitysync/",
                local_path="Z:"
            ),
            URLMapping(
                url_prefix="https://other.blob.core.windows.net/container/",
                local_path="Y:\\shared"
            )
        ]
    )


@pytest.fixture
def converter(test_config):
    """Create URL converter with test config."""
    return URLConverter(test_config)


def test_convert_simple_url(converter):
    """Test converting a simple Azure URL to local path."""
    url = "https://devagravitystg.file.core.windows.net/devagravitysync/test/file.png"
    result = converter.convert_url_to_path(url)
    
    assert result is not None
    if os.name == "nt":
        assert str(result).endswith("test\\file.png")
    else:
        assert str(result).endswith("test/file.png")


def test_convert_url_with_special_characters(converter):
    """Test URL with special characters (URL encoded)."""
    url = "https://devagravitystg.file.core.windows.net/devagravitysync/folder/file%20with%20spaces.png"
    result = converter.convert_url_to_path(url)
    
    assert result is not None
    assert "file with spaces.png" in str(result)


def test_convert_url_with_subdirectories(converter):
    """Test URL with deep directory structure."""
    url = "https://devagravitystg.file.core.windows.net/devagravitysync/aN5PysnXIuRECzcRbvHkjL7g0/subfolder/file.png"
    result = converter.convert_url_to_path(url)
    
    assert result is not None
    assert "aN5PysnXIuRECzcRbvHkjL7g0" in str(result)
    assert "subfolder" in str(result)


def test_convert_unmapped_url(converter):
    """Test URL that doesn't match any mapping."""
    url = "https://unknown.blob.core.windows.net/container/file.png"
    result = converter.convert_url_to_path(url)
    
    assert result is None


def test_convert_empty_url(converter):
    """Test empty URL."""
    result = converter.convert_url_to_path("")
    assert result is None


def test_convert_none_url(converter):
    """Test None URL."""
    result = converter.convert_url_to_path(None)
    assert result is None


def test_is_azure_url_positive(converter):
    """Test recognizing valid Azure URLs."""
    url = "https://devagravitystg.file.core.windows.net/devagravitysync/file.png"
    assert converter.is_azure_url(url) is True


def test_is_azure_url_negative(converter):
    """Test rejecting non-Azure URLs."""
    assert converter.is_azure_url("https://example.com/file.png") is False
    assert converter.is_azure_url("Z:\\file.png") is False
    assert converter.is_azure_url("") is False


def test_multiple_mappings(converter):
    """Test that correct mapping is used for URL."""
    url1 = "https://devagravitystg.file.core.windows.net/devagravitysync/file.png"
    url2 = "https://other.blob.core.windows.net/container/file.png"
    
    result1 = converter.convert_url_to_path(url1)
    result2 = converter.convert_url_to_path(url2)
    
    assert result1 is not None
    assert result2 is not None
    assert str(result1).startswith("Z:")
    assert str(result2).startswith("Y:")


def test_url_mapping_validation_http():
    """Test that URL mapping requires http:// or https://."""
    with pytest.raises(Exception):  # ConfigurationError
        URLMapping(
            url_prefix="ftp://server/path/",
            local_path="Z:"
        )


def test_url_mapping_adds_trailing_slash():
    """Test that URL mapping adds trailing slash if missing."""
    mapping = URLMapping(
        url_prefix="https://example.com/path",
        local_path="Z:"
    )
    assert mapping.url_prefix.endswith("/")


def test_convert_url_example_from_docs(converter):
    """Test the exact example from documentation."""
    url = "https://devagravitystg.file.core.windows.net/devagravitysync/aN5PysnXIuRECzcRbvHkjL7g0/Hintergrund_Agravity.png"
    result = converter.convert_url_to_path(url)
    
    assert result is not None
    # Should be: Z:\aN5PysnXIuRECzcRbvHkjL7g0\Hintergrund_Agravity.png
    expected_parts = ["Z:", "aN5PysnXIuRECzcRbvHkjL7g0", "Hintergrund_Agravity.png"]
    result_str = str(result)
    for part in expected_parts:
        assert part in result_str
