import vapoursynth as vs

from tanteidan_common import (PrettyConfig, PrettySource, antialias, deband, denoise, finalize, regrain)

from yt_common.automation import SelfRunner
from yt_common.source import waka_replace

from typing import List
from lvsfunc.dehardsub import HardsubLineFade, HardsubMask, HardsubSign, bounded_dehardsub
from lvsfunc.types import Range
from lvsfunc.misc import replace_ranges

import os


core = vs.core


EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
CONFIG: PrettyConfig = PrettyConfig(EPNUM)
SOURCE: PrettySource = PrettySource(CONFIG)

WAKA_REPLACE: List[List[Range]] = [
    [(31865, 32653)],
    [],
]

SIGNS_RU: List[HardsubMask] = [
    HardsubLineFade([
        (6586, 6611),
        (6813, 6839),
        (6954, 6971),
        (7092, 7115),
        (7242, 7289),
        (7461, 7511),
        (7512, 7535),
        (7697, 7727),
        (8345, 8371),
        (8833, 8860),
        (9950, 10114),
        (11234, 11266),
        (11747, 11986),
        (12113, 12136),
        (28429, 28477),
        (28502, 28537),
    ], ((449, 51), (1015, 127)), refframe=0.75),  # wtf waka fr
    HardsubSign((0, 167), ((67, 71), (793, 253)), refframes=0),
    HardsubSign((349, 395), ((1492, 733), (263, 100)), refframes=395),
    HardsubSign((492, 813), ((132, 322), (664, 207)), refframes=492),
    HardsubSign((2185, 2239), ((634, 302), (641, 111)), refframes=2239),
    HardsubSign((6426, 6485), ((435, 374), (1087, 104))),
    HardsubSign((7728, 7787), ((372, 369), (1239, 109))),
    HardsubSign((8970, 9034), ((1424, 77), (383, 75)), refframes=9034),
    HardsubSign((9830, 9886), ((1397, 41), (414, 83)), refframes=9886),
    HardsubSign((10997, 11044), ((1509, 180), (284, 68)), refframes=11044),
    HardsubSign((12044, 12112), ((1484, 44), (296, 73)), refframes=12112),
    HardsubSign((13298, 13368), ((559, 375), (824, 102))),
    HardsubSign((13441, 13476), ((1464, 656), (338, 67))),
    HardsubSign((13477, 13518), ((158, 657), (323, 78))),
    HardsubSign((15577, 15648), ((1296, 806), (457, 103))),
    HardsubSign((15577, 15648), ((143, 66), (341, 103))),
    HardsubSign((16351, 16422), ((704, 370), (541, 109))),
    HardsubSign((16651, 16699), ((1058, 404), (462, 88)), refframes=16651),
    HardsubSign((17554, 17692), ((732, 100), (393, 80)), refframes=17554),
    HardsubSign((17554, 17692), ((609, 777), (393, 80)), refframes=17554),
    HardsubSign((18487, 18638), ((474, 72), (979, 90)), refframes=18615),
    HardsubSign((19099, 19152), ((667, 372), (609, 104))),
    HardsubSign((20641, 20676), ((516, 0), (1042, 65))),
    HardsubSign((21124, 21179), ((681, 378), (601, 94))),
    HardsubSign((22428, 22451), ((555, 93), (823, 135))),
    HardsubSign((31793, 31864), ((740, 176), (445, 92))),
    HardsubSign((31793, 31864), ((352, 617), (1229, 92))),
    HardsubSign((31793, 31864), ((1355, 794), (329, 92))),
]


AA_WEAK: List[Range] = [
    (6426, 6485),
    (7728, 7787),
    (13298, 13368),
    (16351, 19152),
    (20641, 20676),
    (21124, 21179),
    (23952, 24023),
]


def filter_basic() -> vs.VideoNode:
    wakas, ref = SOURCE.source()
    wakas = [w[0] + w for w in wakas]
    waka = wakas[0]
    waka, wakas = waka_replace(waka, wakas[1:], WAKA_REPLACE)
    waka = replace_ranges(waka, ref, [(30497, 30556)])  # wth wakanim
    src = bounded_dehardsub(waka, ref, SIGNS_RU, wakas)
    src.set_output(1)
    return src


def filter() -> vs.VideoNode:
    src = filter_basic()
    den = denoise(src)
    deb = deband(den)
    aa = antialias(deb, weak=AA_WEAK)
    grain = regrain(aa)
    final = finalize(grain)
    final.set_output()
    return final


if __name__ == "__main__":
    SelfRunner(CONFIG, filter, filter_basic)
else:
    filter()