"""Ofis bazlı DOCX biçim kuralları — TR / EP / US.

Drafting zaten jurisdiction-aware (ayrı sistem promptları, şekli inceleme
kuralları, değişiklik evrakı şablonları). Export değildi: EP/US seçen
kullanıcı doğru dilde taslak alıp TürkPatent formatında, Türkçe adlı ve
dosyalanamaz bir DOCX ile kalıyordu.

Burası o boşluğu kapatan tek kaynak. `amendment.py`'deki `_TEMPLATES`
desenini izler: biçim helper'ları ortak, ofise özel değerler sözlükte.

Kaynaklar:
  TR — TÜRKPATENT Patent Başvuru Kılavuzu (A4, 20/25/20/20 mm, her 5
       satırda satır numarası, resim sayfaları 25/25/15/10 mm)
  EP — Rule 49 EPC: (5) kenar boşlukları asgari üst 2 cm / sol 2,5 cm /
       sağ 2 cm / alt 2 cm; (7) tarifnamenin her beşinci satırı numaralanır.
       Çizimler Rule 46(1): üst 2,5 / sol 2,5 / sağ 1,5 / alt 1 cm.
  US — 37 CFR 1.52(a): kâğıt A4 (21,0 × 29,7 cm) VEYA letter
       (21,6 × 27,9 cm); kenar boşlukları asgari sol 2,5 / üst 2,0 /
       sağ 2,0 / alt 2,0 cm; 1,5 satır aralığı; 12 punto önerilir.
       Satır numarası ZORUNLU DEĞİL ama 1.52(b)(6) ile açıkça serbest —
       inceleme uzmanının atıf vermesini kolaylaştırdığı için korunur.
       Çizimler 37 CFR 1.84(g): üst 2,5 / sol 2,5 / sağ 1,5 / alt 1 cm.

US için varsayılan kâğıt letter'dır: A4 de kabul edilir ama ABD pratiğinde
letter beklenir ve iki seçenek arasında ofis tercihi budur.
"""

from __future__ import annotations

from dataclasses import dataclass
from enum import StrEnum


class Jurisdiction(StrEnum):
    """Hedef patent ofisi.

    `app.services.formality.models.Jurisdiction` ile aynı değerleri taşır;
    docx katmanının formality'ye bağımlı olmaması için burada ayrıca
    tanımlıdır (StrEnum olduğu için değerler karşılıklı kabul edilir).
    """

    TR = "TR"
    EP = "EP"
    US = "US"


@dataclass(frozen=True)
class Margins:
    """Kenar boşlukları, mm."""

    top: float
    left: float
    right: float
    bottom: float


@dataclass(frozen=True)
class OfficeSpec:
    """Bir patent ofisinin DOCX çıktı kuralları."""

    #: Sayfa boyutu (mm) — A4 210×297, US letter 215.9×279.4
    page_width_mm: float
    page_height_mm: float
    #: Tarifname / istem / özet sayfaları
    text_margins: Margins
    #: Şekil sayfaları (farklı kural)
    figure_margins: Margins
    #: Her 5 satırda sol kenar satır numarası
    line_numbering: bool
    #: Belge başlıkları (ofisin dilinde)
    heading_description: str
    heading_claims: str
    heading_abstract: str
    #: ZIP içindeki dosya adları
    filename_description: str
    filename_claims: str
    filename_abstract: str
    filename_figures: str
    #: ZIP adındaki ofis etiketi
    package_label: str
    #: Şekil başlığı öneki ("Şekil 1" / "Figure 1")
    figure_caption_prefix: str


# Rule 49(5) EPC ve TÜRKPATENT kılavuzu aynı asgari değerleri veriyor;
# 37 CFR 1.52(a)(1)(iv) de sayısal olarak aynı (yalnızca kâğıt farklı).
_TEXT_MARGINS = Margins(top=20, left=25, right=20, bottom=20)

# Rule 46(1) EPC ve 37 CFR 1.84(g) çizim sayfası için aynı değerleri veriyor.
_FIGURE_MARGINS = Margins(top=25, left=25, right=15, bottom=10)


_SPECS: dict[Jurisdiction, OfficeSpec] = {
    Jurisdiction.TR: OfficeSpec(
        page_width_mm=210,
        page_height_mm=297,
        text_margins=_TEXT_MARGINS,
        figure_margins=_FIGURE_MARGINS,
        line_numbering=True,
        heading_description="TARİFNAME",
        heading_claims="İSTEMLER",
        heading_abstract="ÖZET",
        filename_description="Tarifname",
        filename_claims="Istemler",
        filename_abstract="Ozet",
        filename_figures="Resimler",
        package_label="TurkPatent",
        figure_caption_prefix="Şekil",
    ),
    Jurisdiction.EP: OfficeSpec(
        page_width_mm=210,
        page_height_mm=297,
        text_margins=_TEXT_MARGINS,
        figure_margins=_FIGURE_MARGINS,
        line_numbering=True,  # Rule 49(7) EPC — zorunlu
        heading_description="DESCRIPTION",
        heading_claims="CLAIMS",
        heading_abstract="ABSTRACT",
        filename_description="Description",
        filename_claims="Claims",
        filename_abstract="Abstract",
        filename_figures="Drawings",
        package_label="EPO",
        figure_caption_prefix="Figure",
    ),
    Jurisdiction.US: OfficeSpec(
        # 37 CFR 1.52(a)(1)(ii) — letter, ABD pratiğinin beklediği boyut
        page_width_mm=215.9,
        page_height_mm=279.4,
        text_margins=_TEXT_MARGINS,
        figure_margins=_FIGURE_MARGINS,
        line_numbering=True,  # 1.52(b)(6) ile serbest, uzman atfını kolaylaştırır
        heading_description="DESCRIPTION",
        heading_claims="CLAIMS",
        heading_abstract="ABSTRACT",
        filename_description="Description",
        filename_claims="Claims",
        filename_abstract="Abstract",
        filename_figures="Drawings",
        package_label="USPTO",
        figure_caption_prefix="Figure",
    ),
}


def get_office_spec(jurisdiction: Jurisdiction | str | None) -> OfficeSpec:
    """Ofis biçim kurallarını döner; bilinmeyen/boş değer TR'ye düşer.

    TR'ye düşmek bilinçli: ürünün varsayılan ofisi TÜRKPATENT ve eksik bir
    alan yüzünden export'un tamamen patlaması, yanlış marjla çıkmasından
    daha kötüdür.
    """
    if jurisdiction is None:
        return _SPECS[Jurisdiction.TR]
    try:
        key = Jurisdiction(str(jurisdiction).upper())
    except ValueError:
        return _SPECS[Jurisdiction.TR]
    return _SPECS[key]
