#!/usr/bin/env python3
import sys
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import json
import logging
import sys

logging.basicConfig(
    filename='/var/www/html/factuurapp/v2/logs/api.log',
    level=logging.DEBUG,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
logging.debug("Starting bol_api.py")
logging.debug(f"Arguments: {sys.argv}")

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 get_access_token(client_id, client_secret):
    url = "https://login.bol.com/token"
    auth = (client_id, client_secret)
    headers = {"Content-Type": "application/x-www-form-urlencoded"}
    data = {"grant_type": "client_credentials"}
    response = create_retry_session().post(url, auth=auth, headers=headers, data=data)
    logging.debug(f"Access token response: {response.status_code}, body: {response.text}")
    if response.status_code == 200:
        return response.json()["access_token"]
    else:
        logging.error(f"Error fetching token: {response.status_code} - {response.text}")
        sys.exit(1)

def find_shipping_address(order):
    plekken = [
        ("shipmentDetails.customerDetails.shippingDetails", 
         lambda o: o.get('shipmentDetails', {}).get('customerDetails', {}).get('shippingDetails')),
        ("shipmentDetails.shippingDetails", 
         lambda o: o.get('shipmentDetails', {}).get('shippingDetails')),
        ("shipmentDetails", 
         lambda o: o.get('shipmentDetails')),  
        ("consumer", 
         lambda o: o.get('consumer')),
        ("invoiceDetails", 
         lambda o: o.get('invoiceDetails')),
    ]
    for naam, func in plekken:
        adres = func(order)
        if adres and isinstance(adres, dict) and adres.get("streetName"):
            return naam, adres
    return None, None

def get_order_details(token, order_id):
    url = f"https://api.bol.com/retailer/orders/{order_id}"
    headers = {
        "Accept": "application/vnd.retailer.v10+json",
        "Authorization": f"Bearer {token}"
    }
    response = create_retry_session().get(url, headers=headers)
    logging.debug(f"Order details response for {order_id}: {response.status_code}")
    logging.debug(f"Order details body: {response.text}")
    if response.status_code == 200:
        return response.json()
    else:
        logging.error(f"Fout bij ophalen order details voor {order_id}: {response.status_code} - {response.text}")
        return None

def get_bol_orders(client_id, client_secret, show_historical=False):
    token = get_access_token(client_id, client_secret)
    url = "https://api.bol.com/retailer/orders"
    headers = {
        "Accept": "application/vnd.retailer.v10+json",
        "Authorization": f"Bearer {token}"
    }
    try:
        response = create_retry_session().get(url, headers=headers)
        logging.debug(f"Orders response: {response.status_code}, body: {response.text}")

        if response.status_code == 200:
            data = response.json()
            orders = data.get('orders', [])
            logging.debug(f"Orders gevonden in API response: {len(orders)}")

            detailed_orders = []
            for order in orders:
                order_id = order.get("orderId")
                details = get_order_details(token, order_id)
                if details:
                    adres_naam, adres = find_shipping_address(details)
                    detailed_orders.append({
                        "orderId": order_id,
                        "customerName": adres.get("name", "Onbekende klant") if adres else "Onbekende klant",
                        "shippingAddress": adres if adres else {}
                    })
            return detailed_orders
        else:
            logging.error(f"Error fetching orders: {response.status_code} - {response.text}")
            sys.exit(1)
    except requests.exceptions.RequestException as e:
        logging.error(f"Connection error fetching orders: {e}")
        sys.exit(1)

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Gebruik: bol_api.py <client_id> <client_secret>", file=sys.stderr)
        sys.exit(1)
    client_id = sys.argv[1]
    client_secret = sys.argv[2]
    orders = get_bol_orders(client_id, client_secret)
    print(json.dumps(orders))
