"""
Integration tests for markitect-utils capability.

Tests the overall functionality and integration of the utility modules.
"""

import tempfile
import os
from pathlib import Path

import pytest
from markitect_utils import (
    slugify, safe_filename, is_valid_email, validate_required_fields,
    truncate, normalize_path
)


class TestUtilityIntegration:
    """Test integration between different utility functions."""

    def test_filename_processing_workflow(self):
        """Test a complete filename processing workflow."""
        # Start with user input
        user_title = "My Great Article: A Case Study!"
        user_email = "author@example.com"

        # Validate email
        assert is_valid_email(user_email) is True

        # Create a slug for URL
        slug = slugify(user_title)
        assert slug == "my-great-article-a-case-study"

        # Create a safe filename
        filename = safe_filename(f"{slug}.md")
        assert filename == "my-great-article-a-case-study.md"

        # Truncate if too long
        if len(filename) > 30:
            filename = truncate(filename, 30, "….md")

        assert len(filename) <= 30
        assert filename.endswith(".md") or filename.endswith("….md")

    def test_content_validation_workflow(self):
        """Test a content validation workflow."""
        # Simulate form data
        form_data = {
            "title": "My Article",
            "content": "This is the content of my article.",
            "author_email": "author@example.com",
            "category": "",  # Empty field
            "tags": "python,utils,testing"
        }

        required_fields = ["title", "content", "author_email", "category"]

        # Validate required fields
        validation_result = validate_required_fields(form_data, required_fields)

        assert validation_result["missing"] == []
        assert validation_result["empty"] == ["category"]

        # Validate email format
        if form_data.get("author_email"):
            assert is_valid_email(form_data["author_email"]) is True

        # Process tags
        if form_data.get("tags"):
            tag_list = [slugify(tag.strip()) for tag in form_data["tags"].split(",")]
            assert tag_list == ["python", "utils", "testing"]

    def test_file_operations_workflow(self):
        """Test a file operations workflow."""
        # Create temporary directory for testing
        with tempfile.TemporaryDirectory() as temp_dir:
            temp_path = Path(temp_dir)

            # Create some test files
            test_content = "This is test content for the file."

            # Process filename through multiple utilities
            original_name = "Test File: With Special/Characters!"
            safe_name = safe_filename(original_name)
            slug_name = slugify(safe_name.rsplit('.', 1)[0]) + '.txt'

            # Write file
            file_path = temp_path / slug_name
            file_path.write_text(test_content)

            # Verify file exists and get normalized path
            normalized_path = normalize_path(file_path)
            assert Path(normalized_path).exists()

            # Verify content length matches expectations
            content_length = len(test_content)
            assert content_length > 0

    def test_data_processing_pipeline(self):
        """Test a complete data processing pipeline."""
        # Raw data from external source
        raw_data = [
            {
                "userName": "JohnDoe123",
                "emailAddress": "john.doe@example.com",
                "websiteURL": "https://johndoe.example.com",
                "projectVersion": "1.2.0",
                "description": "This is a very long description that might need to be truncated for display purposes in certain UI components."
            },
            {
                "userName": "Jane_Smith",
                "emailAddress": "invalid-email",
                "websiteURL": "not-a-url",
                "projectVersion": "invalid-version",
                "description": "Short desc"
            }
        ]

        processed_data = []

        for item in raw_data:
            # Convert camelCase to snake_case (would need the function imported)
            # For now, just demonstrate with available functions

            processed_item = {
                "slug": slugify(item["userName"]),
                "email_valid": is_valid_email(item["emailAddress"]),
                "short_desc": truncate(item["description"], 50),
                "safe_filename": safe_filename(f"{item['userName']}_profile.json")
            }

            processed_data.append(processed_item)

        # Verify processing results
        assert processed_data[0]["slug"] == "johndoe123"
        assert processed_data[0]["email_valid"] is True
        assert len(processed_data[0]["short_desc"]) <= 50
        assert processed_data[0]["safe_filename"] == "JohnDoe123_profile.json"

        assert processed_data[1]["slug"] == "jane-smith"
        assert processed_data[1]["email_valid"] is False
        assert processed_data[1]["short_desc"] == "Short desc"
        assert processed_data[1]["safe_filename"] == "Jane_Smith_profile.json"

    def test_configuration_validation(self):
        """Test configuration validation using multiple utilities."""
        # Simulate application configuration
        config = {
            "app_name": "My Application",
            "version": "1.0.0",
            "admin_email": "admin@myapp.com",
            "base_url": "https://myapp.example.com",
            "debug": True,
            "secret_key": "",  # Empty - should be flagged
        }

        required_fields = ["app_name", "version", "admin_email", "base_url", "secret_key"]

        # Validate required fields
        validation_result = validate_required_fields(config, required_fields)
        assert validation_result["empty"] == ["secret_key"]

        # Validate specific formats
        email_valid = is_valid_email(config["admin_email"])
        assert email_valid is True

        # Create safe directory name from app name
        app_slug = slugify(config["app_name"])
        safe_dir_name = safe_filename(app_slug)

        assert app_slug == "my-application"
        assert safe_dir_name == "my-application"

        # Validate version format would use is_valid_semver
        # (assuming we had imported it in the integration test)