from PIL import Image
from flask import current_app

from app.labels.template_renderer import get_template, render_template
from app.services.shipping_mapping import get_carrier, rules_from_json


def generate(
    order_number: str,
    buyer_name: str,
    num_items: int,
    delivery_method: str,
    total: float,
    currency: str = 'EUR',
    letter: str = None,
    barcode_id: str = None,
) -> Image.Image:
    """Generate a 55×32mm (440×256 dot) order summary label as a PIL Image.

    barcode_id overrides order_number in the barcode when set (used for long
    order numbers that don't fit in a Code-128 barcode at label size).
    """
    fields = {
        'order_number': order_number,
        'barcode_data': barcode_id or order_number,
        'buyer_name':   buyer_name or '',
        'num_items':    f"{num_items} item{'s' if num_items != 1 else ''}",
        'delivery':     _shorten_delivery(delivery_method),
        'total_eur':    f'{total:.2f} {currency}',
        'letter':       letter or '',
    }
    db_path = current_app.config['DATABASE_PATH']
    template = get_template('order_summary', db_path)
    return render_template(template, fields)


def _shorten_delivery(method: str, country: str = '') -> str:
    """Return the standardised carrier name using saved shipping rules."""
    if not method:
        return ''
    try:
        from app import db as database
        db_path = current_app.config['DATABASE_PATH']
        rules_json = database.get_setting('SHIPPING_RULES_JSON', db_path)
        rules = rules_from_json(rules_json)
        carrier = get_carrier(method, country, rules)
        return carrier if carrier != 'Other' else method[:20]
    except Exception:
        return method[:20]
