from __future__ import annotations
import asyncio
import logging
import os
from dataclasses import dataclass
from pathlib import Path
from typing import Optional
from PIL import Image, ImageDraw, ImageFont
from assets_embedded import ensure_order_receipt_template

logger = logging.getLogger(__name__)
BASE_DIR = Path(__file__).resolve().parents[1]
DEFAULT_TEMPLATE = BASE_DIR / "runtime" / "receipt_static_labels_template.png"

@dataclass(slots=True)
class CompletedOrderReceipt:
    order_id: int
    completed_at: str
    buyer: str
    product: str
    amount_toman: int

VALUE_POSITIONS = {
    "order_id": (178, 666),
    "completed_at": (178, 764),
    "buyer": (178, 861),
    "product": (178, 958),
    "amount": (270, 1055),
}
TEXT = (245, 243, 249, 255)
GOLD = (255, 193, 0, 255)

def resolve_receipt_template(template_path: Optional[str | Path] = None) -> Path:
    template = Path(template_path or DEFAULT_TEMPLATE)
    if template.is_file() and template.stat().st_size > 0:
        return template
    return ensure_order_receipt_template(template)

def _ascii_font(size: int):
    candidates = []
    windir = os.environ.get("WINDIR")
    if windir:
        win = Path(windir) / "Fonts"
        candidates += [win/"arialbd.ttf", win/"segoeui.ttf", win/"tahoma.ttf"]
    candidates += [
        Path("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"),
        Path("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"),
        Path("/usr/share/fonts/truetype/liberation2/LiberationSans-Bold.ttf"),
        Path("/usr/share/fonts/truetype/liberation2/LiberationSans-Regular.ttf"),
    ]
    for p in candidates:
        try:
            if p.is_file():
                return ImageFont.truetype(str(p), size=size)
        except Exception:
            pass
    try:
        return ImageFont.load_default(size=size)
    except TypeError:
        return ImageFont.load_default()

def _fit_font(draw, text, max_width, start_size, min_size=18):
    size = start_size
    while size >= min_size:
        font = _ascii_font(size)
        bbox = draw.textbbox((0,0), text, font=font)
        if bbox[2]-bbox[0] <= max_width:
            return font
        size -= 1
    return _ascii_font(min_size)

def render_completed_order_receipt_sync(
    data: CompletedOrderReceipt,
    *,
    template_path: Optional[str | Path] = None,
    output_path: Optional[str | Path] = None,
) -> Path:
    image = Image.open(resolve_receipt_template(template_path)).convert("RGBA")
    if image.size != (1024,1536):
        image = image.resize((1024,1536), Image.Resampling.LANCZOS)

    draw = ImageDraw.Draw(image, "RGBA")
    values = {
        "order_id": f"#{int(data.order_id)}",
        "completed_at": str(data.completed_at),
        "buyer": str(data.buyer),
        "product": str(data.product),
        "amount": f"{int(data.amount_toman):,}",
    }
    widths = {"order_id":330,"completed_at":390,"buyer":360,"product":350,"amount":260}
    sizes = {"order_id":33,"completed_at":31,"buyer":31,"product":31,"amount":32}

    for key, value in values.items():
        font = _fit_font(draw, value, widths[key], sizes[key])
        draw.text(
            VALUE_POSITIONS[key],
            value,
            font=font,
            fill=GOLD if key=="amount" else TEXT,
        )

    if output_path is None:
        outdir = BASE_DIR / "runtime" / "receipts"
        outdir.mkdir(parents=True, exist_ok=True)
        output = outdir / f"order_{int(data.order_id)}_completed.png"
    else:
        output = Path(output_path)
        output.parent.mkdir(parents=True, exist_ok=True)

    image.convert("RGB").save(output, "PNG", optimize=True)
    return output

async def render_completed_order_receipt(data: CompletedOrderReceipt, **kwargs) -> Path:
    return await asyncio.to_thread(render_completed_order_receipt_sync, data, **kwargs)

__all__ = [
    "CompletedOrderReceipt",
    "render_completed_order_receipt",
    "render_completed_order_receipt_sync",
    "resolve_receipt_template",
]