import requests
import json
import os
import subprocess

'''
apt-get install -y podman
podman run -P -p 8765:8765 lowerquality/gentle
'''


def load_subs():
    subtitles = {}
    for url in """
https://textb.org/r/t_for_time_subtitles_1_melodic/
https://textb.org/r/t_for_time_subtitles_2_whispered/
https://textb.org/r/t_for_time_subtitles_3_free/
https://textb.org/r/t_for_time_subtitles_4_read/
https://textb.org/r/t_for_time_subtitles_5_ashley/
""".strip().split('\n'):
        data = requests.get(url).text
        parts = data.strip().split('##')
        print(url)
        prefix = '/srv/t_for_time/vo/' + url.split('/')[-2].split('subtitles_')[-1]
        for part in parts:
            part = part.strip().split('\n')
            if part:
                title = part[0]
                text = "\n".join(part[1:]).strip()
                if text:
                    fname = '%s_%s.txt' % (prefix, title)
                    with open(fname, 'w') as fd:
                        fd.write(text)


def gentle2subtitles(align):
    new_block = '\r\n\r\n'
    if new_block not in align['transcript']:
        new_block = '\n\n'

    data = []
    end = 0

    for block in align['transcript'].split(new_block):
        if not block.strip():
            continue
        start = end
        end += len(block)
        in_ = -1
        out_ = -1
        for word in align['words']:
            if word['startOffset'] < start:
                continue
            if word.get('case') == 'not-found-in-audio':
                continue
            if in_ == -1:
                in_ = word['start']
                out_ = word['end']
            if word['endOffset'] > end:
                break
            if 'end' in word:
                out_ = word['end']
            if word['endOffset'] == end:
                break

        data.append({
            'in': in_, 'out': out_, 'value': block.replace('\r\n', '\n')
        })
        end += len(new_block)
    return data


def align_text(txt, wav):
    cmd = ['curl', '-s', '-F', 'audio=@' + wav, '-F', 'transcript=@%s' % txt,
           'http://localhost:8765/transcriptions?async=false']
    data = subprocess.check_output(cmd).decode()
    return json.loads(data)


def update_subtitles():
    import item.models
    from annotation.tasks import add_annotations

    load_subs()
    for i in item.models.Item.objects.filter(data__type=['Voice Over']):
        wav = i.files.filter(selected=True)[0].data.path
        id = i.get('title').split('_')[0]
        batch = i.get('batch')[0][5:].lower().replace('-', '_').replace(' ', '')
        txt = '/srv/t_for_time/vo/%s_%s.txt' % (batch, id)
        if os.path.exists(txt):
            print(i, wav, txt)
            subtitles = gentle2subtitles(align_text(txt, wav))
            add_annotations({
                'item': i.public_id,
                'layer': 'subtitles',
                'user': 'j',
                'annotations': subtitles
            })