# UAE Healthcare Facility Directory — Full Project Specification
> **Database**: `ehealth_dmr` · **Primary Market**: Dubai (Phase 1) → All UAE Emirates (Phase 2)
> **Stack Recommendation**: Next.js 14 (App Router) · MySQL/MariaDB · Tailwind CSS · Resend (email) · Supabase or PlanetScale

---

## Table of Contents
1. [Database Analysis & Schema Map](#1-database-analysis--schema-map)
2. [Project Architecture](#2-project-architecture)
3. [URL & Slug Structure](#3-url--slug-structure)
4. [Directory Homepage — Dubai Healthcare Facilities](#4-directory-homepage--dubai-healthcare-facilities)
5. [Single Facility Page](#5-single-facility-page)
6. [Booking Form — Save to DB + Email](#6-booking-form--save-to-db--email)
7. [SEO / AEO / GEO Strategy](#7-seo--aeo--geo-strategy)
8. [Database Tables Used (Annotated)](#8-database-tables-used-annotated)
9. [Extended UAE Coverage (All Emirates)](#9-extended-uae-coverage-all-emirates)
10. [Implementation Checklist](#10-implementation-checklist)

---

## 1. Database Analysis & Schema Map

### Core Entity Relationships

```
emirates (7 UAE emirates)
    └── uae_zones (free zones, districts, healthcare clusters per emirate)
         └── facilities (main facility record)
              ├── facility_categories (Hospital, Clinic, Pharmacy…)
              │    └── facility_subcategories (General Hospital, Specialty Clinic…)
              ├── facility_details (hours, beds, accreditation, ratings — 1:1)
              ├── facility_social_links (Facebook, Instagram, LinkedIn…)
              ├── facility_emails (GENERAL, APPOINTMENTS, HR…)
              ├── facility_services (list of services offered)
              ├── facility_specialties → specialties (Cardiology, Orthopedics…)
              ├── facility_departments → clinical_departments
              ├── facility_staff_specialists (doctor profiles)
              ├── facility_licenses → health_authorities (DHA, DOH, MOHAP…)
              ├── facility_ratings_reviews (user reviews)
              └── healthcare_organizations (parent group / chain)
```

### Key Tables for the Public Directory

| Table | Purpose | Public-Facing? |
|-------|---------|---------------|
| `emirates` | 7 emirates with slug, description, coordinates | ✅ Yes |
| `uae_zones` | DHCC, DIFC, Downtown, JLT etc. | ✅ Yes (area filter) |
| `facilities` | Core listing: name, slug, address, phone, logo, cover image | ✅ Yes |
| `facility_categories` | Hospital / Clinic / Pharmacy / Lab / Dental etc. | ✅ Yes (filter) |
| `facility_subcategories` | General Hospital / Day Surgery / IVF Clinic etc. | ✅ Yes (filter) |
| `facility_details` | Hours, beds, accreditations, ratings, amenities | ✅ Yes |
| `facility_social_links` | FB / IG / LinkedIn / WhatsApp URLs | ✅ Yes |
| `facility_emails` | Public appointment email | ✅ Yes (APPOINTMENTS type) |
| `facility_services` | Services list | ✅ Yes |
| `facility_specialties` | Medical specialties | ✅ Yes |
| `facility_staff_specialists` | Doctor profiles | ✅ Yes |
| `health_authorities` | DHA / DOH / MOHAP badges | ✅ Yes |
| `healthcare_organizations` | Parent chain (Aster, NMC, Mediclinic…) | ✅ Yes |
| `facility_ratings_reviews` | Star ratings + reviews | ✅ Yes |
| `specialties` | Master specialty catalog | ✅ Yes |

---

## 2. Project Architecture

```
/app
  /                          → UAE-wide landing (emirate selector)
  /dubai                     → Dubai Healthcare Directory Homepage
  /dubai/[category-slug]     → Category listing page (e.g. /dubai/hospitals)
  /dubai/[category]/[sub]    → Sub-category page (e.g. /dubai/hospitals/general)
  /dubai/[category]/[area]   → Area-filtered page (e.g. /dubai/clinics/downtown-dubai)
  /dubai/facility/[slug]     → Single facility page ⭐
  /[emirate-slug]            → Per-emirate directory (abu-dhabi, sharjah, ajman…)
  /[emirate]/facility/[slug] → Emirate-specific facility page

/api
  /bookings                  → POST: save booking + send email
  /facilities/[slug]         → GET: facility JSON for SSR/ISR
  /reviews                   → POST: submit review
  /sitemap.xml               → Dynamic sitemap (all facility slugs)
  /robots.txt
```

### Slug Generation Rules
```sql
-- facilities.facility_slug is already in the DB
-- Format: {facility-name-kebab-case}-{emirate-code}-{category-code}
-- Example: "aster-hospital-dubai-hospital-dxb"
-- Guarantee uniqueness: append facility_uid suffix if collision
SELECT facility_slug FROM facilities
WHERE facility_slug = 'american-hospital-dubai'
-- → /dubai/facility/american-hospital-dubai
```

---

## 3. URL & Slug Structure

### Canonical URL Pattern
```
https://yourdomain.com/{emirate-slug}/facility/{facility-slug}

Examples:
https://yourdomain.com/dubai/facility/american-hospital-dubai
https://yourdomain.com/dubai/facility/aster-clinic-karama
https://yourdomain.com/abu-dhabi/facility/mediclinic-al-ain
```

### Filter URLs (SEO-friendly)
```
/dubai/hospitals                          → All Dubai hospitals
/dubai/hospitals/general                  → General hospitals in Dubai
/dubai/clinics/dermatology                → Dermatology clinics in Dubai
/dubai/clinics/area/downtown-dubai        → Clinics in Downtown Dubai
/dubai/pharmacies/area/jumeirah           → Pharmacies in Jumeirah
/dubai/dental-centers                     → All dental centers in Dubai
/dubai/diagnostic-labs/area/deira        → Labs in Deira
```

### Slug Sources from DB
```sql
-- Emirates slugs (from emirates.slug)
SELECT slug FROM emirates;
-- → dubai, abu-dhabi, sharjah, ajman, ras-al-khaimah, fujairah, umm-al-quwain

-- Category slugs (from facility_categories.slug)
SELECT slug, name FROM facility_categories WHERE is_active = 1;

-- Sub-category slugs (from facility_subcategories.slug)
SELECT fs.slug, fs.name, fc.slug AS cat_slug
FROM facility_subcategories fs
JOIN facility_categories fc ON fc.id = fs.category_id;

-- Area slugs (from uae_zones.slug)
SELECT slug, zone_name FROM uae_zones WHERE emirate_id = 1;  -- Dubai = 1
```

---

## 4. Directory Homepage — Dubai Healthcare Facilities

### Page Goal
> Serve as the main entry point for Dubai healthcare search.  
> URL: `/dubai` | Title: `Dubai Healthcare Facilities Directory 2025 | Find Hospitals, Clinics & More`

---

### 4.1 Hero Section

```html
<!-- Semantic HTML Structure -->
<section aria-label="Dubai Healthcare Directory Hero">
  <h1>Dubai Healthcare Facilities Directory</h1>
  <p class="subtitle">
    Find verified hospitals, clinics, pharmacies and specialist centres
    across Dubai — licensed by DHA, accredited and reviewed.
  </p>

  <!-- Search Bar (primary CTA) -->
  <form role="search" action="/dubai/search">
    <input
      type="search"
      name="q"
      placeholder="Search by facility name, specialty or area…"
      aria-label="Search Dubai healthcare facilities"
    />
    <button type="submit">Search</button>
  </form>

  <!-- Quick Stats (from DB aggregates) -->
  <div class="stats-bar">
    <span>1,200+ Facilities</span>
    <span>45+ Specialties</span>
    <span>30+ Areas</span>
    <span>DHA Licensed</span>
  </div>
</section>
```

**DB Query for stats:**
```sql
SELECT
  COUNT(*) AS total_facilities,
  COUNT(DISTINCT area_name) AS total_areas,
  COUNT(DISTINCT category_id) AS total_categories
FROM facilities
WHERE emirate_id = 1  -- Dubai
  AND facility_status = 'ACTIVE'
  AND deleted_at IS NULL;
```

---

### 4.2 Category Filter Tabs

```html
<nav aria-label="Facility Categories">
  <ul role="tablist">
    <li role="tab"><a href="/dubai">All</a></li>
    <!-- Dynamic from facility_categories -->
    <li role="tab"><a href="/dubai/hospitals">🏥 Hospitals</a></li>
    <li role="tab"><a href="/dubai/clinics">🩺 Clinics</a></li>
    <li role="tab"><a href="/dubai/pharmacies">💊 Pharmacies</a></li>
    <li role="tab"><a href="/dubai/dental-centers">🦷 Dental</a></li>
    <li role="tab"><a href="/dubai/diagnostic-labs">🔬 Laboratories</a></li>
    <li role="tab"><a href="/dubai/rehabilitation">♿ Rehabilitation</a></li>
    <li role="tab"><a href="/dubai/optical-centers">👁️ Optical</a></li>
  </ul>
</nav>
```

**DB Query:**
```sql
SELECT
  fc.id, fc.name, fc.slug, fc.icon_url, fc.color_code,
  COUNT(f.id) AS facility_count
FROM facility_categories fc
LEFT JOIN facilities f ON f.category_id = fc.id
  AND f.emirate_id = 1
  AND f.facility_status = 'ACTIVE'
  AND f.deleted_at IS NULL
WHERE fc.is_active = 1
GROUP BY fc.id
ORDER BY fc.display_order ASC;
```

---

### 4.3 Sub-Category + Area Filter Panel

```html
<aside aria-label="Refine Results">

  <!-- Sub-Category Filter -->
  <fieldset>
    <legend>Type</legend>
    <!-- Dynamic from facility_subcategories WHERE category_id = selected -->
    <label><input type="checkbox" name="sub" value="general-hospital"> General Hospital</label>
    <label><input type="checkbox" name="sub" value="specialty-hospital"> Specialty Hospital</label>
    <label><input type="checkbox" name="sub" value="day-surgery"> Day Surgery</label>
    <!-- … -->
  </fieldset>

  <!-- Area / Zone Filter -->
  <fieldset>
    <legend>Area</legend>
    <!-- Dynamic from uae_zones WHERE emirate_id = 1 -->
    <label><input type="checkbox" name="area" value="downtown-dubai"> Downtown Dubai</label>
    <label><input type="checkbox" name="area" value="jumeirah"> Jumeirah</label>
    <label><input type="checkbox" name="area" value="deira"> Deira</label>
    <label><input type="checkbox" name="area" value="dhcc"> Dubai Healthcare City</label>
    <label><input type="checkbox" name="area" value="jlt"> JLT</label>
    <label><input type="checkbox" name="area" value="business-bay"> Business Bay</label>
    <!-- … -->
  </fieldset>

  <!-- Additional Filters -->
  <fieldset>
    <legend>Features</legend>
    <label><input type="checkbox" name="feature" value="open-247"> Open 24/7</label>
    <label><input type="checkbox" name="feature" value="jci"> JCI Accredited</label>
    <label><input type="checkbox" name="feature" value="insurance"> Accepts Insurance</label>
    <label><input type="checkbox" name="feature" value="telemedicine"> Telemedicine</label>
    <label><input type="checkbox" name="feature" value="parking"> Free Parking</label>
  </fieldset>

</aside>
```

**Area query:**
```sql
SELECT uz.id, uz.zone_name, uz.slug, COUNT(f.id) AS facility_count
FROM uae_zones uz
LEFT JOIN facilities f ON f.zone_id = uz.id
  AND f.facility_status = 'ACTIVE'
  AND f.deleted_at IS NULL
WHERE uz.emirate_id = 1 AND uz.is_active = 1
GROUP BY uz.id
ORDER BY facility_count DESC;
```

---

### 4.4 Facility Cards Grid

Each card renders from a combined query of `facilities` + `facility_details` + `facility_categories`.

**Card HTML:**
```html
<article class="facility-card" itemscope itemtype="https://schema.org/MedicalOrganization">
  <a href="/dubai/facility/{facility-slug}" aria-label="View {facility-name}">

    <!-- Cover Image -->
    <div class="card-image">
      <img
        src="{cover_image_url}"
        alt="{facility_name} — {category_name} in {area_name}, Dubai"
        loading="lazy"
        width="400" height="225"
        itemprop="image"
      />
      <!-- Badges -->
      <span class="badge badge-category">{category_name}</span>
      <span class="badge badge-verified" aria-label="Verified facility">✓ Verified</span>
      <span class="badge badge-open" aria-live="polite">Open Now</span>
    </div>

    <!-- Logo + Name -->
    <header class="card-header">
      <img
        src="{logo_url}"
        alt="{facility_name} logo"
        class="facility-logo"
        itemprop="logo"
        width="48" height="48"
      />
      <div>
        <h2 itemprop="name">{facility_name}</h2>
        <p class="sub-category">{sub_category_name}</p>
      </div>
    </header>

    <!-- Meta -->
    <div class="card-meta">
      <span itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
        📍 <span itemprop="addressLocality">{area_name}</span>, Dubai
      </span>
      <span>📞 <a href="tel:{primary_phone}" itemprop="telephone">{primary_phone}</a></span>
    </div>

    <!-- Rating -->
    <div class="card-rating" itemprop="aggregateRating" itemscope
         itemtype="https://schema.org/AggregateRating">
      <span class="stars" aria-label="{avg_rating} out of 5 stars">★ {avg_rating}</span>
      <span itemprop="ratingValue" content="{avg_rating}"></span>
      <span itemprop="reviewCount">({review_count} reviews)</span>
    </div>

    <!-- Accreditation Badges -->
    <div class="accreditations" aria-label="Accreditations">
      {#if jci_accredited}<span class="badge-jci" title="JCI Accredited">JCI</span>{/if}
      {#if dha_accredited}<span class="badge-dha" title="DHA Accredited">DHA</span>{/if}
    </div>

    <!-- Book Button -->
    <footer class="card-footer">
      <span class="cta-book">Book Appointment →</span>
    </footer>

  </a>
</article>
```

**Listing Query (Dubai, paginated):**
```sql
SELECT
  f.id, f.facility_name, f.facility_slug, f.area_name, f.primary_phone,
  f.logo_url, f.cover_image_url, f.description,
  f.google_place_id, f.latitude, f.longitude,
  fc.name AS category_name, fc.slug AS category_slug, fc.color_code,
  fsc.name AS sub_category_name,
  fd.avg_rating, fd.review_count, fd.google_rating,
  fd.is_open_24_7, fd.jci_accredited, fd.dha_accredited,
  fd.is_featured, fd.is_verified, fd.accepts_insurance,
  fd.has_telemedicine, fd.parking_available,
  ha.short_name AS health_authority_badge, ha.primary_color AS authority_color
FROM facilities f
JOIN facility_categories fc ON fc.id = f.category_id
LEFT JOIN facility_subcategories fsc ON fsc.id = f.sub_category_id
LEFT JOIN facility_details fd ON fd.facility_id = f.id
LEFT JOIN health_authorities ha ON ha.id = f.health_authority_id
WHERE
  f.emirate_id = 1               -- Dubai
  AND f.facility_status = 'ACTIVE'
  AND f.deleted_at IS NULL
  -- Dynamic filters:
  -- AND f.category_id = ?         -- category filter
  -- AND f.sub_category_id = ?     -- sub-category filter
  -- AND f.zone_id = ?             -- area filter
  -- AND fd.is_open_24_7 = 1       -- 24/7 filter
  -- AND fd.jci_accredited = 1     -- JCI filter
  -- AND fd.accepts_insurance = 1  -- Insurance filter
ORDER BY
  fd.is_featured DESC,
  fd.listing_priority ASC,
  fd.avg_rating DESC,
  f.facility_name ASC
LIMIT 20 OFFSET ?;
```

---

## 5. Single Facility Page

> URL: `/dubai/facility/{facility-slug}`
> Example: `/dubai/facility/american-hospital-dubai`

### Design Direction
**Vibrant healthcare colors**: primary teal `#0D9488`, accent coral `#F97316`, clean white backgrounds, deep navy `#0F172A` for text. Clean but energetic — trustworthy medical + approachable wellness.

---

### 5.1 Page Header / Hero

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <!-- SEO Meta (see Section 7) -->
  <title>{facility_name} | {category_name} in {area_name}, Dubai | {domain}</title>
  <meta name="description" content="{meta_description}" />
  <link rel="canonical" href="https://yourdomain.com/dubai/facility/{facility_slug}" />

  <!-- Open Graph -->
  <meta property="og:title" content="{facility_name} — {category_name} Dubai" />
  <meta property="og:description" content="{meta_description}" />
  <meta property="og:image" content="{cover_image_url}" />
  <meta property="og:url" content="https://yourdomain.com/dubai/facility/{facility_slug}" />
  <meta property="og:type" content="business.business" />

  <!-- Schema.org JSON-LD (see Section 7.2) -->
  <script type="application/ld+json">{schema_json}</script>
</head>
<body>

<!-- COVER IMAGE SECTION -->
<div class="facility-cover" style="position:relative; height:360px; overflow:hidden;">
  <img
    src="{cover_image_url || featured_image_url}"
    alt="{facility_name} — {sub_category_name} in {area_name} Dubai"
    style="width:100%; height:100%; object-fit:cover;"
    fetchpriority="high"
  />
  <!-- Gradient overlay -->
  <div style="position:absolute; bottom:0; left:0; right:0; height:50%;
              background:linear-gradient(transparent, rgba(15,23,42,0.85));"></div>

  <!-- Floating logo card -->
  <div class="logo-card" style="position:absolute; bottom:-32px; left:32px;
    background:white; border-radius:16px; padding:12px; box-shadow:0 8px 32px rgba(0,0,0,0.18);">
    <img src="{logo_url}" alt="{facility_name} logo" width="72" height="72"
         style="border-radius:8px; object-fit:contain;" />
  </div>
</div>

<!-- FACILITY IDENTITY ROW -->
<header class="facility-header" style="padding:48px 32px 0; margin-top:24px;">
  <div>
    <!-- Health authority badge -->
    <span class="authority-badge"
          style="background:{authority_primary_color}; color:white; padding:4px 12px; border-radius:20px; font-size:12px;">
      {health_authority_short_name} Licensed
    </span>

    <h1 style="font-size:2.25rem; font-weight:800; color:#0F172A; margin:12px 0 4px;">
      {facility_name}
    </h1>
    <p style="color:#64748B; font-size:1.1rem;">{sub_category_name} · {area_name}, Dubai</p>

    <!-- Rating row -->
    <div class="rating-row" aria-label="Rating: {avg_rating} out of 5">
      <span class="stars" style="color:#F59E0B;">★ {avg_rating}</span>
      <span style="color:#64748B;">({review_count} reviews)</span>
      {#if google_rating}
        <span style="margin-left:12px; color:#64748B;">
          <img src="/icons/google.svg" width="16" height="16" alt="Google" />
          {google_rating} ({google_review_count})
        </span>
      {/if}
    </div>

    <!-- Accreditation chips -->
    <div class="accreditation-chips" style="margin-top:12px; display:flex; gap:8px; flex-wrap:wrap;">
      {#if jci_accredited}<span class="chip chip-teal">JCI Accredited</span>{/if}
      {#if dha_accredited}<span class="chip chip-blue">DHA Accredited</span>{/if}
      {#if haad_accredited}<span class="chip chip-green">DOH Accredited</span>{/if}
      {#if is_open_24_7}<span class="chip chip-coral">Open 24/7</span>{/if}
      {#if accepts_insurance}<span class="chip chip-purple">Insurance Accepted</span>{/if}
      {#if has_telemedicine}<span class="chip chip-indigo">Telemedicine</span>{/if}
    </div>
  </div>

  <!-- Quick Action Buttons -->
  <div class="quick-actions" style="display:flex; flex-direction:column; gap:12px;">
    <a href="tel:{primary_phone}" class="btn btn-primary">📞 Call Now</a>
    <a href="#booking-form" class="btn btn-secondary">📅 Book Appointment</a>
    <a href="{website_url}" target="_blank" rel="noopener" class="btn btn-outline">
      🌐 Visit Website
    </a>
  </div>
</header>
```

---

### 5.2 Main Content Layout (2-Column)

```html
<main style="display:grid; grid-template-columns:1fr 380px; gap:32px; padding:32px; max-width:1200px; margin:0 auto;">

<!-- LEFT COLUMN: Facility Details -->
<div>

  <!-- About Section -->
  <section aria-labelledby="about-heading" style="margin-bottom:40px;">
    <h2 id="about-heading">About {facility_name}</h2>
    <p itemprop="description">{description}</p>
    {#if description_ar}
      <details>
        <summary>عربي</summary>
        <p lang="ar" dir="rtl">{description_ar}</p>
      </details>
    {/if}
  </section>

  <!-- Services Section -->
  <section aria-labelledby="services-heading" style="margin-bottom:40px;">
    <h2 id="services-heading">Services Offered</h2>
    <ul class="services-grid" style="display:grid; grid-template-columns:repeat(auto-fill,minmax(200px,1fr)); gap:12px;">
      <!-- From facility_services JOIN WHERE facility_id = ? -->
      {#each services as service}
        <li class="service-item" itemprop="availableService"
            itemscope itemtype="https://schema.org/MedicalProcedure">
          <span itemprop="name">{service.service_name}</span>
          {#if service.is_available_24_7}<span class="badge-small">24/7</span>{/if}
        </li>
      {/each}
    </ul>
  </section>

  <!-- Specialties Section -->
  <section aria-labelledby="specialties-heading" style="margin-bottom:40px;">
    <h2 id="specialties-heading">Medical Specialties</h2>
    <div class="specialties-grid">
      {#each specialties as spec}
        <a href="/dubai/specialties/{spec.slug}" class="specialty-chip">
          {spec.name}
        </a>
      {/each}
    </div>
  </section>

  <!-- Doctors / Specialists Section -->
  {#if staff_specialists.length > 0}
  <section aria-labelledby="doctors-heading" style="margin-bottom:40px;">
    <h2 id="doctors-heading">Our Specialists</h2>
    <div class="doctors-grid">
      {#each staff_specialists as doctor}
        <div class="doctor-card" itemprop="employee"
             itemscope itemtype="https://schema.org/Physician">
          <img src="{doctor.profile_image_url}" alt="Dr. {doctor.specialist_name}"
               width="80" height="80" style="border-radius:50%;" itemprop="image" />
          <h3 itemprop="name">Dr. {doctor.specialist_name}</h3>
          <p itemprop="medicalSpecialty">{doctor.specialty}</p>
          {#if doctor.experience_years}
            <p>{doctor.experience_years} years experience</p>
          {/if}
          {#if doctor.consultation_fee}
            <p>Consultation: {doctor.consultation_fee}</p>
          {/if}
        </div>
      {/each}
    </div>
  </section>
  {/if}

  <!-- Operating Hours -->
  <section aria-labelledby="hours-heading" style="margin-bottom:40px;">
    <h2 id="hours-heading">Opening Hours</h2>
    {#if is_open_24_7}
      <p class="highlight-teal"><strong>Open 24 Hours, 7 Days a Week</strong></p>
    {:else}
      <table>
        <tr><th>Days</th><td>{operating_days_from} – {operating_days_to}</td></tr>
        <tr><th>Hours</th><td>{operating_hours_from} – {operating_hours_to}</td></tr>
        {#if is_open_weekends}<tr><td colspan="2">✅ Open Weekends</td></tr>{/if}
      </table>
      {#if hours_notes}<p class="hours-note">{hours_notes}</p>{/if}
    {/if}
  </section>

  <!-- Facilities & Amenities -->
  <section aria-labelledby="amenities-heading" style="margin-bottom:40px;">
    <h2 id="amenities-heading">Facilities & Amenities</h2>
    <ul class="amenities-list">
      {#if bed_capacity}<li>🛏️ {bed_capacity} Beds</li>{/if}
      {#if icu_bed_count}<li>🏥 {icu_bed_count} ICU Beds</li>{/if}
      {#if operating_theatre_count}<li>🔪 {operating_theatre_count} Operating Theatres</li>{/if}
      {#if has_pharmacy}<li>💊 In-House Pharmacy</li>{/if}
      {#if has_lab}<li>🔬 Diagnostic Laboratory</li>{/if}
      {#if has_radiology}<li>🩻 Radiology / Imaging</li>{/if}
      {#if has_ambulance}<li>🚑 Ambulance Service</li>{/if}
      {#if wheelchair_accessible}<li>♿ Wheelchair Accessible</li>{/if}
      {#if parking_available}<li>🅿️ Parking Available</li>{/if}
      {#if valet_parking}<li>🚗 Valet Parking</li>{/if}
    </ul>
  </section>

  <!-- Languages Spoken -->
  {#if languages_spoken}
  <section style="margin-bottom:40px;">
    <h2>Languages Spoken</h2>
    <p>{languages_spoken}</p>
  </section>
  {/if}

  <!-- Insurance Networks -->
  {#if insurance_networks}
  <section style="margin-bottom:40px;">
    <h2>Accepted Insurance</h2>
    <p>{insurance_networks}</p>
  </section>
  {/if}

  <!-- Reviews Section -->
  <section aria-labelledby="reviews-heading" style="margin-bottom:40px;">
    <h2 id="reviews-heading">Patient Reviews</h2>
    {#each reviews.filter(r => r.review_status === 'APPROVED').slice(0,5) as review}
      <article class="review-card" itemprop="review"
               itemscope itemtype="https://schema.org/Review">
        <header>
          <span itemprop="author">{review.user_name}</span>
          <span itemprop="reviewRating" itemscope itemtype="https://schema.org/Rating">
            <span itemprop="ratingValue">{review.rating}</span>/5
          </span>
        </header>
        <h4 itemprop="name">{review.review_title}</h4>
        <p itemprop="reviewBody">{review.review_text}</p>
        {#if review.admin_response}
          <aside class="admin-reply">
            <strong>{facility_name} responds:</strong>
            <p>{review.admin_response}</p>
          </aside>
        {/if}
      </article>
    {/each}
  </section>

  <!-- Map Embed -->
  <section aria-labelledby="location-heading" style="margin-bottom:40px;">
    <h2 id="location-heading">Location</h2>
    <address itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
      <p itemprop="streetAddress">{address_line_1}</p>
      {#if address_line_2}<p itemprop="streetAddress">{address_line_2}</p>{/if}
      <p>
        <span itemprop="addressLocality">{area_name}</span>,
        <span itemprop="addressRegion">Dubai</span>,
        <span itemprop="addressCountry">UAE</span>
      </p>
    </address>
    <!-- Google Maps Embed using google_place_id or lat/lng -->
    <iframe
      src="https://www.google.com/maps/embed/v1/place?key={API_KEY}&q=place_id:{google_place_id}"
      width="100%" height="300" loading="lazy" referrerpolicy="no-referrer-when-downgrade"
      title="{facility_name} location on map"
      aria-label="Map showing location of {facility_name}">
    </iframe>
  </section>

</div>

<!-- RIGHT COLUMN: Sticky Sidebar -->
<aside style="position:sticky; top:24px; align-self:start;">

  <!-- Contact Card -->
  <div class="contact-card" style="background:white; border-radius:16px;
    box-shadow:0 4px 24px rgba(0,0,0,0.10); padding:24px; margin-bottom:24px;">
    <h3>Contact</h3>
    <p>📞 <a href="tel:{primary_phone}">{primary_phone}</a></p>
    {#if secondary_phone}<p>📱 <a href="tel:{secondary_phone}">{secondary_phone}</a></p>{/if}
    {#if appointment_email}<p>✉️ <a href="mailto:{appointment_email}">{appointment_email}</a></p>{/if}
    {#if website_url}<p>🌐 <a href="{website_url}" target="_blank" rel="noopener">Website</a></p>{/if}

    <!-- Social Media Links -->
    <div class="social-links" style="display:flex; gap:12px; margin-top:16px;">
      {#each social_links as link}
        <a href="{link.profile_url}" target="_blank" rel="noopener noreferrer"
           aria-label="{facility_name} on {link.platform}"
           class="social-icon social-{link.platform.toLowerCase()}">
          <!-- SVG icons per platform -->
          {link.platform_icon}
        </a>
      {/each}
    </div>
  </div>

  <!-- Booking Form -->
  <!-- See Section 6 -->

</aside>
</main>
```

---

## 6. Booking Form — Save to DB + Email

### 6.1 Database Table (Add to Schema)

```sql
CREATE TABLE `appointment_bookings` (
  `id`               BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `facility_id`      BIGINT UNSIGNED NOT NULL,
  `booking_ref`      VARCHAR(20) NOT NULL COMMENT 'e.g. BK-20250601-XXXX',
  `patient_name`     VARCHAR(150) NOT NULL,
  `patient_email`    VARCHAR(255) NOT NULL,
  `patient_phone`    VARCHAR(20) NOT NULL,
  `nationality`      VARCHAR(80) DEFAULT NULL,
  `insurance_provider` VARCHAR(150) DEFAULT NULL,
  `preferred_date`   DATE NOT NULL,
  `preferred_time`   ENUM('MORNING','AFTERNOON','EVENING') NOT NULL DEFAULT 'MORNING',
  `specialty_requested` VARCHAR(150) DEFAULT NULL,
  `doctor_requested` VARCHAR(150) DEFAULT NULL,
  `reason_for_visit` TEXT DEFAULT NULL,
  `notes`            TEXT DEFAULT NULL,
  `status`           ENUM('PENDING','CONFIRMED','CANCELLED','COMPLETED') NOT NULL DEFAULT 'PENDING',
  `email_sent_facility` TINYINT(1) NOT NULL DEFAULT 0,
  `email_sent_patient`  TINYINT(1) NOT NULL DEFAULT 0,
  `ip_address`       VARCHAR(45) DEFAULT NULL,
  `source_url`       VARCHAR(500) DEFAULT NULL,
  `created_at`       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `booking_ref` (`booking_ref`),
  KEY `facility_id` (`facility_id`),
  KEY `preferred_date` (`preferred_date`),
  FOREIGN KEY (`facility_id`) REFERENCES `facilities`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Patient appointment booking requests from the public directory';
```

---

### 6.2 Booking Form HTML

```html
<!-- Sticky sidebar booking widget -->
<div id="booking-form" class="booking-card" style="
  background: linear-gradient(135deg, #0D9488 0%, #0F766E 100%);
  border-radius:16px; padding:24px; color:white;">

  <h3 style="color:white; font-size:1.2rem; margin-bottom:16px;">
    📅 Book an Appointment
  </h3>

  <form id="appointmentForm" novalidate aria-label="Book appointment at {facility_name}">
    <input type="hidden" name="facility_id" value="{facility_id}" />
    <input type="hidden" name="facility_name" value="{facility_name}" />
    <input type="hidden" name="facility_email" value="{appointment_email}" />
    <input type="hidden" name="source_url" value="{current_url}" />

    <!-- Patient Name -->
    <div class="form-group">
      <label for="patient_name">Full Name *</label>
      <input type="text" id="patient_name" name="patient_name"
             required minlength="2" maxlength="150"
             placeholder="Your full name"
             autocomplete="name"
             aria-required="true" />
      <span class="error" aria-live="polite"></span>
    </div>

    <!-- Email -->
    <div class="form-group">
      <label for="patient_email">Email Address *</label>
      <input type="email" id="patient_email" name="patient_email"
             required maxlength="255"
             placeholder="you@example.com"
             autocomplete="email"
             aria-required="true" />
      <span class="error" aria-live="polite"></span>
    </div>

    <!-- Phone -->
    <div class="form-group">
      <label for="patient_phone">Phone Number *</label>
      <input type="tel" id="patient_phone" name="patient_phone"
             required placeholder="+971 50 000 0000"
             autocomplete="tel"
             aria-required="true" />
      <span class="error" aria-live="polite"></span>
    </div>

    <!-- Preferred Date -->
    <div class="form-group">
      <label for="preferred_date">Preferred Date *</label>
      <input type="date" id="preferred_date" name="preferred_date"
             required
             min="{today}"
             aria-required="true" />
      <span class="error" aria-live="polite"></span>
    </div>

    <!-- Preferred Time -->
    <div class="form-group">
      <label for="preferred_time">Preferred Time</label>
      <select id="preferred_time" name="preferred_time">
        <option value="MORNING">Morning (8am – 12pm)</option>
        <option value="AFTERNOON">Afternoon (12pm – 5pm)</option>
        <option value="EVENING">Evening (5pm – 9pm)</option>
      </select>
    </div>

    <!-- Specialty -->
    <div class="form-group">
      <label for="specialty_requested">Specialty / Department</label>
      <select id="specialty_requested" name="specialty_requested">
        <option value="">Select specialty…</option>
        {#each facility_specialties as spec}
          <option value="{spec.name}">{spec.name}</option>
        {/each}
      </select>
    </div>

    <!-- Reason -->
    <div class="form-group">
      <label for="reason_for_visit">Reason for Visit</label>
      <textarea id="reason_for_visit" name="reason_for_visit"
                rows="3" maxlength="500"
                placeholder="Brief description of your concern…"
                aria-describedby="reason-hint"></textarea>
      <small id="reason-hint">Optional. Do not include sensitive medical details.</small>
    </div>

    <!-- Insurance -->
    <div class="form-group">
      <label for="insurance_provider">Insurance Provider</label>
      <input type="text" id="insurance_provider" name="insurance_provider"
             placeholder="e.g. Daman, AXA, MetLife"
             list="insurance-list" />
      <datalist id="insurance-list">
        <option value="Daman">
        <option value="AXA Gulf">
        <option value="MetLife">
        <option value="Oman Insurance">
        <option value="ADNIC">
        <option value="No Insurance">
      </datalist>
    </div>

    <!-- Privacy consent -->
    <div class="form-group">
      <label class="checkbox-label">
        <input type="checkbox" name="consent" required aria-required="true" />
        I agree to the <a href="/privacy" target="_blank">Privacy Policy</a>
        and consent to being contacted about my appointment request.
      </label>
    </div>

    <!-- Submit -->
    <button type="submit" class="btn-book-submit"
            style="width:100%; background:white; color:#0D9488;
                   font-weight:700; padding:14px; border-radius:10px;
                   border:none; cursor:pointer; font-size:1rem;">
      Request Appointment
    </button>

    <!-- Success / Error message -->
    <div id="form-status" role="alert" aria-live="assertive" style="margin-top:12px;"></div>
  </form>
</div>
```

---

### 6.3 API Route — `/api/bookings` (Next.js)

```typescript
// app/api/bookings/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { db } from '@/lib/db';           // your DB connection (mysql2 / PlanetScale)
import { sendBookingEmails } from '@/lib/email';
import { nanoid } from 'nanoid';
import { z } from 'zod';

const BookingSchema = z.object({
  facility_id:          z.coerce.number().int().positive(),
  facility_name:        z.string().min(1),
  facility_email:       z.string().email(),
  patient_name:         z.string().min(2).max(150),
  patient_email:        z.string().email().max(255),
  patient_phone:        z.string().min(7).max(20),
  preferred_date:       z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
  preferred_time:       z.enum(['MORNING', 'AFTERNOON', 'EVENING']).default('MORNING'),
  specialty_requested:  z.string().max(150).optional(),
  doctor_requested:     z.string().max(150).optional(),
  reason_for_visit:     z.string().max(500).optional(),
  insurance_provider:   z.string().max(150).optional(),
  source_url:           z.string().url().optional(),
});

export async function POST(req: NextRequest) {
  try {
    const body = await req.json();
    const data = BookingSchema.parse(body);

    // Validate preferred_date is not in the past
    if (new Date(data.preferred_date) < new Date()) {
      return NextResponse.json(
        { success: false, message: 'Preferred date must be in the future.' },
        { status: 400 }
      );
    }

    // Generate unique booking reference
    const booking_ref = `BK-${new Date().toISOString().slice(0,10).replace(/-/g,'')}-${nanoid(6).toUpperCase()}`;

    // Save to DB
    await db.query(
      `INSERT INTO appointment_bookings
       (facility_id, booking_ref, patient_name, patient_email, patient_phone,
        preferred_date, preferred_time, specialty_requested, doctor_requested,
        reason_for_visit, insurance_provider, source_url, ip_address)
       VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
      [
        data.facility_id, booking_ref,
        data.patient_name, data.patient_email, data.patient_phone,
        data.preferred_date, data.preferred_time,
        data.specialty_requested || null, data.doctor_requested || null,
        data.reason_for_visit || null, data.insurance_provider || null,
        data.source_url || null,
        req.headers.get('x-forwarded-for') || req.ip || null,
      ]
    );

    // Send emails (non-blocking)
    sendBookingEmails({
      booking_ref,
      facility_name:  data.facility_name,
      facility_email: data.facility_email,
      patient_name:   data.patient_name,
      patient_email:  data.patient_email,
      patient_phone:  data.patient_phone,
      preferred_date: data.preferred_date,
      preferred_time: data.preferred_time,
      specialty:      data.specialty_requested,
      reason:         data.reason_for_visit,
    }).catch(console.error);  // don't fail if email fails

    return NextResponse.json({
      success: true,
      booking_ref,
      message: `Appointment request submitted! Reference: ${booking_ref}. The facility will contact you within 24 hours.`,
    });

  } catch (err) {
    if (err instanceof z.ZodError) {
      return NextResponse.json(
        { success: false, errors: err.flatten().fieldErrors },
        { status: 422 }
      );
    }
    console.error('Booking error:', err);
    return NextResponse.json(
      { success: false, message: 'An error occurred. Please try again.' },
      { status: 500 }
    );
  }
}
```

---

### 6.4 Email Templates (Resend / Nodemailer)

```typescript
// lib/email.ts
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);

interface BookingEmailData {
  booking_ref: string;
  facility_name: string;
  facility_email: string;
  patient_name: string;
  patient_email: string;
  patient_phone: string;
  preferred_date: string;
  preferred_time: string;
  specialty?: string;
  reason?: string;
}

export async function sendBookingEmails(data: BookingEmailData) {
  const dateFormatted = new Date(data.preferred_date).toLocaleDateString('en-AE', {
    weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'
  });
  const timeMap = { MORNING: 'Morning (8am–12pm)', AFTERNOON: 'Afternoon (12pm–5pm)', EVENING: 'Evening (5pm–9pm)' };

  // Email to FACILITY
  await resend.emails.send({
    from:    'noreply@yourdomain.com',
    to:      data.facility_email,
    subject: `New Appointment Request — ${data.booking_ref} | ${data.patient_name}`,
    html: `
      <div style="font-family:system-ui,sans-serif; max-width:600px; margin:0 auto;">
        <div style="background:#0D9488; color:white; padding:24px; border-radius:12px 12px 0 0;">
          <h1 style="margin:0; font-size:1.4rem;">New Appointment Request</h1>
          <p style="margin:4px 0 0; opacity:0.85;">Ref: ${data.booking_ref}</p>
        </div>
        <div style="background:#F8FAFC; padding:24px; border-radius:0 0 12px 12px; border:1px solid #E2E8F0;">
          <h2 style="color:#0F172A;">Patient Details</h2>
          <table style="width:100%; border-collapse:collapse;">
            <tr><td style="padding:8px 0; color:#64748B;">Name</td><td><strong>${data.patient_name}</strong></td></tr>
            <tr><td style="padding:8px 0; color:#64748B;">Email</td><td><a href="mailto:${data.patient_email}">${data.patient_email}</a></td></tr>
            <tr><td style="padding:8px 0; color:#64748B;">Phone</td><td><a href="tel:${data.patient_phone}">${data.patient_phone}</a></td></tr>
            <tr><td style="padding:8px 0; color:#64748B;">Preferred Date</td><td><strong>${dateFormatted}</strong></td></tr>
            <tr><td style="padding:8px 0; color:#64748B;">Preferred Time</td><td>${timeMap[data.preferred_time]}</td></tr>
            ${data.specialty ? `<tr><td style="padding:8px 0; color:#64748B;">Specialty</td><td>${data.specialty}</td></tr>` : ''}
            ${data.reason ? `<tr><td style="padding:8px 0; color:#64748B;">Reason</td><td>${data.reason}</td></tr>` : ''}
          </table>
          <p style="margin-top:24px; color:#475569; font-size:0.9rem;">
            Please contact the patient within 24 hours to confirm their appointment.
          </p>
        </div>
      </div>`,
  });

  // Confirmation email to PATIENT
  await resend.emails.send({
    from:    `${data.facility_name} via YourDirectory <noreply@yourdomain.com>`,
    to:      data.patient_email,
    subject: `Appointment Request Confirmed — ${data.booking_ref} | ${data.facility_name}`,
    html: `
      <div style="font-family:system-ui,sans-serif; max-width:600px; margin:0 auto;">
        <div style="background:#0D9488; color:white; padding:24px; border-radius:12px 12px 0 0;">
          <h1 style="margin:0; font-size:1.4rem;">Appointment Request Received ✓</h1>
          <p style="margin:4px 0 0; opacity:0.85;">${data.facility_name}</p>
        </div>
        <div style="background:#F8FAFC; padding:24px; border-radius:0 0 12px 12px; border:1px solid #E2E8F0;">
          <p>Hi <strong>${data.patient_name}</strong>,</p>
          <p>Your appointment request at <strong>${data.facility_name}</strong> has been received. Here are your details:</p>
          <div style="background:white; border:1px solid #E2E8F0; border-radius:8px; padding:16px; margin:16px 0;">
            <p><strong>Reference:</strong> ${data.booking_ref}</p>
            <p><strong>Preferred Date:</strong> ${dateFormatted}</p>
            <p><strong>Preferred Time:</strong> ${timeMap[data.preferred_time]}</p>
            ${data.specialty ? `<p><strong>Specialty:</strong> ${data.specialty}</p>` : ''}
          </div>
          <p>The facility will contact you within <strong>24 hours</strong> to confirm.</p>
          <p style="color:#64748B; font-size:0.85rem;">
            This is an automated confirmation. Please contact the facility directly for urgent enquiries.
          </p>
        </div>
      </div>`,
  });
}
```

---

## 7. SEO / AEO / GEO Strategy

### 7.1 Page-Level SEO

#### Title Tag Pattern
```
{facility_name} — {sub_category_name} in {area_name} Dubai | Book Now
American Hospital Dubai — General Hospital in Oud Metha, Dubai | Book Now
```

#### Meta Description Pattern (160 chars)
```
{facility_name} is a {sub_category_name} in {area_name}, Dubai.
{#if jci}JCI Accredited. {/if}
{#if is_open_24_7}Open 24/7. {/if}
Call {primary_phone} or book an appointment online.
Services: {top_3_specialties}.
```

**DB Query for meta_description:**
```sql
SELECT
  CONCAT(
    f.facility_name, ' is a ',
    fsc.name, ' in ',
    f.area_name, ', Dubai. ',
    IF(fd.jci_accredited, 'JCI Accredited. ', ''),
    IF(fd.is_open_24_7, 'Open 24/7. ', ''),
    'Call ', f.primary_phone, ' or book online.'
  ) AS auto_meta_description
FROM facilities f
LEFT JOIN facility_subcategories fsc ON fsc.id = f.sub_category_id
LEFT JOIN facility_details fd ON fd.facility_id = f.id
WHERE f.id = ?;
-- Use facilities.meta_description if already populated, else use auto-generated
```

---

### 7.2 Schema.org Structured Data (JSON-LD)

Each facility page must include a complete `MedicalOrganization` schema block:

```json
{
  "@context": "https://schema.org",
  "@type": "MedicalOrganization",
  "@id": "https://yourdomain.com/dubai/facility/{facility_slug}#organization",
  "name": "{facility_name}",
  "alternateName": "{facility_name_ar}",
  "description": "{meta_description}",
  "url": "https://yourdomain.com/dubai/facility/{facility_slug}",
  "logo": "{logo_url}",
  "image": "{cover_image_url}",
  "telephone": "{primary_phone}",
  "email": "{appointment_email}",
  "foundingDate": "{establishment_year}",
  "medicalSpecialty": ["{specialty_1}", "{specialty_2}"],
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "{address_line_1}",
    "addressLocality": "{area_name}",
    "addressRegion": "Dubai",
    "addressCountry": "AE",
    "postalCode": "{postal_code}"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": "{latitude}",
    "longitude": "{longitude}"
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday"],
      "opens": "{operating_hours_from}",
      "closes": "{operating_hours_to}"
    }
  ],
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "{avg_rating}",
    "reviewCount": "{review_count}",
    "bestRating": "5",
    "worstRating": "1"
  },
  "hasMap": "https://www.google.com/maps/place/?q=place_id:{google_place_id}",
  "sameAs": [
    "{facebook_url}",
    "{instagram_url}",
    "{linkedin_url}"
  ],
  "isAccreditedBy": [
    {
      "@type": "Organization",
      "name": "Dubai Health Authority",
      "url": "https://www.dha.gov.ae"
    }
  ]
}
```

**Add `BreadcrumbList` on every page:**
```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {"@type":"ListItem","position":1,"name":"UAE Healthcare","item":"https://yourdomain.com"},
    {"@type":"ListItem","position":2,"name":"Dubai","item":"https://yourdomain.com/dubai"},
    {"@type":"ListItem","position":3,"name":"{category_name}","item":"https://yourdomain.com/dubai/{category_slug}"},
    {"@type":"ListItem","position":4,"name":"{facility_name}","item":"https://yourdomain.com/dubai/facility/{facility_slug}"}
  ]
}
```

**Add `FAQPage` schema (AI-generated from facility data):**
```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What are {facility_name} opening hours?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "{is_open_24_7 ? 'Open 24 hours, 7 days a week.' : operating_days_from + ' to ' + operating_days_to + ', ' + operating_hours_from + ' to ' + operating_hours_to}"
      }
    },
    {
      "@type": "Question",
      "name": "Does {facility_name} accept insurance?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "{accepts_insurance ? 'Yes, ' + facility_name + ' accepts insurance including: ' + insurance_networks : 'Please contact the facility for insurance information.'}"
      }
    },
    {
      "@type": "Question",
      "name": "Where is {facility_name} located?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "{facility_name} is located at {address_line_1}, {area_name}, Dubai, UAE."
      }
    },
    {
      "@type": "Question",
      "name": "Is {facility_name} JCI accredited?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "{jci_accredited ? 'Yes, ' + facility_name + ' is JCI accredited.' : 'Please check with the facility for current accreditation status.'}"
      }
    }
  ]
}
```

---

### 7.3 AEO — Answer Engine Optimization

**Target AI-cited queries (ChatGPT, Perplexity, Gemini, Claude):**

| Query Pattern | Page to Optimize |
|--------------|-----------------|
| "Best hospitals in Dubai for cardiology" | `/dubai/hospitals` + Cardiology specialty pages |
| "24-hour clinics near Downtown Dubai" | Filter page + facility detail pages |
| "JCI accredited hospitals Dubai" | Filtered listing `/dubai/hospitals?accreditation=jci` |
| "Nearest dentist in Jumeirah Dubai" | Area + category filter page |
| "What is American Hospital Dubai phone number" | Facility detail page |
| "Does City Hospital Dubai accept Daman insurance" | Facility detail page |

**AEO Implementation:**
1. Add `<meta name="description">` with direct answers to likely questions
2. Use `FAQ schema` with conversational Q&A pairs drawn from facility data
3. Ensure H2/H3 headings match natural language questions
4. Keep first paragraph of each section a direct, dense-fact summary
5. Maintain `HowTo` schema for the booking process:

```json
{
  "@type": "HowTo",
  "name": "How to book an appointment at {facility_name}",
  "step": [
    {"@type":"HowToStep","text":"Fill in your name, email, and phone number"},
    {"@type":"HowToStep","text":"Select your preferred date and time"},
    {"@type":"HowToStep","text":"Choose your specialty or department"},
    {"@type":"HowToStep","text":"Submit the form and receive a confirmation email with your booking reference"}
  ]
}
```

---

### 7.4 GEO — Generative Engine Optimization

Optimize for LLM citation by making facts machine-readable and citation-friendly:

```html
<!-- Semantic HTML microdata signals for LLMs -->
<meta name="geo.region" content="AE-DU" />
<meta name="geo.placename" content="{area_name}, Dubai, UAE" />
<meta name="geo.position" content="{latitude};{longitude}" />
<meta name="ICBM" content="{latitude}, {longitude}" />

<!-- Inline JSON-LD with rich detail (LLMs parse this well) -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "MedicalOrganization",
  "name": "{facility_name}",
  "numberOfBeds": {bed_capacity},
  "numberOfEmployees": {"@type":"QuantitativeValue","value":{staff_count_total}},
  "foundingDate": "{establishment_year}",
  "priceRange": "AED",
  "currenciesAccepted": "AED",
  "paymentAccepted": "Cash, Credit Card, Insurance",
  "areaServed": {"@type":"City","name":"Dubai","containedInPlace":{"@type":"Country","name":"United Arab Emirates"}}
}
</script>

<!-- hreflang for Arabic version -->
<link rel="alternate" hreflang="ar" href="https://yourdomain.com/ar/dubai/facility/{facility_slug}" />
<link rel="alternate" hreflang="en" href="https://yourdomain.com/dubai/facility/{facility_slug}" />
<link rel="alternate" hreflang="x-default" href="https://yourdomain.com/dubai/facility/{facility_slug}" />
```

**Content Freshness (GEO ranking factor):**
```sql
-- Surface "last verified" timestamp prominently
SELECT verified_at, updated_at FROM facilities WHERE id = ?;
-- Add to page: <time datetime="{updated_at}">Last updated {date}</time>
```

---

### 7.5 Dynamic Sitemap

```typescript
// app/sitemap.ts
export default async function sitemap() {
  const facilities = await db.query(`
    SELECT facility_slug, emirate_id, updated_at,
           (SELECT slug FROM emirates WHERE id = facilities.emirate_id) AS emirate_slug
    FROM facilities
    WHERE facility_status = 'ACTIVE' AND deleted_at IS NULL
    ORDER BY updated_at DESC
  `);

  return [
    { url: 'https://yourdomain.com', lastModified: new Date(), changeFrequency: 'daily', priority: 1 },
    { url: 'https://yourdomain.com/dubai', lastModified: new Date(), changeFrequency: 'daily', priority: 0.9 },
    ...facilities.map(f => ({
      url: `https://yourdomain.com/${f.emirate_slug}/facility/${f.facility_slug}`,
      lastModified: new Date(f.updated_at),
      changeFrequency: 'weekly',
      priority: 0.8,
    })),
  ];
}
```

---

## 8. Database Tables Used (Annotated)

### Full JOIN Query for Single Facility Page

```sql
SELECT
  -- Core facility
  f.id, f.facility_uid, f.facility_name, f.facility_name_ar, f.facility_slug,
  f.address_line_1, f.address_line_2, f.area_name, f.area_name_ar,
  f.city, f.postal_code, f.latitude, f.longitude, f.google_place_id,
  f.primary_phone, f.secondary_phone, f.website_url,
  f.logo_url, f.featured_image_url, f.cover_image_url,
  f.description, f.description_ar,
  f.meta_keywords, f.meta_description,
  f.bed_capacity, f.staff_count_total, f.establishment_year,
  f.facility_status,

  -- Emirate
  e.name AS emirate_name, e.slug AS emirate_slug,

  -- Category & Sub-category
  fc.name AS category_name, fc.slug AS category_slug, fc.color_code AS cat_color,
  fsc.name AS sub_category_name, fsc.slug AS sub_category_slug,

  -- Details (1:1)
  fd.staff_count_physicians, fd.staff_count_nurses,
  fd.icu_bed_count, fd.er_bed_count, fd.operating_theatre_count,
  fd.operating_days_from, fd.operating_days_to,
  fd.operating_hours_from, fd.operating_hours_to,
  fd.is_open_24_7, fd.is_open_weekends, fd.hours_notes,
  fd.jci_accredited, fd.jci_accreditation_date,
  fd.dha_accredited, fd.haad_accredited,
  fd.iso_certifications, fd.other_certifications,
  fd.avg_rating, fd.review_count, fd.google_rating, fd.google_review_count,
  fd.is_featured, fd.is_verified,
  fd.languages_spoken, fd.wheelchair_accessible, fd.parking_available,
  fd.valet_parking, fd.has_pharmacy, fd.has_lab, fd.has_radiology,
  fd.has_ambulance, fd.has_telemedicine, fd.accepts_insurance, fd.insurance_networks,
  fd.profile_completion_pct,

  -- Health Authority
  ha.short_name AS authority_short, ha.name AS authority_name, ha.primary_color AS authority_color,

  -- Healthcare Organization (parent chain)
  ho.org_name AS parent_org_name, ho.org_slug AS parent_org_slug, ho.logo_url AS parent_logo_url,

  -- Zone
  uz.zone_name, uz.zone_type

FROM facilities f
JOIN emirates e ON e.id = f.emirate_id
JOIN facility_categories fc ON fc.id = f.category_id
LEFT JOIN facility_subcategories fsc ON fsc.id = f.sub_category_id
LEFT JOIN facility_details fd ON fd.facility_id = f.id
LEFT JOIN health_authorities ha ON ha.id = f.health_authority_id
LEFT JOIN healthcare_organizations ho ON ho.id = f.healthcare_org_id
LEFT JOIN uae_zones uz ON uz.id = f.zone_id
WHERE f.facility_slug = ?
  AND f.facility_status = 'ACTIVE'
  AND f.deleted_at IS NULL
LIMIT 1;
```

---

## 9. Extended UAE Coverage (All Emirates)

```sql
-- All 7 emirates from DB
SELECT id, name, name_ar, slug, code, capital, population,
       description, description_ar, logo_url, banner_url
FROM emirates WHERE is_active = 1 ORDER BY id;

-- Expected results:
-- 1 = Dubai (slug: dubai)
-- 2 = Abu Dhabi (slug: abu-dhabi)
-- 3 = Sharjah (slug: sharjah)
-- 4 = Ajman (slug: ajman)
-- 5 = Ras Al Khaimah (slug: ras-al-khaimah)
-- 6 = Fujairah (slug: fujairah)
-- 7 = Umm Al Quwain (slug: umm-al-quwain)
```

### Per-Emirate Health Authority Mapping
```sql
SELECT ha.code, ha.short_name, ha.name, e.name AS emirate, ha.website_url
FROM health_authorities ha
LEFT JOIN emirates e ON e.id = ha.emirate_id
ORDER BY ha.display_order;

-- DHA  = Dubai Health Authority (Dubai)
-- DOH  = Department of Health (Abu Dhabi)
-- MOHAP = Ministry of Health & Prevention (Federal / Northern Emirates)
-- SHC  = Sharjah Health Council (Sharjah)
-- RAKHC = Ras Al Khaimah Health Cluster
-- FHC  = Fujairah Health Cluster
-- AJMHD = Ajman Healthcare
```

### UAE Homepage Structure
```
yourdomain.com/
  ├── Emirate cards with count of facilities
  ├── /dubai       → Dubai Directory (Phase 1)
  ├── /abu-dhabi   → Abu Dhabi Directory
  ├── /sharjah     → Sharjah Directory
  ├── /ajman       → Ajman Directory
  ├── /ras-al-khaimah
  ├── /fujairah
  └── /umm-al-quwain
```

---

## 10. Implementation Checklist

### Phase 1 — Dubai Directory (MVP)
- [ ] Set up Next.js 14 project with App Router + TypeScript
- [ ] Connect to `ehealth_dmr` database (PlanetScale / Supabase / direct MySQL)
- [ ] Build `emirates` + `facility_categories` seed data pages
- [ ] Implement `/dubai` homepage with category tabs + area filter
- [ ] Implement `/dubai/facility/[slug]` dynamic route with ISR (revalidate: 3600)
- [ ] Build `appointment_bookings` table migration
- [ ] Implement `/api/bookings` POST endpoint with Zod validation
- [ ] Integrate Resend for dual email (facility + patient)
- [ ] Add Schema.org JSON-LD on all facility pages
- [ ] Generate `sitemap.xml` dynamically from all active facilities
- [ ] Add `robots.txt` and canonical tags
- [ ] Implement Arabic (`/ar`) language routes with RTL layout
- [ ] Add Open Graph images (auto-generate with Satori or Cloudinary)
- [ ] Set up Google Search Console + Bing Webmaster

### Phase 2 — Full UAE Coverage
- [ ] Extend to all 7 emirates
- [ ] Add specialty sub-directory pages (`/dubai/specialties/cardiology`)
- [ ] Implement reviews/ratings system (POST to `facility_ratings_reviews`)
- [ ] Add doctor profile pages from `facility_staff_specialists`
- [ ] Implement organization group pages from `healthcare_organizations`
- [ ] Build comparison feature (compare 2-3 facilities side by side)
- [ ] Add map view using Google Maps API + `latitude/longitude` from `facilities`
- [ ] Implement WhatsApp booking button (from `facility_social_links` where `platform = 'WHATSAPP'`)
- [ ] Add insurance filter using `fd.accepts_insurance` + `fd.insurance_networks`

### SEO / AEO / GEO Final Checks
- [ ] All pages have unique `<title>` and `<meta description>`
- [ ] `MedicalOrganization` + `BreadcrumbList` JSON-LD on every facility page
- [ ] `FAQPage` schema with 4+ Q&A pairs per facility
- [ ] `hreflang` en/ar on all pages
- [ ] Core Web Vitals: LCP < 2.5s (optimize cover images with Next.js `Image`)
- [ ] Dynamic sitemap covers all active facilities across all emirates
- [ ] `geo.region`, `geo.placename`, `geo.position` meta tags
- [ ] Verified by Google Search Console + submitted sitemap
- [ ] Page titles include area names for local SEO (e.g. "Clinics in Jumeirah Dubai")
- [ ] Internal linking: each facility page links to related specialties, areas, and category pages

---

*Generated from `ehealth_dmr` database schema analysis — June 2026*
*Covers: 35+ tables · 7 emirates · all facility categories & subcategories*
