#!/usr/bin/env python3
"""Generate the Home detail from the cinematic hero, buttons and row templates."""
from pathlib import Path
import sys

import gen_cinema as cinema

OUT = Path(cinema.ROOT) / 'Includes_MilionarDetail.xml'
MODERN_OUT = Path(cinema.MODERN.out).parent / 'Includes_MilionarDetail.xml'     # the detail's rows lift too
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
from wcs.skin.detail_contract import BACK_BUTTON, DETAIL_ROWS, GROUP, LIST, MORE, PLAY, PREFIX, ROWS

KINDS = tuple(kind for kind, _control, _label, _style in DETAIL_ROWS)
IDS = {kind: control for kind, control, _label, _style in DETAIL_ROWS}
PROPERTY = 'Window(Home).Property(' + PREFIX + '{})'
ACTIVE = 'String.IsEqual({},true)'.format(PROPERTY.format('active'))
BACK = 'RunPlugin(plugin://plugin.video.milionar/?action=skin_detail_back)'

PORTRAIT_CARD = '''{t}<control type="image">
{t}\t<width>232</width><height>348</height>
{t}\t<texture border="20">milionar/cinema/card.png</texture>
{t}</control>
{t}<control type="image">
{t}\t<width>232</width><height>348</height><aspectratio>scale</aspectratio>
{t}\t<texture background="true" fallback="DefaultActor.png" diffuse="milionar/cinema/mask_poster.png">$INFO[ListItem.Art(poster)]</texture>
{t}</control>
{t}<control type="image">
{t}\t<width>232</width><height>348</height>
{t}\t<texture>milionar/cinema/shade_poster.png</texture>
{t}</control>
{t}<control type="label">
{t}\t<left>16</left><top>266</top><width>200</width><height>38</height>
{t}\t<font>font10</font><aligny>center</aligny><label>$INFO[ListItem.Label]</label>
{t}</control>
{t}<control type="label">
{t}\t<left>16</left><top>305</top><width>200</width><height>32</height>
{t}\t<font>font20</font><textcolor>cinema_dim</textcolor><label>$INFO[ListItem.Label2]</label>
{t}</control>'''


def button(control, label, action, visible='true'):
    """A ghost button after the two of every hero, in the hero's group list (gen_cinema.HERO_FIXED): as wide as its text;
    the group list navigates between them."""
    params = {'id': control, 'label': label, 'action': action, 'rows': ROWS, 'is_detail': 'true', 'visible': visible}
    return '\n'.join(['\t\t\t<include content="MilCineHeroButton">'] + [
        '\t\t\t\t<param name="{}" value="{}"/>'.format(name, value) for name, value in params.items()] + ['\t\t\t</include>'])


def build(look=cinema.CLASSIC):
    lines = ['<?xml version="1.0" encoding="UTF-8"?>', '<!-- generated by scripts/skin_harness/gen_detail.py: do not edit -->', '<includes>']
    for suffix in cinema.FIELDS:
        if suffix == 'Detail':
            continue
        field = suffix.lower()
        lines.extend(cinema.variable(suffix + '_detail', [(None, '$INFO[{}]'.format(PROPERTY.format(field)))]))
    lines.extend(cinema.variable('PlayLabel_detail', [(None, '$INFO[{}]'.format(PROPERTY.format('play_label')))]))
    # the badge line (Pro tebe: "94 % SHODA" and why) in place of the TMDb rating
    lines.extend(cinema.variable('Badge_detail', [(None, '$INFO[{}]'.format(PROPERTY.format('badge')))]))
    lines.extend(cinema.variable('Now_detail', [(None, '$INFO[{}]'.format(PROPERTY.format('now')))]))
    conditions = {'Any': ACTIVE, 'Is_detail_1': ACTIVE,
                  'HasRating': '!String.IsEmpty({})'.format(PROPERTY.format('rating')),
                  'HasBadge': '!String.IsEmpty({})'.format(PROPERTY.format('badge')),
                  'HasTitleImage': '!String.IsEmpty({})'.format(PROPERTY.format('titleimage')),
                  'HasCaption': '!String.IsEmpty({})'.format(PROPERTY.format('left')),
                  'Resumable': 'String.IsEqual({},true)'.format(PROPERTY.format('resumable'))}
    for step, _font, _left in cinema.TITLE_FONTS:
        conditions['Size_' + step] = 'String.IsEqual({},{})'.format(PROPERTY.format('size'), step)
    for name, condition in conditions.items():
        lines.append(cinema.expression(name if name == 'Is_detail_1' else name + '_detail', condition))
    for index, kind in enumerate(KINDS):
        later = KINDS[index + 1:]
        hidden = ' | '.join('[String.IsEqual(Window(Home).Property(milionar.row.detail),{}) + String.IsEqual({},true)]'.format(
            IDS[k], PROPERTY.format('has.' + k)) for k in later) or 'false'
        lines.append(cinema.expression('DetailAbove_' + kind, hidden))
        lines += ['\t<variable name="MilDetailContent_{}">'.format(kind),
                  '\t\t<value condition="{} + String.IsEqual({},true)">plugin://plugin.video.milionar/?action=skin_detail_row&amp;kind={}&amp;key=$INFO[{}]</value>'.format(
                      ACTIVE, PROPERTY.format('has.' + kind), kind, PROPERTY.format('key' if kind == 'episodes' else 'title_key')),
                  '\t\t<value></value>', '\t</variable>']
    lines += ['\t<include name="MilCineDetailNavigation">',
              '\t\t<orientation>horizontal</orientation>',
              '\t\t<scrolltime tween="cubic" easing="out">500</scrolltime>',
              '\t\t<onleft>9000</onleft>', '\t\t<onright>noop</onright>',
              ] + cinema.gen_slots.run_lines(BACK, '\t\t', tag='onback') + cinema.gen_slots.run_lines(
                  'RunPlugin(plugin://plugin.video.milionar/?action=skin_detail_actions)', '\t\t', tag='oninfo') + [
              '\t\t<preloaditems>2</preloaditems>', '\t</include>']
    cinema.ROWS['Portrait'] = (PORTRAIT_CARD, 232, 348)
    lines.append(cinema.row(cinema.PLUGIN, 'Portrait', look))
    lines += ['\t<include name="MilionarDetail">', '\t\t<control type="group" id="{}">'.format(GROUP),
              '\t\t\t<include>MilionarContentArea</include>', '\t\t\t<defaultcontrol>{}</defaultcontrol>'.format(PLAY),
              '\t\t\t<visible>{} + System.AddonIsEnabled(plugin.video.milionar)</visible>'.format(ACTIVE)]
    extra = button(MORE, '$ADDON[plugin.video.milionar 32681]',
                   'RunPlugin(plugin://plugin.video.milionar/?action=skin_detail_actions)')
    extra += '\n' + button(BACK_BUTTON, '$ADDON[plugin.video.milionar 32682]', BACK)
    lines.extend(cinema.hero_controls({'sec': 'detail', 'play': PLAY, 'detail': LIST, 'rows': ROWS,
                                      'is_detail': 'true', 'detail_label': '$INFO[{}]'.format(PROPERTY.format('list_label')),
                                      'detail_action': 'RunPlugin(plugin://plugin.video.milionar/?action=skin_detail_list)',
                                      'extra_buttons': extra, 'group': GROUP + cinema.BUTTON_GROUP},
                                     [(PROPERTY.format('percent'), 1)], channel=True))
    lines.append(cinema.HERO_ANCHOR.format(id=GROUP + cinema.BUTTON_ANCHOR))
    lines.append(cinema.SECTION_ROWS.format(rows=ROWS, top=cinema.ROWS_TOP, height=cinema.ROWS_HEIGHT,
                                          gap=cinema.GAP, play=PLAY, page=41009))
    for kind, _control, label, style in DETAIL_ROWS:
        header = '$INFO[{}]'.format(PROPERTY.format('episodes_label')) if kind == 'episodes' else '$ADDON[plugin.video.milionar {}]'.format(label)
        lines += ['\t\t\t<include content="MilCineRow{}">'.format(style),
                  '\t\t\t\t<param name="list_id" value="{}"/>'.format(IDS[kind]),
                  '\t\t\t\t<param name="section" value="detail"/>',
                  '\t\t\t\t<param name="navigation" value="MilCineDetailNavigation"/>',
                  '\t\t\t\t<param name="known_items" value="true"/>',
                  '\t\t\t\t<param name="limit" value="0"/>',
                  '\t\t\t\t<param name="row_visible" value="{} + String.IsEqual({},true)"/>'.format(ACTIVE, PROPERTY.format('has.' + kind)),
                  '\t\t\t\t<param name="hide" value="$EXP[MilCineDetailAbove_{}]"/>'.format(kind),
                  '\t\t\t\t<param name="widget_header" value="{}"/>'.format(header),
                  '\t\t\t\t<param name="content" value="$VAR[MilDetailContent_{}]"/>'.format(kind),
                  '\t\t\t</include>']
    lines += ['\t\t</control>', '\t\t</control>', '\t</include>', '</includes>']
    return '\n'.join(lines) + '\n'


if __name__ == '__main__':
    for look, out in ((cinema.CLASSIC, OUT), (cinema.MODERN, MODERN_OUT)):
        out.write_text(build(look), encoding='utf-8')
        print('wrote', out)
