#!/usr/bin/env python3
"""Zoomed, stacked comparison of a card region: reference (top) vs render (bottom)."""
import argparse
import os
import sys

from PIL import Image, ImageDraw

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from kodi_renderer import Renderer, parse_po, STRINGS_PO  # noqa: E402
from render_dialog import BASE_PROPS, PROFILES  # noqa: E402

HERE = os.path.dirname(os.path.abspath(__file__))
REF_PATH = os.path.join(HERE, 'reference.jpg')
CARD_X, CARD_Y, CARD_W, CARD_H = 50, 50, 838, 386
REF_CARD_BOX = (10, 14, 430, 208)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('xml')
    parser.add_argument('region', help='x0,y0,x1,y1 in card-local reference units')
    parser.add_argument('--profile', default='episode')
    parser.add_argument('--focus', default='111')
    parser.add_argument('--hidden', default='')
    parser.add_argument('--scale', type=int, default=4)
    parser.add_argument('--out', default=os.path.join(HERE, 'out', 'zoom.png'))
    args = parser.parse_args()

    x0, y0, x1, y1 = [int(v) for v in args.region.split(',')]
    os.makedirs(os.path.dirname(os.path.abspath(args.out)), exist_ok=True)

    props = dict(BASE_PROPS)
    props.update(PROFILES.get(args.profile, {}))
    focus = [int(x) for x in args.focus.split(',') if x.strip()]
    hidden = [int(x) for x in args.hidden.split(',') if x.strip()]

    renderer = Renderer(props, focus_ids=focus, strings=parse_po(STRINGS_PO))
    full = renderer.render(args.xml, hidden_ids=hidden)
    card = full.crop((CARD_X, CARD_Y, CARD_X + CARD_W, CARD_Y + CARD_H))
    ref = Image.open(REF_PATH).convert('RGBA')
    ref_card = ref.crop(REF_CARD_BOX)
    ours = card.resize(ref_card.size, Image.LANCZOS)
    composite = ref_card.copy()
    composite.alpha_composite(ours)

    box = (x0, y0, x1, y1)
    ref_crop = ref_card.crop(box)
    our_crop = composite.crop(box)
    w = (x1 - x0) * args.scale
    h = (y1 - y0) * args.scale
    ref_crop = ref_crop.resize((w, h), Image.LANCZOS)
    our_crop = our_crop.resize((w, h), Image.LANCZOS)
    out = Image.new('RGB', (w, h * 2 + 8), (255, 0, 0))
    out.paste(ref_crop.convert('RGB'), (0, 0))
    out.paste(our_crop.convert('RGB'), (0, h + 8))
    d = ImageDraw.Draw(out)
    for gx in range(0, w, 10 * args.scale):
        d.line([(gx, 0), (gx, out.height)], fill=(255, 0, 0), width=1)
    for gy in range(0, out.height, 10 * args.scale):
        d.line([(0, gy), (w, gy)], fill=(0, 255, 0), width=1)
    out.save(args.out)
    print('saved', args.out, out.size)


if __name__ == '__main__':
    main()
