import os
from faster_whisper import WhisperModel

CHUNKS_DIR = "/home/tebresaneh/public_html/vieraclient/downloads/chunks"
LOCAL_MODELS_DIR = "/home/tebresaneh/public_html/vieraclient/local_models"

# تنظیمات پردازش
MODEL_NAME = "large-v3"
CPU_THREADS = 4
LANGUAGE = "fa"


def format_timestamp(seconds):
    """
    تبدیل ثانیه به فرمت HH:MM:SS
    """
    seconds = int(seconds)

    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    secs = seconds % 60

    return f"{hours:02d}:{minutes:02d}:{secs:02d}"


def transcribe_chunks():

    # ---------------------------------------------------------
    # بررسی پوشه chunks
    # ---------------------------------------------------------

    if not os.path.exists(CHUNKS_DIR):
        print("❌ پوشه chunks پیدا نشد!")
        return

    # ---------------------------------------------------------
    # پیدا کردن فایل‌های ویدیویی
    # ---------------------------------------------------------

    chunk_files = sorted([
        f
        for f in os.listdir(CHUNKS_DIR)
        if f.startswith("chunk_") and f.lower().endswith(".mp4")
    ])

    if not chunk_files:
        print("❌ هیچ قطعه ویدیویی برای تبدیل وجود ندارد!")
        return

    print(f"📁 تعداد قطعات پیدا شده: {len(chunk_files)}")
    print(f"🧠 مدل: {MODEL_NAME}")
    print(f"⚙️ CPU Threads: {CPU_THREADS}")
    print("🎙 در حال بارگذاری Whisper...")
    print("")

    # ---------------------------------------------------------
    # بارگذاری مدل
    # ---------------------------------------------------------

    model = WhisperModel(
        MODEL_NAME,
        device="cpu",
        compute_type="int8",
        cpu_threads=CPU_THREADS,
        download_root=LOCAL_MODELS_DIR
    )

    print("✅ مدل با موفقیت بارگذاری شد.")
    print("")

    # ---------------------------------------------------------
    # پردازش قطعات
    # ---------------------------------------------------------

    for index, filename in enumerate(chunk_files, start=1):

        video_path = os.path.join(CHUNKS_DIR, filename)

        txt_filename = filename[:-4] + ".txt"
        txt_path = os.path.join(CHUNKS_DIR, txt_filename)

        # -----------------------------------------------------
        # اگر قبلاً پردازش شده
        # -----------------------------------------------------

        if os.path.exists(txt_path):

            print(
                f"⏩ [{index}/{len(chunk_files)}] "
                f"{filename} قبلاً پردازش شده است."
            )

            continue

        print("=" * 70)
        print(
            f"🎬 [{index}/{len(chunk_files)}] "
            f"در حال پردازش: {filename}"
        )
        print("=" * 70)

        try:

            # -------------------------------------------------
            # Whisper
            # -------------------------------------------------

            segments, info = model.transcribe(
                video_path,

                # زبان
                language=LANGUAGE,

                # جستجوی بهتر بین گزینه‌های احتمالی
                beam_size=5,

                # تشخیص قسمت‌های بدون گفتار
                vad_filter=True,

                # استفاده از context قبلی
                condition_on_previous_text=True,

                # برای transcription پایدار
                temperature=0,

                # جلوگیری از تشخیص اشتباه بخش‌های بدون صدا
                no_speech_threshold=0.6,

                # تشخیص خروجی‌های غیرعادی و تکراری
                compression_ratio_threshold=2.4
            )

            # -------------------------------------------------
            # ساخت خروجی
            # -------------------------------------------------

            output_lines = []

            segment_count = 0

            for segment in segments:

                text = segment.text.strip()

                if not text:
                    continue

                start = format_timestamp(segment.start)
                end = format_timestamp(segment.end)

                output_lines.append(
                    f"[{start} --> {end}] {text}"
                )

                segment_count += 1

            # -------------------------------------------------
            # بررسی نتیجه
            # -------------------------------------------------

            if not output_lines:

                print(f"⚠️ برای {filename} هیچ متنی تشخیص داده نشد.")

                continue

            # -------------------------------------------------
            # ذخیره فایل
            # -------------------------------------------------

            full_text = "\n".join(output_lines)

            with open(
                txt_path,
                "w",
                encoding="utf-8"
            ) as f:

                f.write(full_text)

            print("")
            print(f"✅ پردازش تمام شد: {filename}")
            print(f"📝 خروجی: {txt_filename}")
            print(f"📌 تعداد segmentها: {segment_count}")
            print(
                f"🌐 زبان تشخیص داده شده: "
                f"{info.language} "
                f"({info.language_probability:.2f})"
            )
            print("")

        except Exception as e:

            print("")
            print(f"❌ خطا در پردازش {filename}")
            print(f"   {type(e).__name__}: {e}")
            print("")

            # ادامه پردازش قطعات بعدی
            continue

    # ---------------------------------------------------------
    # پایان
    # ---------------------------------------------------------

    print("=" * 70)
    print("🎉 پردازش تمام قطعات به پایان رسید.")
    print("=" * 70)


if __name__ == "__main__":
    transcribe_chunks()