"""Customer email notification via make.com webhook."""
import pathlib

import requests

_TEMPLATE_DIR = pathlib.Path(__file__).parent.parent / 'email_templates'

_HR_COUNTRIES = {'HR', 'BA', 'RS', 'ME', 'XK'}
_DE_COUNTRIES = {'DE', 'AT', 'CH', 'LI'}

_TRACKING_URLS = {
    'DHL':     'https://www.dhl.com/global-en/home/tracking.html?tracking-id={}',
    'DPD':     'https://www.dpdgroup.com/hr/mydpd/my-parcels/incoming?parcelNumber={}',
    'Paket24': 'https://posiljka.posta.hr/hr/tracking/trackingdata?barcode={}',
}


def _lang(country: str) -> str:
    c = (country or '').strip().upper()
    if c in _HR_COUNTRIES:
        return 'HR'
    if c in _DE_COUNTRIES:
        return 'DE'
    return 'EN'


def _template_path(order: dict) -> pathlib.Path:
    carrier = (order.get('carrier') or order.get('deliveryMethod') or '').strip()
    if 'pickup' in carrier.lower() or 'osobno' in carrier.lower():
        return _TEMPLATE_DIR / 'email_template_pickup.html'
    lang = _lang(order.get('buyerCountry'))
    return _TEMPLATE_DIR / f'email_template_{lang.lower()}.html'


def _address_lines(name, name1, street, postal, city, country) -> str:
    parts = [name, name1, street, f'{postal or ""} {city or ""}'.strip(), country]
    return '<br/>'.join(p for p in parts if p)


def _billing_string(order: dict) -> str:
    return _address_lines(
        order.get('buyerName'), order.get('buyerName1'),
        order.get('buyerStreet'),
        order.get('buyerPostalCode'), order.get('buyerCity'),
        order.get('buyerCountry'),
    )


def _shipping_string(order: dict) -> str:
    if order.get('deliveryStreet') or order.get('deliveryCity'):
        return _address_lines(
            order.get('deliveryName'), None,
            order.get('deliveryStreet'),
            order.get('deliveryPostalCode'), order.get('deliveryCity'),
            order.get('deliveryCountry'),
        )
    return _billing_string(order)


def _tracking_number_html(carrier: str, tracking: str, country: str) -> str:
    short = carrier.split()[0] if carrier else ''
    if short not in _TRACKING_URLS:
        return ''
    lang = _lang(country)
    label = {'HR': 'Broj za praćenje', 'DE': 'Sendungsnummer'}.get(lang, 'Tracking number')
    return f"""
    <tr>
        <td>
            <div style="font-family:'Tektur',Helvetica,Arial,sans-serif;font-size:10px;font-weight:700;color:#5c2a85;text-transform:uppercase;letter-spacing:1.5px;margin-bottom:6px">{label}</div>
            <div style="font-family:'Space Grotesk',Helvetica,Arial,sans-serif;font-size:14px;color:#333333">{tracking}</div>
        </td>
    </tr>"""


def _tracking_link_html(carrier: str, tracking: str, country: str) -> str:
    short = carrier.split()[0] if carrier else ''
    url = _TRACKING_URLS.get(short, '').format(tracking) if tracking else ''
    if not url:
        return ''
    lang = _lang(country)
    if lang == 'DE':
        return (f'<br/><br/>Sie können Ihre Sendung '
                f'<span style="color:#00c1de;font-weight:bold;text-decoration:underline">'
                f'<a href="{url}">hier</a></span> verfolgen.')
    if lang == 'HR':
        return (f'<br/><br/>Možete pratiti vašu narudžbu '
                f'<span style="color:#00c1de;font-weight:bold;text-decoration:underline">'
                f'<a href="{url}">ovdje</a></span>.')
    return (f'<br/><br/>You can track your shipment '
            f'<span style="color:#00c1de;font-weight:bold;text-decoration:underline">'
            f'<a href="{url}">here</a></span>.')


def _subject(order: dict) -> str:
    carrier = (order.get('carrier') or order.get('deliveryMethod') or '').lower()
    is_pickup = 'pickup' in carrier or 'osobno' in carrier
    if is_pickup:
        return 'Vaša narudžba je spremna za preuzimanje!'
    lang = _lang(order.get('buyerCountry'))
    if lang == 'DE':
        return 'Ihre Bestellung bei Soldered Electronics wurde abgeschlossen!'
    if lang == 'HR':
        return 'Vaša Soldered Electronics narudžba je dovršena!'
    return 'Your Soldered Electronics order has been completed!'


def build_email_html(order: dict, tracking_number: str = None) -> str:
    """Return the filled-in HTML email body for this order."""
    carrier = order.get('carrier') or order.get('deliveryMethod') or ''
    country = order.get('buyerCountry') or ''
    customer_name = order.get('buyerName1') or order.get('buyerName') or ''

    template = _template_path(order).read_text(encoding='utf-8')

    template = template.replace('{{2.OrderNumber}}',   str(order.get('number', '')))
    template = template.replace('{{2.CustomerName}}',  customer_name)
    template = template.replace('{{2.ShippingService}}', carrier)
    template = template.replace('{{2.BillingString}}',  _billing_string(order))
    template = template.replace('{{2.AddressString}}',  _shipping_string(order))

    if tracking_number:
        template = template.replace(
            '<!-- Tracking_number_component -->',
            _tracking_number_html(carrier, tracking_number, country),
        )
        template = template.replace(
            '<!-- Tracking_link_component -->',
            _tracking_link_html(carrier, tracking_number, country),
        )
    else:
        template = template.replace('<!-- Tracking_number_component -->', '')
        template = template.replace('<!-- Tracking_link_component -->', '')

    return template


def notify_customer(order: dict, webhook_url: str,
                    tracking_number: str = None,
                    invoice_pdf: bytes = None,
                    delivery_note_pdf: bytes = None) -> dict:
    """Send the customer notification via make.com webhook.

    Returns {'ok': True} or {'ok': False, 'error': str}.
    """
    if not webhook_url:
        return {'ok': False, 'error': 'MAKE_ORDER_NOTIFY_URL is not configured'}

    email = order.get('buyerEMail', '').strip()
    if not email:
        return {'ok': False, 'error': 'Order has no buyer email address'}

    customer_name = (order.get('buyerName1') or order.get('buyerName') or 'Customer').strip() or 'Customer'
    html = build_email_html(order, tracking_number)
    subject = _subject(order)

    # html_data / title / email — used by the Postmark node mappings.
    # Name / Content / Email / Subject — required by other scenario nodes/filters.
    data = {
        'html_data': html,
        'title':     subject,
        'email':     email,
        'Name':      customer_name,
        'Content':   html,
        'Email':     email,
        'Subject':   subject,
    }

    try:
        files = {}
        if invoice_pdf:
            files['invoice'] = ('invoice.pdf', invoice_pdf, 'application/pdf')
        if delivery_note_pdf:
            files['delivery_note'] = ('delivery_note.pdf', delivery_note_pdf, 'application/pdf')
        if files:
            resp = requests.post(webhook_url, data=data, files=files, timeout=30)
        else:
            resp = requests.post(webhook_url, data=data, timeout=30)
    except Exception as e:
        return {'ok': False, 'error': str(e)}

    if resp.status_code == 200:
        return {'ok': True, 'response': resp.text[:500]}
    return {'ok': False, 'error': f'make.com returned {resp.status_code}: {resp.text[:200]}'}
