import os
import re
import yaml

# Regular expression to match .get<T>("a:b:c", x)
pattern = re.compile(r'\.get<([^>]+)>\("([^"]+)",\s*([^);]+)\)')

def parse_value(value, type_hint):
    """Converts values to appropriate types."""
    value = value.strip()
    
    # Handle common types
    if type_hint in {"int", "long"}:
        return int(value)
    elif type_hint in {"float", "double"}:
        return float(value)
    elif type_hint == "bool":
        return value.lower() in {"true", "1"}
    elif value.startswith('"') and value.endswith('"'):
        return value.strip('"')  # Remove quotes for string literals
    elif value.startswith("'") and value.endswith("'"):
        return value.strip("'")  # Remove single quotes
    
    return value  # Return as-is if unsure

def insert_into_dict(hierarchy_dict, keys, value, type_hint):
    """Recursively inserts values into a nested dictionary."""
    key = keys.pop(0)
    if not keys:  # If last key, store value
        hierarchy_dict[key] = parse_value(value, type_hint)
    else:
        if key not in hierarchy_dict:
            hierarchy_dict[key] = {}
        insert_into_dict(hierarchy_dict[key], keys, value, type_hint)

def scan_files(directory):
    """Scans all .cpp, .h, .c, and .hpp files in a directory recursively."""
    hierarchy_dict = {}

    for root, _, files in os.walk(directory):
        for file in files:
            if file.endswith(('.cpp', '.h', '.c', '.hpp')):
                file_path = os.path.join(root, file)
                with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
                    for line in f:
                        match = pattern.search(line)
                        if match:
                            type_hint, hierarchy, value = match.groups()
                            keys = hierarchy.split(":")
                            insert_into_dict(hierarchy_dict, keys, value, type_hint)

    return hierarchy_dict

def save_yaml(data, output_file):
    """Saves the nested dictionary to a YAML file."""
    with open(output_file, 'w', encoding='utf-8') as f:
        yaml.dump(data, f, default_flow_style=False, sort_keys=False, indent=4)

if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser(description="Generate a YAML file with default configuration values.")
    parser.add_argument("directory", help="Directory to scan for .cpp, .h, .c, and .hpp files.")
    parser.add_argument("-o", "--output", help="Output file name.", default="defaults.yaml")
    args = parser.parse_args()

    extracted_data = scan_files(args.directory)
    save_yaml(extracted_data, args.output)

    print(f"✅ YAML file generated: {args.output}")

