#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import argparse
import shutil
import tempfile
from pathlib import Path

from clickgen.builders import WindowsCursor, XCursor
from clickgen.core import CursorAlias

parser = argparse.ArgumentParser(
    prog="clickgen",
    description="The hassle-free cursor building toolbox",
)
# Positional Args.
parser.add_argument(
    "png",
    metavar="PNG",
    type=str,
    nargs="+",
    help="Path to .png file. If animated, Try to mask frame-number using asterisk( * ). For Example 'wait-*.png'",
)
parser.add_argument(
    "-o",
    "--out-dir",
    dest="out_dir",
    metavar="OUT",
    type=str,
    default="./",
    help="To change output directory. (default: %(default)s)",
)


# Optional Args.
parser.add_argument(
    "-hot",
    "--hotspot",
    dest="hotspot",
    metavar="cord",
    nargs=2,
    default=(0, 0),
    type=int,
    help="To set 'x' & 'y' coordinates of cursor's hotspot. (default: %(default)s)",
)
parser.add_argument(
    "-t",
    "--type",
    dest="type",
    choices=("windows", "xcursor", "all"),
    default="all",
    help="Set cursor type, Which you want to build. (default: '%(default)s')",
)

parser.add_argument(
    "-s",
    "--sizes",
    dest="sizes",
    metavar="size",
    nargs="+",
    default=[22],
    type=int,
    help="Set pixel-size for cursor. (default: %(default)s)",
)

parser.add_argument(
    "-d",
    "--delay",
    dest="delay",
    metavar="ms",
    default=50,
    type=int,
    help="Set animated cursor's frames delay in 'micro-second'. (default: %(default)s)",
)

args = parser.parse_args()

sizes = []
hotspot = (args.hotspot[0], args.hotspot[1])
for s in args.sizes:
    sizes.append((s, s))

out_dir = Path(args.out_dir)
if not out_dir.exists():
    out_dir.mkdir(parents=True, exist_ok=True)


with CursorAlias.from_bitmap(args.png, hotspot) as alias:
    cfg = alias.create(sizes)

    if args.type == "windows":
        WindowsCursor.create(cfg, out_dir)
    elif args.type == "xcursor":
        # Using Temporary directory, Because 'XCursor' create inside 'cursors' directory.
        tmp_dir = Path(tempfile.mkdtemp())
        try:
            xcursor = XCursor.create(cfg, tmp_dir)
            shutil.move(str(xcursor.absolute()), str(out_dir.absolute()))
        finally:
            shutil.rmtree(tmp_dir)
    else:
        tmp_dir = Path(tempfile.mkdtemp())
        try:
            xcursor = XCursor.create(cfg, tmp_dir)
            win_cursor = WindowsCursor.create(cfg, tmp_dir)
            shutil.move(str(xcursor.absolute()), str(out_dir.absolute()))
            shutil.move(str(win_cursor.absolute()), str(out_dir.absolute()))
        finally:
            shutil.rmtree(tmp_dir)
