from __future__ import annotations

import json
import re
from pathlib import Path
from typing import Any


OBSIDIAN_LIST = Path("/Volumes/Obsidian/DEV-Vault/b2in/immobilien/Immobilien Dubai.md")
LOCAL_EXTRACTION = Path("dev/immobilien 07-05-2026/azizi-extraction.json")
OFFICIAL_LINKS_OUTPUT = Path("dev/immobilien 07-05-2026/azizi-official-links.json")
TOP_PROJECTS_OUTPUT = Path("dev/immobilien 07-05-2026/azizi-top-projects-research.json")


TOP_PROJECTS: dict[str, dict[str, Any]] = {
    "mina": {
        "title": "Mina",
        "district": "Palm Jumeirah",
        "category": "Sofort verfügbar - Luxus-Prestige",
        "status": "Fertiggestellt / Resale",
        "unit_types": ["Apartments", "Penthouses"],
        "unit_count": "178 Apartments + 4 Penthouses",
        "price_from": "ab AED 2,6 Mio laut Konzeptbriefing; aktuelle Verfügbarkeit prüfen",
        "handover": "Fertiggestellt 2021",
        "positioning": "Etablierte Palm-Jumeirah-Adresse mit Waterfront-/Prestige-Fokus.",
        "key_facts": [
            "Palm Jumeirah, östlicher Halbmond",
            "Bestandsobjekt, neue Einheiten nur nach Verfügbarkeit im Zweitmarkt",
            "Geeignet für Eigennutzer mit Palm-Präferenz und Bestandsinvestoren",
        ],
        "research_status": "Konzeptdaten belastbar; lokale SharePoint-Ordner vorhanden, aber ohne verwertbare Dateien; offizielle URL als Projektanker.",
    },
    "royal-bay": {
        "title": "Royal Bay",
        "district": "Palm Jumeirah",
        "category": "Sofort verfügbar - Luxus-Prestige",
        "status": "Fertiggestellt / Resale",
        "unit_types": ["Apartments", "Penthouses"],
        "unit_count": "90 Apartments + 2 Penthouses",
        "price_from": "Verfügbarkeit auf Anfrage",
        "handover": "Fertiggestellt",
        "positioning": "Kleinere, privatere Palm-Jumeirah-Adresse gegenüber Mina.",
        "key_facts": [
            "Palm Jumeirah",
            "Bewusst kleine Hausgemeinschaft",
            "Geeignet für Eigennutzer mit Privatheitsfokus",
        ],
        "research_status": "Konzeptdaten belastbar; offizielle URL aus Obsidian-Liste; keine lokale SharePoint-Abdeckung gefunden.",
    },
    "creek-views": {
        "title": "Creek Views",
        "district": "Al Jaddaf / Dubai Healthcare City",
        "category": "Sofort verfügbar - für schnelle Cashflow-Investments",
        "status": "Fertiggestellt / Bestand",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom"],
        "unit_count": "634 Einheiten laut Konzeptbriefing",
        "price_from": "Verfügbarkeit auf Anfrage",
        "handover": "Fertiggestellt",
        "positioning": "Zentrale Cashflow-Adresse zwischen Dubai Creek, Downtown und Flughafen.",
        "key_facts": [
            "Offizielles Factsheet: Studios, 1- und 2-Bedroom-Apartments",
            "Offizielles Factsheet: Dubai Creek ca. 2 Minuten, Downtown Dubai ca. 7 Minuten, DXB ca. 7 Minuten",
            "Panoramablick auf Dubai Creek und Skyline, Terrassen, Retail- und Leisure-Hubs",
        ],
        "research_status": "Sehr gute lokale SharePoint-Abdeckung mit Factsheets und Bildern.",
    },
    "creek-views-ii": {
        "title": "Creek Views II",
        "district": "Al Jaddaf / Dubai Healthcare City",
        "category": "Sofort verfügbar - für schnelle Cashflow-Investments",
        "status": "Kürzlich übergeben / Bestand",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom"],
        "unit_count": "Teil des Creek-Views-Ensembles",
        "price_from": "Verfügbarkeit auf Anfrage",
        "handover": "Kürzlich übergeben",
        "positioning": "Jüngere Ergänzung des Creek-Views-Konzepts in bewährter Lage.",
        "key_facts": [
            "SharePoint enthält Factsheets, Renderings und Fertigstellungs-/Foto-Material",
            "Gleiche Standortlogik wie Creek Views: DHCC, Dubai Creek, kurze Wege zu Downtown und Flughafen",
            "Geeignet für konservative Yield-Investoren mit schneller Vermietbarkeit",
        ],
        "research_status": "Gute lokale SharePoint-Abdeckung; Factsheet-Dateien teils mehrsprachig/CH/RUS, deutsche Website-Texte besser aus Konzept + englischer Quelle ableiten.",
    },
    "azizi-riviera": {
        "title": "Azizi Riviera",
        "district": "MBR City / Meydan",
        "category": "Flaggschiff Meydan - Azizis größtes aktives Quartier",
        "status": "Phasenweise fertiggestellt / weitere Phasen aktiv",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom", "3 Bedroom", "Retail"],
        "unit_count": "12.285 Apartments laut Azizi Folding Map V.10",
        "price_from": "Aktuelle Phase prüfen",
        "handover": "Phase abhängig",
        "positioning": "Master-Planned Community mit Crystal Lagoon, Lifestyle und Rendite-Logik.",
        "key_facts": [
            "Riviera umfasst eine 2,7 km lange schwimmbare Crystal Lagoon",
            "Riviera ist in mehrere Lifestyle-Zonen gegliedert: Retail Boulevard, Lagoon Walk und Grünflächen",
            "Kurze Wege nach Downtown Dubai und Meydan",
        ],
        "research_status": "Azizi Folding Map V.10 liefert direkten Apartment-Count; lokaler SharePoint-Ordner ist weitgehend leer.",
    },
    "riviera-reve": {
        "title": "Riviera Rêve",
        "district": "MBR City / Meydan",
        "category": "Flaggschiff Meydan - Azizis größtes aktives Quartier",
        "status": "Off-Plan / Ultra-Luxus-Phase",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom", "Duplex Penthouses"],
        "unit_count": "5.061 Homes in 24 Ultra-Luxus-Gebäuden",
        "price_from": "Aktuelle Verfügbarkeit prüfen",
        "handover": "Phase abhängig",
        "positioning": "Exklusivste Riviera-Phase für Käufer, die Community-Vorteile mit höherer Ausstattung verbinden.",
        "key_facts": [
            "Web-/Pressesource: 24 Ultra-Luxus-Gebäude",
            "Web-/Pressesource: über 2.600 Studios, 1.579 One-Bedroom, 876 Two-Bedroom",
            "Ausstattungspositionierung mit Smart-Home, hochwertigen Materialien und 5-Sterne-Service-Ambiente",
        ],
        "research_status": "Keine lokale SharePoint-Abdeckung gefunden; Web-/Pressesource ergänzt offizielle URL.",
    },
    "riviera-beachfront": {
        "title": "Riviera Beachfront",
        "district": "MBR City / Meydan",
        "category": "Flaggschiff Meydan - Azizis größtes aktives Quartier",
        "status": "Im Bau / Near Handover",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom", "Retail"],
        "unit_count": "555 Einheiten in drei 20-geschossigen Entwicklungen",
        "price_from": "Aktuelle Verfügbarkeit prüfen",
        "handover": "Q4 2025 laut 2025-Bauupdates",
        "positioning": "Premium-Linie der Riviera direkt an der Crystal Lagoon.",
        "key_facts": [
            "Bauupdate 2025: Beachfront I erreichte 70-81% Baufortschritt",
            "Drei 20-geschossige Entwicklungen mit direktem Beach-/Lagoon-Zugang",
            "Amenities: Pools, Gym, BBQ, Kinderspielbereiche, Yoga-Spaces, Retail",
        ],
        "research_status": "Lokaler SharePoint-Ordner ohne verwertbare Dateien; Web-/Bauupdates liefern harte Fakten.",
    },
    "park-avenue": {
        "title": "Park Avenue",
        "district": "Meydan / MBR City",
        "category": "Flaggschiff Meydan - Azizis größtes aktives Quartier",
        "status": "Fertiggestellt / Resale",
        "unit_types": ["Apartments", "Retail"],
        "unit_count": "274 Apartments laut Azizi Folding Map V.10",
        "price_from": "Verfügbarkeit auf Anfrage",
        "handover": "2023/2024 laut Konzeptbriefing",
        "positioning": "Boutique-Community in MBR City, ruhiger als die großen Riviera-Türme.",
        "key_facts": [
            "274 Apartments laut Azizi Folding Map V.10",
            "Meydan Avenue / MBR City",
            "Geeignet für Eigennutzer und Resale-Investoren mit Wunsch nach kleinerer Community",
        ],
        "research_status": "Keine lokale SharePoint-Abdeckung gefunden; Azizi Folding Map V.10 bestätigt 274 Apartments.",
    },
    "star": {
        "title": "Star",
        "district": "Al Furjan",
        "category": "Ready Rendite - etablierte Adressen in Al Furjan",
        "status": "Fertiggestellt / Resale",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom"],
        "unit_count": "Offizielle Seite: 310 Studios, 46 One-Bedroom, 102 Two-Bedroom",
        "price_from": "Verfügbarkeit auf Anfrage",
        "handover": "Fertiggestellt",
        "positioning": "Al-Furjan-Klassiker mit Metro-Nähe und breiter Mietzielgruppe.",
        "key_facts": [
            "Offizielle Seite: Metro Station ca. 1 Minute, Mohammed Bin Zayed Road ca. 1 Minute",
            "Offizielle Seite: Dubai Marina & JBR ca. 10 Minuten, Expo City ca. 12 Minuten",
            "Amenities: Pool, Gym, Garage/Parking, City Views, Sauna",
        ],
        "research_status": "Gute lokale Bildabdeckung; offizielle Seite liefert Unit-Mix und Standortzeiten.",
    },
    "roy-mediterranean": {
        "title": "ROY Mediterranean",
        "district": "Al Furjan",
        "category": "Ready Rendite - etablierte Adressen in Al Furjan",
        "status": "Fertiggestellt / Resale",
        "unit_types": ["Apartments", "Retail"],
        "unit_count": "271 Apartments + Retail laut Konzeptbriefing",
        "price_from": "Verfügbarkeit auf Anfrage",
        "handover": "Fertiggestellt",
        "positioning": "Etablierte Al-Furjan-Adresse mit Volumen und Resale-Liquidität.",
        "key_facts": [
            "Al Furjan mit Metro-Anbindung und guter Erreichbarkeit von Jebel Ali, Dubai Marina und Expo City",
            "Ground-Floor-Retail stärkt Alltagstauglichkeit und Vermietbarkeit",
            "Geeignet für Yield- und Volumeninvestoren",
        ],
        "research_status": "Lokale Bildabdeckung vorhanden; harte Unit-Zahl aus Konzeptbriefing, offizielle URL als Projektanker.",
    },
    "farishta": {
        "title": "Farishta",
        "district": "Al Furjan",
        "category": "Ready Rendite - etablierte Adressen in Al Furjan",
        "status": "Fertiggestellt / Resale",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom", "Penthouses"],
        "unit_count": "137 Studios, 124 One-Bedroom, 23 Two-Bedroom laut Azizi-Al-Furjan-Katalogauszug",
        "price_from": "Verfügbarkeit auf Anfrage",
        "handover": "Fertiggestellt 2020 laut Konzeptbriefing",
        "positioning": "Niedriger Risiko-Einstieg in Al Furjan mit Metro- und Straßenanbindung.",
        "key_facts": [
            "Zwischen Sheikh Zayed Road und Sheikh Mohammed Bin Zayed Road positioniert",
            "SharePoint enthält Renderings, Completion Photos und Floor Plans",
            "Geeignet für Erstinvestoren und Cashflow-orientierte Käufer",
        ],
        "research_status": "Gute lokale SharePoint-Abdeckung; Unit-Mix aus Azizi-Katalog-/Suchauszug weicht leicht vom Konzept ab und sollte vor Livegang final geprüft werden.",
    },
    "azizi-grand": {
        "title": "Azizi Grand",
        "district": "Dubai Sports City",
        "category": "Bald bezugsfertig - Bauphase weit fortgeschritten",
        "status": "Im Bau / Near Handover",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom"],
        "unit_count": "411 Apartments laut Azizi Folding Map V.10",
        "price_from": "Aktuelle Verfügbarkeit prüfen",
        "handover": "Q1 2026 laut Bauupdates",
        "positioning": "Kurze Restlaufzeit bis Cashflow in einer sport- und familiennahen Lage.",
        "key_facts": [
            "411 Apartments laut Azizi Folding Map V.10",
            "Building Height B+G+3P+14 laut Azizi Folding Map V.10",
            "Bauupdate September 2025: 57% Baufortschritt",
            "Bauupdate November 2025: 67% Baufortschritt",
            "Amenities: Gym, zwei Pools, Kinderspielbereiche, BBQ, Landschaftsgärten",
        ],
        "research_status": "Keine lokale SharePoint-Abdeckung gefunden; Web-/Bauupdates liefern harte Fakten.",
    },
    "beach-oasis": {
        "title": "Beach Oasis",
        "district": "Dubai Studio City",
        "category": "Bald bezugsfertig - Bauphase weit fortgeschritten",
        "status": "Im Bau / Phase abhängig",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom"],
        "unit_count": "1.416 Apartments in 4 Buildings laut Azizi Folding Map V.10",
        "price_from": "ab ca. AED 480k-822k je Phase/Quelle; aktuelle Verfügbarkeit prüfen",
        "handover": "Phase abhängig: 2024/2025 bzw. Phase 2 bis 2026 laut Webquellen",
        "positioning": "Studio-City-Einstieg mit Lagunen-/Beach-Feeling im bezahlbaren Segment.",
        "key_facts": [
            "1.416 Apartments laut Azizi Folding Map V.10",
            "Dubai Studio City, Medien- und Entertainment-Hub",
            "Lagoon-style swimming pool und man-made beach",
            "Outdoor courtyard, Cafes/Restaurants, Gym, landscaped gardens",
        ],
        "research_status": "Wichtig: lokaler Treffer ist überwiegend Jaddaf Beach Oasis, nicht Studio City Beach Oasis. Für Live-Daten Studio-City-Quelle priorisieren.",
    },
    "burj-azizi": {
        "title": "Burj Azizi",
        "district": "Sheikh Zayed Road / Trade Centre",
        "category": "Ultra-Prestige & Mega-Communities",
        "status": "Im Bau / Off-Plan",
        "unit_types": ["Holiday Homes", "Freehold Apartments", "Penthouses", "Hotel", "Retail"],
        "unit_count": "1.037 Residences, 725 m und 140+ Floors laut Azizi Folding Map V.10",
        "price_from": "offizielle Burj-Azizi-Seite: ab AED 8,5 Mio bis AED 1 Mrd; Launch-Presse: ab AED 10.000/sqft",
        "handover": "Bis Ende 2028 laut Programm-/Pressekontext; im Konzept 2028-2030",
        "positioning": "Headline-Projekt: zweithöchster Tower der Welt und einziges Freehold-Projekt auf dem Sheikh-Zayed-Road-Strip.",
        "key_facts": [
            "Azizi Folding Map V.10: 725 Meter, 140+ Floors, 1.037 Residences, Sheikh Zayed Road",
            "Offizielle Seite: Highest Observation Deck 649m, Highest Club 567m, Highest Hotel Lobby 498m",
            "Offizielle Kontaktseite: Retail Ground-L7, Apartments Level 37-69, Penthouses Level 72-88, Observation Deck Level 130",
        ],
        "research_status": "Azizi Folding Map V.10 liefert direkte Zahlen; sehr gute offizielle Burj-Azizi-Webquelle; keine lokale SharePoint-Abdeckung gefunden.",
    },
    "monaco-mansions": {
        "title": "Monaco Mansions",
        "district": "Dubai South / Azizi Venice",
        "category": "Ultra-Prestige & Mega-Communities",
        "status": "Im Bau / Off-Plan",
        "unit_types": ["6 Bedroom Mansions", "7 Bedroom Mansions", "8 Bedroom Mansions"],
        "unit_count": "109 Mansions",
        "price_from": "ab AED 45 Mio laut Konzeptbriefing",
        "handover": "Q4 2026 laut Konzeptbriefing; final prüfen",
        "positioning": "Exklusivstes Villen-Segment innerhalb der Venice-Community.",
        "key_facts": [
            "Azizi Folding Map V.10 nennt 109 Villas im Azizi-Venice-Kontext",
            "Positioniert für HNI-Käufer, Familien und Trophy-Asset-Investoren",
            "Investmentthese ist an Dubai South, Flughafenentwicklung und Venice-Masterplan gekoppelt",
        ],
        "research_status": "Keine lokale SharePoint-Abdeckung gefunden; Venice-Web-/Pressesources bestätigen Mansion-Kontext, projektgenaue Verfügbarkeit final prüfen.",
    },
    "azizi-venice": {
        "title": "Azizi Venice",
        "district": "Dubai South",
        "category": "Ultra-Prestige & Mega-Communities",
        "status": "Im Bau / Mega-Community",
        "unit_types": ["Apartments", "Villas", "Mansions", "Retail"],
        "unit_count": "34.795+ Apartments, 102 Apartment Buildings und 109 Villas laut Azizi Folding Map V.10",
        "price_from": "ab ca. AED 650k laut Konzeptbriefing; aktuelle Phase prüfen",
        "handover": "Phasenweise ab 2026 laut Konzeptbriefing",
        "positioning": "Große Dubai-South-Wachstumsthese mit Lagoon, Cultural District und Nähe zu Al Maktoum Airport.",
        "key_facts": [
            "Azizi Folding Map V.10: 34.795+ Apartments, 102 Apartment Buildings, 109 Villas",
            "18 km Freshwater Lagoon, Opera House, Theatre, Exhibition Hall, Performing Arts Academy",
            "Nähe zu Al Maktoum International Airport; Retail Boulevard, Hotels, Schulen, Krankenhaus",
        ],
        "research_status": "Lokaler SharePoint-Ordner leer; mehrere Web-/Pressesources liefern harte Masterplan-Fakten.",
    },
    "azizi-milan": {
        "title": "Azizi Milan",
        "district": "Azizi Milan / Sheikh Mohammed Bin Zayed Road",
        "category": "Ultra-Prestige & Mega-Communities",
        "status": "Im Bau / Master-Planned Community",
        "unit_types": ["Apartments", "Retail", "Hospitality", "Mixed Use"],
        "unit_count": "100 Buildings und 80.000 Apartments laut Azizi Folding Map V.10",
        "price_from": "Aktuelle Gebäudephase prüfen",
        "handover": "Phase abhängig",
        "positioning": "AED-75-Mrd.-Masterplan mit italienischer Design-/Fashion-Positionierung.",
        "key_facts": [
            "Azizi Folding Map V.10: 100 Buildings und 80.000 Apartments",
            "Web-/Pressesources: AED 75 Mrd. und 40 Mio sqft GFA",
            "Milan Heights als lagoon-facing Enclave innerhalb Azizi Milan",
            "Lage an Sheikh Mohammed Bin Zayed Road, wichtiger Verbindungsachse zwischen Emiraten",
        ],
        "research_status": "Sehr gute lokale SharePoint-Abdeckung für einzelne AM-Gebäude und Milan Heights; Webquellen ergänzen Masterplan-Fakten.",
    },
    "azizi-wasel": {
        "title": "Azizi Wasel",
        "district": "Dubai Islands",
        "category": "Ultra-Prestige & Mega-Communities",
        "status": "Off-Plan / New Launch",
        "unit_types": ["Studios", "1 Bedroom", "2 Bedroom", "3 Bedroom", "Penthouses"],
        "unit_count": "221 Apartments laut Azizi Folding Map V.10",
        "price_from": "ab ca. AED 1,04-1,1 Mio je Quelle",
        "handover": "Q2 2027 bis Q1 2028 je Quelle; final prüfen",
        "positioning": "Frühphasiger Einstieg in Dubai Islands als künftige Premium-Inseldestination.",
        "key_facts": [
            "221 Apartments laut Azizi Folding Map V.10",
            "Building Height 3B+G+13 laut Azizi Folding Map V.10",
            "Dubai Islands / Deira Waterfront",
            "Studios bis 3-Bedroom Apartments sowie 3-4-Bedroom Penthouses",
            "50/50 Payment Plan wird konsistent in Webquellen genannt",
        ],
        "research_status": "Keine lokale SharePoint-Abdeckung gefunden; Azizi Folding Map V.10 bestätigt 221 Apartments und Building Height 3B+G+13.",
    },
}


def slugify(name: str) -> str:
    value = name.lower()
    value = value.replace("ê", "e")
    value = re.sub(r"[^a-z0-9]+", "-", value).strip("-")
    return value


def parse_official_links() -> list[dict[str, str]]:
    current_area = ""
    projects: list[dict[str, str]] = []

    for line in OBSIDIAN_LIST.read_text(encoding="utf-8").splitlines():
        heading = re.match(r"^###\s+📍\s+(.+)$", line)
        if heading:
            current_area = heading.group(1).strip()
            continue

        link = re.match(r"- \*\*(.+?):\*\* \[(https://www\.azizidevelopments\.com/[^\]]+)\]", line.strip())
        if not link:
            continue

        title, url = link.groups()
        projects.append(
            {
                "slug": slugify(title),
                "title": title,
                "area": current_area,
                "official_url": url,
            }
        )

    return projects


def main() -> None:
    official_links = parse_official_links()
    official_by_url = {item["official_url"]: item for item in official_links}
    official_by_slug = {item["slug"]: item for item in official_links}

    local = json.loads(LOCAL_EXTRACTION.read_text(encoding="utf-8"))
    local_projects = local["projects"]

    enriched: list[dict[str, Any]] = []
    for slug, project in TOP_PROJECTS.items():
        local_project = local_projects.get(slug, {})
        if slug == "beach-oasis":
            local_project = {
                "source_dirs": [],
                "coverage": {"files": 0, "images": 0, "xlsx": 0, "small_fact_pdfs": 0},
                "image_candidates": [],
                "pdf_extracts": [],
                "xlsx_extracts": [],
            }

        official_url = local_project.get("official_url")
        official = official_by_url.get(official_url or "") or official_by_slug.get(slug)
        enriched.append(
            {
                "slug": slug,
                "title": project["title"],
                "official_url": official_url or (official or {}).get("official_url"),
                "official_list_area": (official or {}).get("area"),
                **project,
                "local_sharepoint": {
                    "source_dirs": local_project.get("source_dirs", []),
                    "coverage": local_project.get("coverage", {}),
                    "image_candidates": local_project.get("image_candidates", [])[:6],
                    "fact_sources": [item["path"] for item in local_project.get("pdf_extracts", [])]
                    + [item["path"] for item in local_project.get("xlsx_extracts", [])],
                },
            }
        )

    OFFICIAL_LINKS_OUTPUT.write_text(
        json.dumps(
            {
                "source": str(OBSIDIAN_LIST),
                "count": len(official_links),
                "projects": official_links,
            },
            ensure_ascii=False,
            indent=2,
        ),
        encoding="utf-8",
    )

    TOP_PROJECTS_OUTPUT.write_text(
        json.dumps(
            {
                "source_files": {
                    "official_link_list": str(OBSIDIAN_LIST),
                    "local_sharepoint_extraction": str(LOCAL_EXTRACTION),
                },
                "note": "Working research data for the B2in Dubai real-estate page. Pricing, availability and handover dates must be confirmed before publication.",
                "projects": enriched,
            },
            ensure_ascii=False,
            indent=2,
        ),
        encoding="utf-8",
    )

    print(f"Wrote {OFFICIAL_LINKS_OUTPUT}")
    print(f"Wrote {TOP_PROJECTS_OUTPUT}")


if __name__ == "__main__":
    main()
