import requests
import xml.etree.ElementTree as ET
from datetime import datetime, timedelta
import os
import json
from dotenv import load_dotenv

# .env abszolút útvonalról betöltése
ENV_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), ".env"))
load_dotenv(dotenv_path=ENV_PATH)

# Környezeti változók
TOKEN_FILE = os.environ.get("TOKEN_FILE")
SENT_IDS_FILE = os.environ.get("SENT_IDS_FILE", "sent_orders.txt")
GETORDER_URL = os.environ.get("GETORDER_URL")
GETPRODUCT_URL = os.environ.get("GETPRODUCT_URL")
GETNEWSLETTER_URL = os.environ.get("GETNEWSLETTER_URL")
WEBHOOK_URL = os.environ.get("WEBHOOK_URL")
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# Fájlkezelés
def load_token():
    with open(TOKEN_FILE, "r") as f:
        return f.readline().strip()

def load_sent_ids():
    if not os.path.exists(SENT_IDS_FILE):
        return set()
    with open(SENT_IDS_FILE, "r") as f:
        return set(line.strip() for line in f)

def save_sent_ids(order_ids):
    with open(SENT_IDS_FILE, "a") as f:
        for oid in order_ids:
            f.write(f"{oid}\n")

# Termékkategória lekérés
def fetch_category_for_sku(sku, token):
    headers = {"Content-Type": "application/xml", "Authorization": f"Bearer {token}"}
    xml_payload = f"""<?xml version="1.0" encoding="UTF-8"?><Params><Sku>{sku}</Sku></Params>"""
    try:
        response = requests.post(GETPRODUCT_URL, headers=headers, data=xml_payload)
        response.raise_for_status()
        root = ET.fromstring(response.text)
        return root.findtext(".//Categories/Category/Name") or "ismeretlen"
    except:
        return "ismeretlen"

# Hírlevél státusz lekérés
def is_subscribed_to_newsletter(email, token):
    headers = {"Content-Type": "application/xml", "Authorization": f"Bearer {token}"}
    xml_payload = f"""<?xml version="1.0" encoding="UTF-8"?>
<Params>
  <Type>subscriber</Type>
  <Auth>yes</Auth>
  <Email>{email}</Email>
</Params>"""
    try:
        response = requests.post(GETNEWSLETTER_URL, headers=headers, data=xml_payload)
        response.raise_for_status()
        root = ET.fromstring(response.text)
        return root.find("Subscriber") is not None
    except:
        return False

# Rendelések lekérése és átalakítása
def fetch_and_convert_orders():
    token = load_token()
    headers = {"Content-Type": "application/xml", "Authorization": f"Bearer {token}"}

    now = datetime.now()
    yesterday = now - timedelta(days=1)

    xml_payload = f"""<?xml version="1.0" encoding="UTF-8"?>
<Params>
    <DateStart>{yesterday.strftime("%Y.%m.%d")}</DateStart>
    <DateEnd>{now.strftime("%Y.%m.%d")}</DateEnd>
</Params>"""

    response = requests.post(GETORDER_URL, headers=headers, data=xml_payload)
    response.raise_for_status()
    root = ET.fromstring(response.text)

    orders = []

    for order in root.findall("Order"):
        order_id = order.findtext("Key")
        email = order.findtext(".//Customer/Email") or "-"
        newsletter = is_subscribed_to_newsletter(email, token)

        data = {
            "order_id": order_id,
            "order_date": order.findtext("Date"),
            "order_status": order.findtext("Status"),
            "order_type": "web",
            "customer_group": "alapértelmezett",
            "customer_name": order.findtext(".//Customer/Contact/Name"),
            "email": email,
            "phone": order.findtext(".//Customer/Contact/Mobile") or order.findtext(".//Customer/Contact/Phone"),
            "newsletter": newsletter,
            "shipping_address": {
                "city": order.findtext(".//Addresses/Shipping/City"),
                "zip": order.findtext(".//Addresses/Shipping/ZIP"),
                "street": order.findtext(".//Addresses/Shipping/Street"),
                "country": order.findtext(".//Addresses/Shipping/Country")
            },
            "payment_method": order.findtext(".//Payment/Name"),
            "shipping_method": order.findtext(".//Shipping/Name"),
            "total_gross": order.findtext("SumPriceGross"),
            "products": []
        }

        for item in order.findall(".//Items/Item"):
            sku = item.findtext("Sku")
            if sku in ["shipping-cost", "discount-amount"]:
                continue

            category = fetch_category_for_sku(sku, token)

            product = {
                "sku": sku,
                "name": item.findtext("Name"),
                "quantity": item.findtext("Quantity"),
                "price_net": item.findtext("PriceNet"),
                "price_gross": item.findtext("PriceGross"),
                "vat": item.findtext("Vat"),
                "category": category
            }
            data["products"].append(product)

        orders.append(data)

    return orders

# Webhook küldés
def send_to_webhook(orders):
    if not orders:
        print("[INFO] Nincs új rendelés a küldéshez.")
        return

    for order in orders:
        print(f"[SEND] Küldés order_id: {order['order_id']} → {WEBHOOK_URL}")
        try:
            response = requests.post(WEBHOOK_URL, json=order)
            print(f"[STATUS] {response.status_code} – {response.text}")
        except Exception as e:
            print(f"[ERROR] Nem sikerült elküldeni: {e}")

# Main futtatás
if __name__ == "__main__":
    print("[SYNC] UNAS rendeléslekérés folyamatban...")

    all_orders = fetch_and_convert_orders()
    sent_ids = load_sent_ids()

    new_orders = [o for o in all_orders if o["order_id"] not in sent_ids]
    new_ids = [o["order_id"] for o in new_orders]

    if new_orders:
        send_to_webhook(new_orders)
        save_sent_ids(new_ids)
        print(f"[INFO] {len(new_orders)} új rendelés elküldve és mentve.")
    else:
        print("[INFO] Nincs új rendelés.")
