# retoor <retoor@molodetz.nl>
import argparse
import asyncio
import hashlib
import json
import os
import sys
import tempfile

from stealthii import Stealthii


def digest_file(path):
    try:
        with open(path, "rb") as handle:
            return hashlib.sha256(handle.read()).hexdigest()
    except OSError:
        return None


async def capture(url, timeout, settle_ms, session):
    stealth = Stealthii()
    try:
        await stealth.start()
        shot = await stealth.screenshot(url, timeout=timeout, settle_ms=settle_ms, session=session)
        import base64

        return base64.b64decode(shot)
    finally:
        await stealth.shutdown()


def store_if_changed(png, path):
    directory = os.path.dirname(os.path.abspath(path)) or "."
    fd, tmp = tempfile.mkstemp(prefix=".live-", suffix=".png", dir=directory)
    try:
        with os.fdopen(fd, "wb") as handle:
            handle.write(png)
        new_digest = hashlib.sha256(png).hexdigest()
        if digest_file(path) == new_digest:
            os.unlink(tmp)
            return False, new_digest
        os.replace(tmp, path)
        return True, new_digest
    except BaseException:
        try:
            os.unlink(tmp)
        except OSError:
            pass
        raise


def main(argv):
    parser = argparse.ArgumentParser(description="Capture a page screenshot, rewriting the target only when bytes changed.")
    parser.add_argument("url")
    parser.add_argument("--path", default="live.png")
    parser.add_argument("--timeout", type=float, default=25.0)
    parser.add_argument("--settle-ms", type=int, default=500)
    parser.add_argument("--session", default=None)
    args = parser.parse_args(argv)
    png = asyncio.run(capture(args.url, args.timeout, args.settle_ms, args.session))
    changed, digest = store_if_changed(png, args.path)
    print(json.dumps({"changed": changed, "path": args.path, "sha256": digest}))
    return 0


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
