

import os
import sys
from pathlib import Path

def find_files_by_extension(root_dir, extension):
    """
    Locates all files with a specific extension within a directory and its subdirectories.

    Args:
        root_dir (str): The absolute path to the root directory to search.
        extension (str): The file extension to look for (e.g., '.unity', '.prefab'). 
                         The dot is required.

    Returns:
        list: A list of absolute paths to the found files.
    """
    if not extension.startswith('.'):
        print("Error: Extension must start with a dot (e.g., '.txt').", file=sys.stderr)
        return []
        
    found_files = []
    for root, _, files in os.walk(root_dir):
        for file in files:
            if file.endswith(extension):
                found_files.append(os.path.join(root, file))
    return found_files

def replicate_directory_structure(source_root, target_root):
    """
    Copies a directory tree from a source to a target location without copying the files.

    Args:
        source_root (str): The absolute path of the source directory.
        target_root (str): The absolute path of the destination directory.
    """
    source_root = Path(source_root)
    target_root = Path(target_root)

    if not source_root.is_dir():
        print(f"Error: Source path '{source_root}' is not a valid directory.", file=sys.stderr)
        return

    for dirpath, _, _ in os.walk(source_root):
        # Create a relative path from the source root
        relative_path = Path(dirpath).relative_to(source_root)
        # Join it with the target root to get the new directory path
        target_path = target_root / relative_path
        # Create the directory in the target, ignoring if it already exists
        target_path.mkdir(parents=True, exist_ok=True)

def create_guid_to_path_map(root_dir):
    """
    Creates a dictionary mapping GUIDs to their corresponding asset file paths,
    scanning both the Assets and Packages directories and ignoring folders.
    """
    guid_map = {}
    scan_dirs = [
        os.path.join(root_dir, 'Assets'),
        os.path.join(root_dir, 'Packages'),
        os.path.join(root_dir, 'Library', 'PackageCache')
    ]

    for directory in scan_dirs:
        if not os.path.isdir(directory):
            continue
            
        meta_files = find_files_by_extension(directory, '.meta')
        for meta_file_path in meta_files:
            asset_path = meta_file_path[:-5]
            guid = None
            is_folder = False
            try:
                with open(meta_file_path, 'r', encoding='utf-8') as f:
                    for line in f:
                        stripped_line = line.strip()
                        if stripped_line.startswith('guid:'):
                            guid = stripped_line.split(':')[1].strip()
                        if stripped_line == 'folderAsset: yes':
                            is_folder = True
                            break
                
                if is_folder:
                    continue

                if guid and guid not in guid_map:
                    guid_map[guid] = asset_path
            except Exception as e:
                print(f"Warning: Could not process meta file {meta_file_path}. {e}", file=sys.stderr)
    return guid_map

if __name__ == '__main__':
    # Example usage for testing the module directly.
    # This requires a temporary directory structure to be set up.
    
    # Create a dummy structure for testing
    test_source_dir = Path('./tmp_source_for_testing')
    test_target_dir = Path('./tmp_target_for_testing')
    
    try:
        print("Setting up test directory structure...")
        (test_source_dir / 'scenes').mkdir(parents=True, exist_ok=True)
        (test_source_dir / 'prefabs' / 'characters').mkdir(parents=True, exist_ok=True)
        (test_source_dir / 'scenes' / 'level1.unity').touch()
        (test_source_dir / 'scenes' / 'level1.unity.meta').touch()
        (test_source_dir / 'prefabs' / 'player.prefab').touch()
        
        print("\n--- Testing find_files_by_extension ---")
        unity_files = find_files_by_extension(str(test_source_dir), '.unity')
        print(f"Found .unity files: {unity_files}")
        assert len(unity_files) == 1
        
        prefab_files = find_files_by_extension(str(test_source_dir), '.prefab')
        print(f"Found .prefab files: {prefab_files}")
        assert len(prefab_files) == 1

        print("\n--- Testing replicate_directory_structure ---")
        replicate_directory_structure(str(test_source_dir), str(test_target_dir))
        
        print("Checking replicated structure:")
        assert test_target_dir.exists()
        assert (test_target_dir / 'scenes').exists()
        assert (test_target_dir / 'prefabs' / 'characters').exists()
        assert not (test_target_dir / 'scenes' / 'level1.unity').exists() # File should not be copied
        print("Replicated structure seems correct.")

    finally:
        # Clean up test directories
        import shutil
        if test_source_dir.exists():
            shutil.rmtree(test_source_dir)
        if test_target_dir.exists():
            shutil.rmtree(test_target_dir)
        print("\nCleaned up test directories.")


