import obspython as obs
import datetime
import os

# --- Globals ---
hotkey_id = obs.OBS_INVALID_HOTKEY_ID
start_time = None
markers = []
chapter_length = 1.0
continuous_mode = False

# --- Script Meta ---
def script_description():
    return (
        "Creates chapter markers as subtitles:\n"
        "• Chapter 0 = 0.5 seconds\n"
        "• Chapter 1+ have either a fixed length (settable) or last until the next marker\n"
        "Hotkey: Numpad 5"
    )

def script_properties():
    props = obs.obs_properties_create()
    obs.obs_properties_add_float_slider(
        props, "chapter_length", "Chapter Length (seconds, fixed mode)", 
        0.1, 30.0, 0.1
    )
    obs.obs_properties_add_bool(
        props, "continuous_mode", 
        "Chapters end only when next marker is set (continuous mode)"
    )
    return props

def script_update(settings):
    global chapter_length, continuous_mode
    chapter_length    = obs.obs_data_get_double(settings, "chapter_length")
    continuous_mode   = obs.obs_data_get_bool(settings, "continuous_mode")

def script_load(settings):
    global hotkey_id
    script_update(settings)  # Load initial values
    hotkey_id = obs.obs_hotkey_register_frontend(
        "chapter_subtitles.hotkey", "Set Chapter Marker", on_hotkey
    )
    array = obs.obs_data_get_array(settings, "hotkey")
    obs.obs_hotkey_load(hotkey_id, array)
    obs.obs_data_array_release(array)
    obs.obs_frontend_add_event_callback(on_event)

def script_save(settings):
    array = obs.obs_hotkey_save(hotkey_id)
    obs.obs_data_set_array(settings, "hotkey", array)
    obs.obs_data_array_release(array)

# --- Event-Handler ---
def on_event(event):
    global start_time, markers
    if event == obs.OBS_FRONTEND_EVENT_RECORDING_STARTED:
        start_time = datetime.datetime.now()
        markers = [0.0]  # Chapter 0 at 0s
        obs.script_log(obs.LOG_INFO, "Chapter tracking started")
    elif event == obs.OBS_FRONTEND_EVENT_RECORDING_STOPPED:
        write_srt()

def on_hotkey(pressed):
    global markers, start_time
    if not pressed or start_time is None:
        return
    delta = (datetime.datetime.now() - start_time).total_seconds()
    markers.append(delta)
    obs.script_log(obs.LOG_INFO, f"Chapter at {format_time(delta)} set")

# --- SRT Generation ---
def write_srt():
    recording_path = obs.obs_frontend_get_last_recording()
    if not recording_path:
        obs.script_log(obs.LOG_ERROR, "Recording filename not found!")
        return

    base, _ = os.path.splitext(recording_path)
    srt_path = base + ".srt"

    # In continuous mode, calculate total recording time
    total_duration = None
    if continuous_mode:
        total_duration = (datetime.datetime.now() - start_time).total_seconds()

    with open(srt_path, "w", encoding="utf-8") as f:
        for idx, t in enumerate(markers):
            start = format_time(t)

            if idx == 0:
                end_time = t + 0.5
            else:
                if continuous_mode:
                    # End at next marker or end of recording
                    end_time = markers[idx+1] if idx+1 < len(markers) else total_duration
                else:
                    end_time = t + chapter_length

            end = format_time(end_time)
            title = f"Chapter {idx}"
            f.write(f"{idx+1}\n{start} --> {end}\n{title}\n\n")

    obs.script_log(obs.LOG_INFO, f"SRT written to: {srt_path}")

# --- Time Formatter ---
def format_time(seconds):
    h  = int(seconds // 3600)
    m  = int((seconds % 3600) // 60)
    s  = int(seconds % 60)
    ms = int((seconds - int(seconds)) * 1000)
    return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"

def script_unload():
    obs.obs_frontend_remove_event_callback(on_event)
    obs.obs_hotkey_unregister(hotkey_id)