from pathlib import Path
import shutil

def merge_into(src: Path | str, dest: Path | str, check_date: bool = True, touch_directories: bool = True):
    """Merges the contents of a directory into another

    Args:
        src (Path | str): The source directory to merge from
        dest (Path | str): The destination directory to merge into
        check_date (bool, optional): If true, only copies files which are newer in src than in dest. Defaults to True.
        touch_directories (bool, optional): Updates the modified time of parent directories. Defaults to True.

    Returns:
        _type_: _description_
    """
    src = Path(src)
    dest = Path(dest)
    
    changed = False
    
    for (cd, _, files) in src.walk():
        for file in files:
            src_file = cd / file
            dest_file = dest / src_file.relative_to(src)
            
            # Don't update if dest is newer than source
            if check_date and dest_file.exists() and src_file.stat().st_mtime < dest_file.stat().st_mtime:
                continue
            
            dest_file.parent.mkdir(parents=True, exist_ok=True)
            _ = shutil.copyfile(src_file, dest_file)
            changed = True
            
            if touch_directories:
                for prnt in dest_file.relative_to(dest).parents:
                    (dest / prnt).touch(exist_ok=True)
            
    return changed