"""
A tree deduplicator and archiver tool.
"""

import argparse
from pathlib import Path
from shutil import copy2 as copyfile

from .util import *


parser = argparse.ArgumentParser()
parser.add_argument("from_dir", type=Path)
parser.add_argument("to_dir", type=Path)


def main():
    opts, args = parser.parse_known_args()

    for abs_src_path in opts.from_dir.glob("**/*"):
        rel_src_path = abs_src_path.relative_to(opts.from_dir)
        abs_dest_path = opts.to_dir / rel_src_path

        if abs_src_path.is_dir():
            print("dir", abs_src_path, "->", abs_dest_path)
            abs_dest_path.mkdir(exist_ok=True)

        elif abs_src_path.is_file():
            print("file", abs_src_path, "->", abs_dest_path)

            if not abs_dest_path.exists():
                copyfile(abs_src_path, abs_dest_path)

            else:
                # If you trust mtime, this can go a lot faster
                trust_mtime = False

                if (
                    trust_mtime
                    and abs_dest_path.stat().st_mtime < abs_src_path.stat().st_mtime
                ):
                    pass

                elif (src_checksum := checksum_path(abs_src_path)) != (
                    dest_checksum := checksum_path(abs_dest_path)
                ):
                    print(
                        f"file conflict (src {src_checksum}, dest {dest_checksum}), correcting..."
                    )
                    copyfile(abs_src_path, abs_dest_path)

            abs_src_path.unlink()


if __name__ == "__main__":
    main()