import os
import time
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By

# --- НАСТРОЙКИ ---
OBSIDIAN_PATH = r"D:\Work\Software_Development\Projects\ttrpg-obsidian-vault\scripts\transcrib\VK_Call_Notes.md"
CHECK_INTERVAL = 0.5  # Частота проверки текста
RECONNECT_INTERVAL = 6.0 # Частота поиска вкладки

def append_to_obsidian(text, new_line=True):
    """
    Записывает текст. 
    new_line=True: создает новую строку с таймстампом.
    new_line=False: дописывает в конец существующей строки.
    """
    try:
        with open(OBSIDIAN_PATH, "a", encoding="utf-8") as f:
            if new_line:
                timestamp = datetime.now().strftime("\n[%H:%M:%S] ")
                f.write(f"{timestamp}{text}")
            else:
                f.write(f"{text}") # f.write(f" {text}")
        print(f"Дописано: {text}")
    except Exception as e:
        print(f"Ошибка записи: {e}")

def find_vk_tab(driver):
    """Пытается найти и переключиться на вкладку ВК."""
    try:
        for handle in driver.window_handles:
            driver.switch_to.window(handle)
            if "vk.com" in driver.current_url or "Call" in driver.title:
                return True
    except:
        pass
    return False

def run_capture():
    current_dir = os.path.dirname(os.path.abspath(__file__))
    driver_path = os.path.join(current_dir, "geckodriver.exe")
    
    options = Options()
    options.add_argument("--debugger-address 127.0.0.1:9222")
    service = Service(executable_path=driver_path)

    try:
        driver = webdriver.Firefox(service=service, options=options)
        print("--- Соединение с браузером установлено ---")
    except Exception as e:
        print(f"Критическая ошибка: {e}")
        return

    last_text = ""
    active_tab_found = False

    try:
        while True:
            # 1. Если вкладка не найдена — ищем её
            if not active_tab_found:
                if find_vk_tab(driver):
                    print(f"Нашел звонок: {driver.title}. Начинаю слежку...")
                    active_tab_found = True
                else:
                    print("Жду открытия вкладки со звонком ВК...")
                    time.sleep(RECONNECT_INTERVAL)
                    continue

            # 2. Попытка прочитать текст
            try:
                element = driver.find_element(By.CLASS_NAME, "CallsSubtitles__content")
                current_full_text = element.text.strip()

                if current_full_text:
                    # Случай 1: Это продолжение текущей фразы
                    if last_full_text and current_full_text.startswith(last_full_text):
                        # Берем только то, чего еще не было
                        added_part = current_full_text[len(last_full_text):] #.strip()
                        if added_part:
                            append_to_obsidian(added_part, new_line=False)
                            last_full_text = current_full_text
                    
                    # Случай 2: Это абсолютно новая фраза (предыдущая исчезла)
                    elif current_full_text != last_full_text:
                        append_to_obsidian(current_full_text, new_line=True)
                        last_full_text = current_full_text
                
                else:
                    # В элементе пусто — сбрасываем кэш, чтобы следующая фраза шла с новой строки
                    last_full_text = ""

                time.sleep(CHECK_INTERVAL)

            except Exception:
                # Если элемент потерян, сбрасываем состояние
                last_full_text = ""
                try:
                    _ = driver.current_url
                except:
                    print("Вкладка потеряна. Ищу...")
                    active_tab_found = False
                time.sleep(CHECK_INTERVAL)

    except KeyboardInterrupt:
        print("\nСкрипт остановлен.")
    finally:
        print("Сессия завершена.")

if __name__ == "__main__":
    run_capture()
