import vapoursynth as vs

from toolz.functoolz import compose
from typing import List, Optional, Tuple

import sys
sys.path.append("..")

from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
                       mask_logo, finalize)  # noqa: E402

core = vs.core
core.max_cache_size = 1024

OP: Optional[Tuple[int, int]] = None
ED: Optional[Tuple[int, int]] = None
LOGO: Range = (15790, 15955)
NO_SCALE: List[Range] = [
    (30162, 32320),  # ending credits
]
FORCE_SCALE: List[Range] = [
    (0, 1348),  # credits in intro (if we don't descale, sraa can cause problems with the mask)
]
FADE_RANGES: List[FadeRange] = [
    # fading text elements don't like to be masked rip me
    FadeRange(ref=58, range_=(9, 92)),
    FadeRange(ref=159, range_=(129, 212)),
    FadeRange(ref=251, range_=(219, 291)),
    FadeRange(ref=346, range_=(300, 383)),
    FadeRange(ref=489, range_=(420, 491)),
    FadeRange(ref=709, range_=(666, 748)),
    FadeRange(ref=810, range_=(784, 866)),
    FadeRange(ref=927, range_=(877, 957)),
    FadeRange(ref=1036, range_=(959, 1037)),
    FadeRange(ref=1227, range_=(1167, 1250)),
    FadeRange(ref=1303, range_=(1264, 1347)),

    # title
    FadeRange(ref=1576, range_=(1508, 1591)),
]

W2X_DENOISE: List[Range] = []
if OP is not None:
    W2X_DENOISE.append(
        (OP[0]+1859, OP[0]+1896),  # flashy OP scene
    )

DEBAND_HARD: List[Range] = []
DEBAND_HARDER: List[Range] = []

src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90893/BDMV/STREAM/00008.m2ts")
src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416]
src = src_ep
src = src.fmtc.bitdepth(bits=16)
den = denoise(src)

final = compose(
    finalize,
    mask_logo(src=den, src_logo=src_logo, range=LOGO),
    deband(hard=DEBAND_HARD, harder=DEBAND_HARDER),
    w2x(w2x_range=W2X_DENOISE),
    descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES)
)(den)

final.set_output()