from pathlib import Path
import re
from difflib import SequenceMatcher

src=Path('/home/spazio/part2_raw.txt')
out=Path('/home/spazio/vedic_dialogue_part2.md')
lines=src.read_text(encoding='utf-8').splitlines()

# Известные дубли голосовых: точные либо очевидные повторные пересылки одной записи.
dup_voice={5,25,43,45,61,69,71,73,75,77,79,81,83,89,91,97,99,101,113,115,117,119,121,123}

margarita_voice={23,27,33,35,39,41,47,49,51,53,55,57,59,85,87,95,125}
# Остальные уникальные голосовые — разбор и ответы астролога Насти.

# Текстовые ответы астролога; остальные текстовые сообщения принадлежат Маргарите.
nastya_text={142,144,146,148,150,164,167,168,170,176,178,179,239,241,244,258,260,263,265,300}

# Осторожные исправления повторяющихся очевидных ошибок ASR и терминологии.
repls=[
(r'(?i)кормическ', 'кармическ'),
(r'(?i)витическ(?:ая|ой|ую|ое|ие|их)?\s+стрологи[яи]', 'ведической астрологии'),
(r'(?i)видическ(?:ая|ой|ую|ое|ие|их)?\s+астрологи[яи]', 'ведической астрологии'),
(r'(?i)ведическ(?:ая|ой|ую|ое|ие|их)?\s+стрологи[яи]', 'ведической астрологии'),
(r'(?i)натальной карции', 'натальной карте'),
(r'(?i)Натальна картийет', 'натальная карта'),
(r'(?i)от\s+макараки', 'атмакараки'),
(r'(?i)от\s+накарки', 'атмакараки'),
(r'(?i)от\s+маетодуша', 'атма — это душа'),
(r'(?i)от\s+макарака', 'атмакарака'),
(r'(?i)макар(?:а)?к', 'карака'),
(r'(?i)рафу', 'Раху'),
(r'(?i)раху', 'Раху'),
(r'(?i)кету', 'Кету'),
(r'(?i)козирог|козилог|козилок|козирук|козерок', 'Козерог'),
(r'(?i)сатурн(?:ом|ым)', 'Сатурном'),
(r'(?i)сатурн', 'Сатурн'),
(r'(?i)миркури[йя]', 'Меркурий'),
(r'(?i)юпитер', 'Юпитер'),
(r'(?i)венерой', 'Венерой'),
(r'(?i)венера', 'Венера'),
(r'(?i)венеры', 'Венеры'),
(r'(?i)венере', 'Венере'),
(r'(?i)венеру', 'Венеру'),
(r'(?i)марс', 'Марс'),
(r'(?i)на\s*кшат', 'накшат'),
(r'(?i)на\s+вамш', 'навамш'),
(r'(?i)навамшу карта', 'карту Навамша'),
(r'(?i)дашамш', 'Дашамш'),
(r'(?i)логнежь|лагнежь', 'лагнеш'),
(r'(?i)логн(?:а|ы|е|у|ой)', 'лагна'),
(r'(?i)задекальн', 'зодиакальн'),
(r'(?i)экзальтаци[яиею]', 'экзальтации'),
(r'(?i)сов?окшетра|вакшетра', 'свакшетра'),
(r'(?i)гарманиз|карманиз', 'гармониз'),
(r'(?i)диспект', 'аспект'),
(r'(?i)заземлени', 'заземлени'),
(r'(?i)партненств', 'партнёрств'),
(r'(?i)замотношени', 'взаимоотношени'),
(r'(?i)прогностико', 'прогностика'),
(r'(?i)не\s+месила', 'положение'),
(r'(?i)домом потеря', 'домом потерь'),
(r'(?i)за\s+стоя', 'застоя'),
(r'(?i)на\s+и\s+высш', 'наивысш'),
(r'(?i)неразличного планы', 'различного плана'),
(r'(?i)стетик', 'эстетик'),
(r'(?i)инфантелизм', 'инфантилизм'),
(r'(?i)прикладывания ответственности', 'перекладывания ответственности'),
(r'(?i)не реализованност', 'нереализованност'),
]

def clean(s):
    s=s.strip()
    for pat,rep in repls:
        s=re.sub(pat,rep,s)
    # Явные типографические и пунктуационные огрехи без переписывания живой речи.
    s=re.sub(r'\s+([,.!?;:])', r'\1', s)
    s=re.sub(r'([,.!?;:])(?=[А-ЯЁA-Z])', r'\1 ', s)
    s=re.sub(r' {2,}', ' ', s)
    s=s.replace('т.е.', 'то есть').replace('Т.е.', 'То есть')
    # Остаточные устойчивые и очевидные искажения терминов после ASR.
    for a,b in {
        'видеческая стрология':'ведическая астрология',
        'видической астрологии':'ведической астрологии',
        'аткаракаа':'атмакарака',
        'аткаракаи':'атмакараки',
        'аткарака':'атмакарака',
        'на к шатру':'накшатру',
        'на кшатру':'накшатру',
        'Дашамша называется до 10 к':'Дашамша, D10',
        'карта Навамша д-9':'карту Навамша D9',
        'период уны':'период Луны',
        'период, допустим, не Питера':'период, допустим, Юпитера',
        'ретроггадная':'ретроградная',
        'в водолей':'в Водолее',
        'в водолевре':'Водолей',
    }.items(): s=s.replace(a,b)
    s=s.replace(' - ', ' — ')
    if s and s[0].isalpha(): s=s[0].upper()+s[1:]
    return s

def voice_payload(l):
    x=l.split('said: "',1)[1]
    return x[:-2] if x.endswith('"]') else x

items=[]
pending_reply=False
for num,l in enumerate(lines,1):
    if not l.strip(): continue
    if num in dup_voice: continue
    if l.startswith('[Replied-to audio'):
        pending_reply=True
        continue
    if 'voice message' in l[:100]:
        speaker='Маргарита' if num in margarita_voice else 'Настя'
        text=clean(voice_payload(l))
        note='голосовое сообщение'
    else:
        if l.strip()=='Конец': continue
        speaker='Настя' if num in nastya_text else 'Маргарита'
        text=clean(l)
        note='текстовое сообщение'
    if pending_reply:
        note += '; в ответ на голосовое сообщение'
        pending_reply=False
    items.append((speaker,note,text,num))

parts=['# Ведический разбор — диалог, часть 2','',
       '> Хронологическая расшифровка голосовых и текстовых сообщений. Точные и очевидные повторные пересылки целых сообщений удалены. Тематические пометки и связи ответов сохранены.','']
for speaker,note,text,num in items:
    parts.append(f'**{speaker}** *({note})*')
    parts.append('')
    parts.append(text)
    parts.append('')
out.write_text('\n'.join(parts).rstrip()+'\n',encoding='utf-8')
print(f'replicas={len(items)}')
print(f'duplicates_removed={len(dup_voice)}')
print(f'bytes={out.stat().st_size}')
print(f'chars={len(out.read_text(encoding="utf-8"))}')
print(f'path={out}')
