# === test_helpers.py ===

import os
import tempfile
import json
from pathlib import Path


class OSAFTestEnvironment:
    """Вспомогательный класс для создания тестового окружения"""

    def __init__(self):
        self.test_dir = tempfile.mkdtemp(prefix="osaf_test_")
        self.created_files = []
        self.created_dirs = []

    def create_test_file(self, content="test content", extension=".txt"):
        """Создать тестовый файл"""
        import tempfile
        fd, path = tempfile.mkstemp(suffix=extension, dir=self.test_dir)
        with os.fdopen(fd, 'w') as f:
            f.write(content)
        self.created_files.append(path)
        return path

    def create_test_directory(self, name=None):
        """Создать тестовую директорию"""
        if name:
            dir_path = os.path.join(self.test_dir, name)
        else:
            dir_path = tempfile.mkdtemp(dir=self.test_dir)

        os.makedirs(dir_path, exist_ok=True)
        self.created_dirs.append(dir_path)
        return dir_path

    def create_test_structure(self):
        """Создать сложную тестовую структуру файлов"""
        structure = {
            'dir1': {
                'file1.txt': 'content1',
                'subdir': {
                    'file2.txt': 'content2'
                }
            },
            'dir2': {
                'file3.json': '{"test": "data"}'
            }
        }

        self._create_structure(self.test_dir, structure)
        return self.test_dir

    def _create_structure(self, base_path, structure):
        """Рекурсивно создать структуру файлов"""
        for name, content in structure.items():
            path = os.path.join(base_path, name)
            if isinstance(content, dict):
                os.makedirs(path, exist_ok=True)
                self.created_dirs.append(path)
                self._create_structure(path, content)
            else:
                with open(path, 'w') as f:
                    f.write(content)
                self.created_files.append(path)

    def cleanup(self):
        """Очистить тестовое окружение"""
        import shutil
        shutil.rmtree(self.test_dir, ignore_errors=True)


def create_windows_specific_test_cases():
    """Генератор тестовых случаев для Windows"""

    test_cases = [
        {
            'name': 'windows_paths',
            'description': 'Тестирование путей Windows',
            'test_cases': [
                ('C:\\Program Files\\App', 'should_normalize_windows_path'),
                ('C:/Mixed/Slashes/Path', 'should_handle_mixed_slashes'),
                ('..\\Relative\\Path', 'should_handle_relative_paths')
            ]
        },
        {
            'name': 'windows_commands',
            'description': 'Тестирование Windows команд',
            'test_cases': [
                (['cmd', '/c', 'echo', 'test'], 'should_execute_cmd_commands'),
                (['powershell', '-Command', 'Write-Host "test"'], 'should_execute_powershell'),
                (['where', 'cmd'], 'should_find_windows_executables')
            ]
        }
    ]

    return test_cases


def performance_test_osaf_operations(osa_instance, operations_count=100):
    """Тест производительности основных операций OSAF"""
    import time

    operations = []

    # Тестируем файловые операции
    start_time = time.time()
    for i in range(operations_count):
        test_file = f"perf_test_{i}.txt"
        osa_instance.files.write_str(test_file, f"content {i}")
        osa_instance.files.read_str(test_file)
        osa_instance.files.remove(test_file)
    file_ops_time = time.time() - start_time
    operations.append(('file_operations', file_ops_time))

    # Тестируем процессные операции (меньше итераций, т.к. медленнее)
    if operations_count > 10:
        proc_count = min(operations_count // 10, 10)
        start_time = time.time()
        for i in range(proc_count):
            if sys.platform.startswith('win'):
                osa_instance.processes.exec(['cmd', '/c', 'echo', str(i)])
            else:
                osa_instance.processes.exec(['echo', str(i)])
        proc_ops_time = time.time() - start_time
        operations.append(('process_operations', proc_ops_time))

    return operations


if __name__ == '__main__':
    # Быстрый тест окружения
    env = OSAFTestEnvironment()
    try:
        test_file = env.create_test_file("Hello, Test!")
        test_dir = env.create_test_directory("test_subdir")
        print(f"Test environment created: {env.test_dir}")
        print(f"Test file: {test_file}")
        print(f"Test dir: {test_dir}")
    finally:
        env.cleanup()