#!/usr/bin/env python3

import argparse
import os
import shutil

prefix = os.environ['MESON_INSTALL_DESTDIR_PREFIX']
dry_run = bool(os.environ.get('MESON_INSTALL_DRY_RUN'))


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument('dirname')
    parser.add_argument('files', nargs='+')
    parser.add_argument('--mode', action='store', default='create', choices=['create', 'copy'])
    args = parser.parse_args()

    dirname = os.path.join(prefix, args.dirname)
    if not os.path.exists(dirname):
        if dry_run:
            print(f"DRYRUN: Creating directory {dirname}")
        else:
            os.makedirs(dirname)

    if args.mode == 'create':
        for name in args.files:
            if dry_run:
                print(f'DRYRUN: Writing file {name}')
            else:
                with open(os.path.join(dirname, name), 'w') as f:
                    f.write('')
    else:
        for name in args.files:
            if dry_run:
                print(f"DRYRUN: Copying file {name} to {dirname}")
            else:
                shutil.copy(name, dirname)


if __name__ == "__main__":
    main()
