from pathlib import Path
import re

src = Path('/home/spazio/part1_raw.txt').read_text(encoding='utf-8').splitlines()
voices = {}
for i, line in enumerate(src, 1):
    if line.startswith('[The user sent a voice message~'):
        m = re.match(r'^\[The user sent a voice message~ Here\'s what they said: "(.*)"\]$', line)
        if not m:
            raise RuntimeError(f'Cannot parse voice line {i}')
        voices[i] = m.group(1)

# Exact duplicate forwarded voice messages in the raw extraction.
for dup in (27, 31):
    voices.pop(dup, None)

nastya = {1,5,19,25,33,37,43,49,55,63,65,67,69,71,73,75,77,79,81,83,85,89,91,93,95,97,99,101,103,105,107,109,111,119}
# Everything else is Margarita's reply/comment.

# Conservative corrections of recurring, unambiguous ASR errors and Vedic terms.
repls = [
    (r'\bвидеческ', 'ведическ'), (r'\bВидеческ', 'Ведическ'), (r'\bвведическ', 'ведическ'),
    (r'\bнак\s*шат', 'накшат'), (r'\bна\s*к\s*шат', 'накшат'), (r'\bнокшат', 'накшат'),
    (r'\bнахшат', 'накшат'), (r'\bмаркшат', 'накшат'), (r'\bпшатры\b', 'накшатры'),
    (r'\bКето\b', 'Кету'), (r'\bкету\b', 'Кету'), (r'\bраху\b', 'Раху'),
    (r'\bлогныш', 'лагнеш'), (r'\bлагныш', 'лагнеш'), (r'\bлагнешко', 'лагнеш'),
    (r'\bатма\s*кара', 'атмакара'), (r'\bот\s*макара', 'атмакара'), (r'\bотмакара', 'атмакара'),
    (r'\bна\s*вам\s*ш', 'навамш'), (r'\bНавамш', 'Навамш'),
    (r'\bРахине\b', 'Рохини'), (r'\bрахине\b', 'Рохини'),
    (r'\bШираван', 'Шраван'), (r'\bшираван', 'шраван'), (r'\bшрабан', 'шраван'), (r'\bшаван', 'шраван'),
    (r'\bПуши\b', 'Пушья'), (r'\bпуши\b', 'Пушья'), (r'\bпущая\b', 'Пушья'),
    (r'\bОшлеш', 'Ашлеш'), (r'\bошлеш', 'ашлеш'), (r'\bпроошлеш', 'про Ашлеш'),
    (r'\bПурвапхалагуни', 'Пурва-Пхалгуни'), (r'\bпурва-пхолагуни', 'Пурва-Пхалгуни'),
    (r'\bпурва-шатха', 'Пурва-Ашадха'),
    (r'\bказерок', 'Козерог'), (r'\bкозерок', 'Козерог'), (r'\bкозирок', 'Козерог'),
    (r'\bсатурным\b', 'Сатурном'), (r'\bсатур\b', 'Сатурн'), (r'\bсо турым\b', 'Сатурн'),
    (r'\bюпитер\b', 'Юпитер'), (r'\bвенера\b', 'Венера'), (r'\bмеркури\b', 'Меркурий'), (r'\bМиркури\b', 'Меркурий'),
    (r'\bсонц', 'солнц'), (r'\bСонц', 'Солнц'), (r'\bслуной\b', 'с Луной'), (r'\bполуне\b', 'по Луне'),
    (r'\bуна\b', 'Луна'), (r'\bУна\b', 'Луна'),
    (r'\bкормическ', 'кармическ'), (r'\bсанастроились', 'сонастроились'),
    (r'\bсидрическ', 'сидерическ'), (r'\bдьетиш\b', 'джйотиш'),
    (r'\bбенэфик', 'бенефик'), (r'\bбинэфик', 'бенефик'), (r'\bмолефик', 'малефик'),
    (r'\bретроггадн', 'ретроградн'), (r'\bсажж[её]н', 'сожжён'), (r'\bсожжон', 'сожжён'),
    (r'\bэкзальтаци', 'экзальтаци'),
    (r'\bтхарма\b', 'дхарма'), (r'\bтхарме\b', 'дхарме'), (r'\bмукше\b', 'мокше'),
    (r'\bБрехоспат', 'Брихаспат'), (r'\bбрихоспат', 'Брихаспат'),
    (r'\bпраджопат', 'Праджапат'), (r'\bПрахма\b', 'Брахма'),
    (r'\bруны\b', 'руны'),
]

def clean(s: str) -> str:
    for pat, val in repls:
        s = re.sub(pat, val, s, flags=re.IGNORECASE if pat.startswith('(?i)') else 0)
    s = re.sub(r'\s+', ' ', s).strip()
    # Punctuation/spacing only; keep the speaker's live syntax and repetitions.
    s = re.sub(r'\s+([,.;:!?])', r'\1', s)
    s = re.sub(r',(?=\S)', ', ', s)
    s = re.sub(r'([.!?])(?=[А-ЯЁ])', r'\1 ', s)
    # Do not fabricate text where the source ASR collapsed into unrelated languages/encoding noise.
    s = s.replace('пол��은е то есть полонутся, колендает вот тебе, нужно жить именно в trong handles maskedстройение', '[неразборчиво]')
    if 'Ultimately она не дает' in s:
        s = ('Мама питает, [неразборчиво]. Пропитание очень важно, и, собственно говоря, в детстве была проблема: '
             'она растила одна и всегда была в фокусе на том, чтобы меня прокормить и себя прокормить, чтобы не остаться голодными, '
             'потому что были сложные времена. Поэтому [неразборчиво].')
    return s

out = ['# Ведический разбор: диалог Насти и Маргариты — часть 1', '']
count = 0

def say(who, text):
    global count
    out.append(f'**{who}:** {clean(text)}')
    out.append('')
    count += 1

def image(path):
    out.append(f'[ИЗОБРАЖЕНИЕ: {path}]')
    out.append('')

# Context messages preceding the chart discussion.
for n in (1,3): say('Настя' if n in nastya else 'Маргарита', voices[n])
say('Маргарита', '14.08.1990, Сургут (ХМАО), 20:40')
image('/home/spazio/.hermes/cache/images/img_efe5f90da623.jpg')
say('Настя', 'Это твоя карта для наглядности.')

for n in sorted(voices):
    if n in (1,3): continue
    say('Настя' if n in nastya else 'Маргарита', voices[n])
    if n == 5:
        say('Маргарита', 'Про Рака надо поизучать. Его нужно читать в контексте ведической астрологии? Мало что про него знаю.')
    if n == 19:
        say('Маргарита', 'Супер, поняла разницу.')
        say('Маргарита', 'Звучит круто, более основательно и глубоко — мне очень нравится.')
    if n == 37:
        say('Маргарита', 'Судьба 😂')
        say('Маргарита', 'Про свинку поняла)))')
        say('Маргарита', 'На-а-а-а-а-а-астя-я-я-я 😍 Сейчас аудио запишу.')
    if n == 43:
        image('/home/spazio/.hermes/cache/images/img_0f89aabfd732.jpg')
        image('/home/spazio/.hermes/cache/images/img_7ebe8f61600d.jpg')
    if n == 45:
        say('Настя', 'Накшатра (санскр. nakṣatra, «созвездие») — созвездия в индийской астрономии и астрологии, так называемые «лунные стоянки» или «лунные дома», через которые проходит Луна за свой месячный цикл. Как и в зодиакальной системе, каждая накшатра является частью эклиптики с тем отличием, что градус накшатры составляет 13°20′, а знака зодиака — 30°. Всего накшатр 27 — именно столько созвездий проходит Луна за свой месячный цикл, за день она проходит примерно одну накшатру (сидерический лунный месяц — 27,322 суток).')
        image('https://c8.alamy.com/compde/hn8d7r/astrologie-mondstation-shravana-nakshatra-hn8d7r.jpg')
    if n == 63:
        say('Маргарита', 'Да, понимаю.')
    if n == 87:
        say('Настя', 'Лунная карта ⤵️')
    if n == 89:
        say('Настя', 'Навамша (наша эволюция и наши отношения) ⬇️')
    if n == 91:
        say('Настя', 'Кармические задачи. Ретроградные планеты ⤵️')
    if n == 93:
        say('Настя', 'Атмакарака ⤵️')
    if n == 95:
        say('Настя', 'Раху и Кету ⤵️')
    if n == 99:
        say('Настя', '🟡 Солнце и Луна. Луна ⬇️')
    if n == 101:
        say('Настя', 'Дополнение по Луне ⬇️')
    if n == 103:
        say('Настя', 'Солнце ⬇️')
    if n == 105:
        say('Настя', 'Сожжённые планеты ⬇️')
    if n == 107:
        say('Настя', 'Сожжённая Венера ⬇️')
    if n == 109:
        say('Настя', 'Сожжённый Юпитер ⬇️')

Path('/home/spazio/vedic_dialogue_part1.md').write_text('\n'.join(out).rstrip()+'\n', encoding='utf-8')
print(f'voices={len(voices)} replicas={count} images={sum(1 for x in out if x.startswith("[ИЗОБРАЖЕНИЕ:"))}')
