#!/usr/bin/env python3

import errno
import os
import sys
import tempfile

from posix_parity import cleanup_dir
from posix_parity import fail
from posix_parity import join
from posix_parity import mergerfs_branches
from posix_parity import mergerfs_get_option
from posix_parity import temp_dir
from posix_parity import touch


def get_errno(func):
    try:
        func()
        return 0
    except OSError as exc:
        return exc.errno


def main():
    if len(sys.argv) != 2:
        print("usage: TEST_rmdir_enotempty_priority <mountpoint>", file=sys.stderr)
        return 1

    mount = sys.argv[1]
    merge_base = temp_dir(mount)

    try:
        branches = mergerfs_branches(mount)
        if len(branches) < 2:
            return 0

        merge_dir = join(merge_base, "nonempty_dir")
        os.makedirs(merge_dir)

        child_file = join(merge_dir, "child.txt")
        branch0 = branches[0]
        native_child = join(branch0, os.path.relpath(child_file, mount))
        touch(child_file, b"prevents rmdir")

        err = get_errno(lambda: os.rmdir(merge_dir))
        if err != errno.ENOTEMPTY:
            return fail(f"rmdir non-empty dir: expected ENOTEMPTY({errno.ENOTEMPTY}), got {err}")

        os.unlink(child_file)
        err = get_errno(lambda: os.rmdir(merge_dir))
        if err != 0:
            return fail(f"rmdir empty dir after removing child: expected success, got errno={err}")

        return 0
    except Exception as exc:
        return fail(str(exc))
    finally:
        cleanup_dir(merge_base)


if __name__ == "__main__":
    raise SystemExit(main())