import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from dotenv import dotenv_values
import logging
import base64
import webbrowser

# Laad API-configuratie
config = dotenv_values("bol.env")
POSTNL_API_KEY = config.get('POSTNL_API_KEY')
POSTNL_ENVIRONMENT = config.get('POSTNL_ENVIRONMENT', 'sandbox').lower()

if not POSTNL_API_KEY:
    raise ValueError("Missing required API key in bol.env")

logging.basicConfig(filename='postnl_api.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

STANDARD_SENDER = {
    "company_name": "Things en Meer",
    "street": "Rijksstraatweg",
    "house_number": "3",
    "postal_code": "8814JV",
    "city": "Zweins",
    "country_code": "NL"
}

CUSTOMER_CODE = "NCUY"
CUSTOMER_NUMBER = "10834934"
COLLECTION_LOCATION = "100548"

def create_retry_session():
    session = requests.Session()
    retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
    session.mount('https://', HTTPAdapter(max_retries=retries))
    return session

def create_shipping_label(receiver, is_brievenbuspakje, return_barcode=False):
    straat = receiver.get('streetName', '')
    huisnummer = receiver.get('houseNumber', '')
    postcode = receiver.get('zipCode', '').replace(" ", "")
    plaats = receiver.get('city', '')
    landcode = receiver.get('countryCode', 'NL')

    if not straat or not huisnummer or not postcode or not plaats:
        logging.error("Missing required address details.")
        return (None, None) if return_barcode else False

    weight = 500

    # Kies productcode
    if landcode == "NL":
        productcode = "2928" if is_brievenbuspakje else "3085"
    elif landcode == "BE":
        productcode = "4946"
    else:
        productcode = "3085"

    payload = {
        "Customer": {
            "CustomerCode": CUSTOMER_CODE,
            "CustomerNumber": CUSTOMER_NUMBER,
            "CollectionLocation": COLLECTION_LOCATION,
            "Email": "info@thingsenmeer.nl",
            "Address": {
                "AddressType": "02",
                "CompanyName": STANDARD_SENDER["company_name"],
                "Street": STANDARD_SENDER["street"],
                "HouseNr": STANDARD_SENDER["house_number"],
                "Zipcode": STANDARD_SENDER["postal_code"],
                "City": STANDARD_SENDER["city"],
                "Countrycode": STANDARD_SENDER["country_code"]
            }
        },
        "Message": {
            "MessageID": "test123",
            "MessageTimeStamp": "2025-06-26T12:00:00+01:00",
            "Printertype": "GraphicFile|PDF"
        },
        "Shipments": [
            {
                "Addresses": [
                    {
                        "AddressType": "01",
                        "FirstName": receiver.get("firstName", ""),
                        "Name": receiver.get("surname", ""),
                        "Street": straat,
                        "HouseNr": huisnummer,
                        "HouseNrExt": receiver.get("houseNumberExtension", ""),
                        "Zipcode": postcode,
                        "City": plaats,
                        "Countrycode": landcode,
                        "CompanyName": receiver.get("companyName", "")
                    }
                ],
                "Dimension": {
                    "Weight": str(weight)
                },
                "ProductCodeDelivery": productcode,
                "Reference": f"order {receiver.get('orderNumber', 'unknown')}",
                "Contacts": [
                    {
                        "ContactType": "01",
                        "Email": receiver.get("email", "test@example.com")
                    }
                ]
            }
        ]
    }

    headers = {
        "apikey": POSTNL_API_KEY,
        "Content-Type": "application/json"
    }

    url = "https://api-sandbox.postnl.nl/v1/shipment" if POSTNL_ENVIRONMENT == 'sandbox' else "https://api.postnl.nl/v1/shipment"

    try:
        response = create_retry_session().post(url, headers=headers, json=payload)
        logging.info(f"PostNL response {response.status_code}: {response.text}")

        if response.status_code == 200:
            data = response.json()
            shipment = data.get("ResponseShipments", [{}])[0]
            barcode = shipment.get("Barcode", "")
            labels = shipment.get("Labels", [])

            if labels and labels[0].get("Content"):
                content_base64 = labels[0]["Content"]
                pdf_bytes = base64.b64decode(content_base64)
                order_num = receiver.get("orderNumber", "unknown")
                pdf_filename = f"order_{order_num}.pdf"
                with open(pdf_filename, "wb") as f:
                    f.write(pdf_bytes)
                logging.info(f"Label opgeslagen als {pdf_filename}")
                webbrowser.open(pdf_filename)

                if return_barcode:
                    return barcode, pdf_filename
                return True
            else:
                logging.error("Geen label content ontvangen.")
                if return_barcode:
                    return None, None
                return False
        else:
            logging.error(f"PostNL error {response.status_code}: {response.text}")
            if return_barcode:
                return None, None
            return False

    except requests.exceptions.RequestException as e:
        logging.error(f"Connectiefout bij aanmaken label: {e}")
        if return_barcode:
            return None, None
        return False
