import re
from parsers.utils import (
    extract_raw_text,
    extract_final_balance_due,
    extract_with_gemini
)


def parse(pdf_path, vendor):

    # -----------------------------------------
    # Initialize fields
    # -----------------------------------------
    invoice_number = ""
    purchase_order = ""
    total_amount = ""

    # -----------------------------------------
    # 1️⃣ Extract raw text
    # -----------------------------------------
    raw_text = extract_raw_text(pdf_path)

    # -----------------------------------------
    # 2️⃣ Extract Invoice Number (deterministic)
    # -----------------------------------------
    def extract_invoice_number(text):
        pattern = r"Invoice\s*[-#]?\s*(\d{4,})"
        match = re.search(pattern, text, re.IGNORECASE)
        return match.group(1) if match else ""

    invoice_number = extract_invoice_number(raw_text)

    # -----------------------------------------
    # 3️⃣ Extract Purchase Order (deterministic)
    # -----------------------------------------
    def extract_po(text, invoice_num):
        block = re.search(
            r"Account\s*#.*?Sales\s*Rep",
            text,
            re.IGNORECASE | re.DOTALL
        )
        if not block:
            return ""

        block_text = block.group(0)

        # Find digit sequences 6–12 digits long
        candidates = re.findall(r"(?:\d[\s]*){6,12}", block_text)

        cleaned = [
            re.sub(r"\s+", "", c)
            for c in candidates
            if re.sub(r"\s+", "", c).isdigit()
        ]

        # Remove invoice number if present
        cleaned = [c for c in cleaned if c != invoice_num]

        return cleaned[-1] if cleaned else ""

    purchase_order = extract_po(raw_text, invoice_number)

    # -----------------------------------------
    # 4️⃣ Extract Total Amount (deterministic)
    # -----------------------------------------
    total_amount = extract_final_balance_due(raw_text)

    # -----------------------------------------
    # 5️⃣ AI Fallback (Gemini)
    # -----------------------------------------
    try:
        if not (invoice_number and purchase_order and total_amount):
            ai_data = extract_with_gemini(raw_text)

            if isinstance(ai_data, dict):
                invoice_number = invoice_number or ai_data.get("invoice_number", "").strip()
                purchase_order = purchase_order or ai_data.get("purchase_order", "").strip()
                total_amount = total_amount or ai_data.get("total_amount_usd", "").replace("$", "").strip()

    except Exception:
        pass

    # -----------------------------------------
    # 6️⃣ Final Sanitization
    # -----------------------------------------
    if total_amount:
        total_amount = total_amount.replace(",", "")

    return {
        "vendor_name": vendor,
        "invoice_number": invoice_number,
        "purchase_order": purchase_order,
        "total_amount_usd": f"${total_amount}" if total_amount else "",
        "status": "Processed" if invoice_number else "Pending"
    }