"""Persian Telegram-facing formatting helpers."""

from __future__ import annotations

import html
from collections.abc import Iterable

from app.database.models import Job, JobStatus, VideoStatus
from app.utils.files import human_size

JOB_STATUS_LABELS: dict[str, str] = {
    JobStatus.PENDING.value: "در صف",
    JobStatus.RUNNING.value: "در حال پردازش",
    JobStatus.PAUSED.value: "متوقف‌شده",
    JobStatus.COMPLETED.value: "تکمیل‌شده",
    JobStatus.FAILED.value: "ناموفق",
    JobStatus.CANCELLED.value: "لغوشده",
}

VIDEO_STATUS_LABELS: dict[str, str] = {
    VideoStatus.PENDING.value: "در انتظار",
    VideoStatus.DOWNLOADING.value: "در حال دانلود",
    VideoStatus.DOWNLOADED.value: "دانلودشده",
    VideoStatus.UPLOADING.value: "در حال ارسال",
    VideoStatus.UPLOADED.value: "ارسال‌شده",
    VideoStatus.FAILED.value: "ناموفق",
    VideoStatus.SKIPPED.value: "ردشده",
    VideoStatus.CANCELLED.value: "لغوشده",
    VideoStatus.UPLOAD_UNKNOWN.value: "وضعیت ارسال نامشخص",
}

STAGE_LABELS: dict[str, str] = {
    "queued": "در صف",
    "crawl": "بررسی صفحات",
    "media": "آماده‌سازی رسانه",
    "download_upload": "دانلود و ارسال",
    "done": "پایان",
}

STATUS_ICONS = {
    JobStatus.PENDING.value: "🕓",
    JobStatus.RUNNING.value: "⚙️",
    JobStatus.PAUSED.value: "⏸",
    JobStatus.COMPLETED.value: "✅",
    JobStatus.FAILED.value: "❌",
    JobStatus.CANCELLED.value: "🚫",
}


def esc(value: object | None) -> str:
    return html.escape(str(value or ""), quote=True)


def safe_url_display(url: str, limit: int = 160) -> str:
    value = " ".join(url.split())
    if len(value) > limit:
        return value[: limit - 1] + "…"
    return value


def status_icon(status: JobStatus | str) -> str:
    value = status.value if isinstance(status, JobStatus) else status
    return STATUS_ICONS.get(value, "ℹ️")


def status_label(status: JobStatus | str) -> str:
    value = status.value if isinstance(status, JobStatus) else status
    return JOB_STATUS_LABELS.get(value, value)


def stage_label(stage: str) -> str:
    return STAGE_LABELS.get(stage, stage)


def short_job_id(job: Job) -> str:
    return job.id[:8]


def format_job_summary(job: Job, *, detail: bool = True) -> str:
    icon = status_icon(job.status)
    label = status_label(job.status)
    lines = [
        f"{icon} <b>عملیات {esc(short_job_id(job))}</b>",
        f"وضعیت: <b>{esc(label)}</b>",
        f"مرحله: {esc(stage_label(job.current_stage))}",
        f"منبع: <code>{esc(safe_url_display(job.source_url))}</code>",
        f"صفحات بررسی‌شده: {job.processed_pages} از {job.total_pages}",
        f"ویدئوهای شناسایی‌شده: {job.total_videos}",
        f"دانلودهای موفق: {job.downloaded_videos}",
        f"ارسال‌های موفق: {job.uploaded_videos}",
        f"خطاها: {job.failed_videos}",
    ]
    if detail:
        lines.extend(
            [
                f"ایجاد: {esc(job.created_at)}",
                f"شروع: {esc(job.started_at or '—')}",
                f"پایان: {esc(job.finished_at or '—')}",
            ]
        )
        if job.error_message:
            lines.append(f"پیام خطا: <code>{esc(job.error_message[:300])}</code>")
    return "\n".join(lines)


def format_jobs_list(jobs: Iterable[Job], *, title: str) -> str:
    jobs = list(jobs)
    if not jobs:
        return f"<b>{esc(title)}</b>\n\nموردی برای نمایش وجود ندارد."
    lines = [f"<b>{esc(title)}</b>", ""]
    for job in jobs:
        lines.append(
            f"{status_icon(job.status)} <code>{esc(short_job_id(job))}</code> — "
            f"{esc(status_label(job.status))}\n"
            f"   منبع: <code>{esc(safe_url_display(job.source_url, 90))}</code>\n"
            f"   ویدئو: {job.uploaded_videos}/{job.total_videos} ارسال موفق"
        )
    return "\n".join(lines)


def format_progress_text(job: Job) -> str:
    return (
        f"{status_icon(job.status)} به‌روزرسانی عملیات <code>{esc(short_job_id(job))}</code>\n"
        f"منبع: <code>{esc(safe_url_display(job.source_url, 100))}</code>\n"
        f"وضعیت: {esc(status_label(job.status))} — {esc(stage_label(job.current_stage))}\n"
        f"صفحات بررسی‌شده: {job.processed_pages}\n"
        f"ویدئوهای شناسایی‌شده: {job.total_videos}\n"
        f"دانلودهای موفق: {job.downloaded_videos}\n"
        f"ارسال‌های موفق: {job.uploaded_videos}\n"
        f"خطاها: {job.failed_videos}"
    )


def format_video_line(title: str, status: VideoStatus | str, size: int | None = None) -> str:
    value = status.value if isinstance(status, VideoStatus) else status
    size_text = f" — {human_size(size)}" if size else ""
    return f"• {esc(title[:80])} — {esc(VIDEO_STATUS_LABELS.get(value, value))}{size_text}"


def format_destination(destination: str | None, fallback_channel: int | None) -> str:
    if destination:
        return f"<code>{esc(destination)}</code>"
    if fallback_channel is not None:
        return f"<code>{esc(fallback_channel)}</code> (پیش‌فرض .env)"
    return "تنظیم نشده"
