# EnCoach Platform -- Architecture & Connectivity Document

## Overview

EnCoach is an **IELTS preparation and English proficiency testing platform** composed of four repositories that work together as a distributed system. The platform supports exam taking, AI-powered grading, training content, multi-tenant entity management, payments, and a public-facing marketing website.

---

## Repositories at a Glance

- **[ielts-ui](ielts-ui)** -- Full-stack Next.js 14 app. The main platform for students, teachers, admins, and corporate users. Serves both the browser UI and internal API routes.
- **[ielts-be](ielts-be)** -- Python/FastAPI backend. Handles AI/ML workloads: exam generation, grading (writing/speaking), audio transcription, TTS, and training content.
- **[encoachcms](encoachcms)** -- Strapi v4 headless CMS. Manages bilingual (EN/AR) marketing content for the landing page.
- **[encoach-landing-page](encoach-landing-page)** -- Next.js 13 marketing website. Consumes CMS content and links users into the main platform.

---

## System Architecture Diagram

```mermaid
graph TB
  subgraph publicFacing ["Public-Facing Layer"]
    LP["encoach-landing-page<br/>(Next.js 13)"]
    CMS["encoachcms<br/>(Strapi v4)"]
  end

  subgraph platformCore ["Platform Core"]
    UI["ielts-ui<br/>(Next.js 14 + API Routes)"]
    BE["ielts-be<br/>(FastAPI / Python)"]
  end

  subgraph dataStores ["Data Stores"]
    MongoDB["MongoDB"]
    MySQL["MySQL<br/>(CMS)"]
    FirebaseAuth["Firebase Auth"]
    FirebaseStorage["Firebase Storage"]
    GCS["Google Cloud Storage<br/>(CMS uploads)"]
  end

  subgraph externalServices ["External Services"]
    OpenAI["OpenAI GPT-4o"]
    Whisper["OpenAI Whisper<br/>(local)"]
    Polly["AWS Polly<br/>(TTS)"]
    ELAI["ELAI<br/>(AI Video)"]
    GPTZero["GPTZero<br/>(AI Detection)"]
    Stripe["Stripe"]
    PayPal["PayPal"]
    Paymob["Paymob"]
  end

  LP -->|"REST + Bearer token"| CMS
  LP -->|"GET /api/packages, POST /api/tickets"| UI
  LP -->|"Links to platform.encoach.com"| UI

  CMS --> MySQL
  CMS --> GCS

  UI --> MongoDB
  UI --> FirebaseAuth
  UI -->|"Proxy: Bearer JWT"| BE

  BE --> MongoDB
  BE --> FirebaseAuth
  BE --> FirebaseStorage
  BE --> OpenAI
  BE --> Whisper
  BE --> Polly
  BE --> ELAI
  BE --> GPTZero

  UI --> Stripe
  UI --> PayPal
  UI --> Paymob
  LP --> Stripe
```

---

## 1. ielts-ui (Main Platform)

**Tech:** Next.js 14, React 18, TypeScript, Tailwind CSS + DaisyUI, Zustand, SWR, iron-session, Firebase Auth, MongoDB (direct)

**Role:** The central application. Serves the browser UI and acts as a **BFF (Backend-for-Frontend)** via Next.js API routes. It directly queries MongoDB for user/entity/group data and proxies AI-related requests to `ielts-be`.

### Key Modules

| Module | Description |
|--------|-------------|
| **Auth** | Firebase email/password auth + iron-session cookies. SSR-protected via `withIronSessionSsr`. |
| **Dashboards** | Role-based: student, teacher, admin, corporate, mastercorporate, developer, agent. |
| **Exams** | Taking exams (Reading, Listening, Writing, Speaking, Level). Zustand store tracks session, progress, solutions. |
| **Exam Editor** | Create/edit exams with dedicated components under `src/components/ExamEditor/`. |
| **Training** | Training content consumed from `ielts-be`. |
| **Grading** | Writing and speaking grading proxied to `ielts-be` as background tasks; UI polls for results. |
| **Entities** | Multi-tenant entity management (schools, organizations). |
| **Classrooms** | Classroom and group management for teachers. |
| **Assignments** | Assign exams to students with deadlines. |
| **Stats** | Performance statistics and PDF report generation (via `@react-pdf/renderer`). |
| **Payments** | Stripe, PayPal, Paymob webhook handlers in API routes. |
| **Tickets** | Support ticket system. |
| **User Mgmt** | Bulk import, permissions, role-based access. |

### How it Connects to ielts-be

API routes in `src/pages/api/` proxy to `BACKEND_URL` with `Authorization: Bearer ${BACKEND_JWT}`:

| UI API Route | Backend Endpoint |
|--------------|------------------|
| `/api/evaluate/writing` | `BACKEND_URL/grade/writing/{task}` |
| `/api/evaluate/speaking` | `BACKEND_URL/grade/speaking/{task}` |
| `/api/transcribe` | `BACKEND_URL/listening/transcribe` |
| `/api/training` | `BACKEND_URL/training/` |
| `/api/exam/upload` | `BACKEND_URL/{endpoint}` |
| `/api/exam/media/*` | `BACKEND_URL/{endpoint}/media` |
| `/api/exam/generate/*` | `BACKEND_URL/{endpoint}` |
| `/api/exam/avatars` | `BACKEND_URL/speaking/avatars` |
| `/api/exam/[module]/import` | `BACKEND_URL/{module}/import` |
| `/api/stats/[id]/[export]/pdf` | `BACKEND_URL/grade/summary` |
| `/api/batch_users` | `BACKEND_URL/user/import` |

### How it Connects to the Landing Page

Exposes public-ish API routes consumed by the landing page:

- `GET /api/packages` -- subscription packages (CORS-enabled)
- `POST /api/tickets` -- contact form submissions (CORS-enabled)
- `GET /api/users/agents` -- list sales agents (CORS-enabled)

---

## 2. ielts-be (AI/ML Backend)

**Tech:** Python 3.11, FastAPI, Motor (async MongoDB), Poetry, dependency-injector, OpenAI, Whisper, AWS Polly, ELAI, FAISS

**Role:** Handles all AI/ML-intensive operations -- exam content generation, grading, transcription, text-to-speech, AI video, and training recommendations. Runs as a standalone service on port 8000.

### Architecture Layers

```
API Routes --> Controllers --> Services --> Repositories
                                  |
                          Third-Party Services
                     (OpenAI, Whisper, Polly, ELAI, GPTZero)
```

Wired together via `dependency-injector`.

### Key Capabilities

| Capability | Implementation |
|------------|----------------|
| **Writing Grading** | GPT-4o evaluates against IELTS rubric (Task Achievement, Coherence, Lexical Resource, Grammar). GPTZero checks for AI-generated text. Runs as background task; results stored in `evaluation` collection. |
| **Speaking Grading** | Whisper transcribes audio, then GPT grades (Fluency, Lexical, Grammar, Pronunciation). Parts 1/2/3 supported. |
| **Exam Generation** | GPT generates reading passages, listening dialogs, writing prompts, speaking tasks, and level-test exercises. |
| **Audio (TTS)** | AWS Polly synthesizes MP3 for listening sections. |
| **Video** | ELAI generates AI avatar videos for speaking prompts. |
| **Transcription** | Whisper (local model) for speech-to-text. |
| **Training** | FAISS + sentence-transformers for semantic search over tips; GPT for personalized recommendations. |
| **Short Answer Grading** | GPT-4o for reading/listening fill-in-the-blank answers. |

### Authentication

All endpoints (except `/api/healthcheck`) require a Bearer JWT token validated with `JWT_SECRET_KEY` (HS256). The `ielts-ui` sends this as `BACKEND_JWT`.

---

## 3. encoachcms (Content Management)

**Tech:** Strapi v4.21, Node.js 18, MySQL (prod) / SQLite (dev), Google Cloud Storage for uploads

**Role:** Headless CMS for managing the marketing website content. Editors create/update bilingual (EN/AR) content via the Strapi admin panel at `/admin`.

### Content Types (all Single Types)

`home`, `about`, `services`, `contact`, `footer`, `nav-bar`, `history`, `price`, `terms-and-conditions`, `privacy-policy`, `country-managers-contact`

### How it Connects

- Exposes REST API at `STRAPI_URL/api/{content-type}/?populate=deep&locale={en|ar}`
- Authenticated via API token (`STRAPI_TOKEN`)
- **Only consumed by `encoach-landing-page`** -- neither `ielts-ui` nor `ielts-be` use it

### Plugins

- `strapi-plugin-populate-deep` -- deep relation population
- `strapi-plugin-import-export-entries` -- content import/export
- `strapi-plugin-publisher` -- scheduled publishing
- `@strapi/plugin-i18n` -- internationalization
- `@strapi/plugin-documentation` -- OpenAPI docs

---

## 4. encoach-landing-page (Marketing Website)

**Tech:** Next.js 13 (App Router), TypeScript, Tailwind CSS + DaisyUI, Stripe

**Role:** Public marketing website at `encoach.com`. Bilingual (EN at `/`, AR at `/ar/`). Fetches content from the CMS and links users into the main platform.

### Pages

`/` (Home), `/about`, `/services`, `/price`, `/history`, `/contact`, `/terms`, `/privacy-policy`, `/contacts/[country]`, `/success` -- all mirrored under `/ar/` for Arabic.

### How it Connects

| Target | Connection |
|--------|------------|
| **encoachcms** | `getData()` fetches `STRAPI_URL/api/{page}/?populate=deep&locale={locale}` with Bearer token |
| **ielts-ui** | `GET /api/packages` for pricing, `POST /api/tickets` for contact form, `GET /api/users/agents` for sales agents |
| **Stripe** | Checkout flow; `/api/success` route validates session and POSTs to `WEBHOOK_URL` |
| **Platform links** | Buttons link to `platform.encoach.com/register`, `platform.encoach.com/official-exam` |

---

## Data Flow Diagrams

### Authentication Flow

```mermaid
sequenceDiagram
    participant Browser
    participant UI as ielts-ui
    participant Firebase as Firebase Auth
    participant Mongo as MongoDB

    Browser->>UI: POST /api/login (email, password)
    UI->>Firebase: signInWithEmailAndPassword
    Firebase-->>UI: Firebase UID + token
    UI->>Mongo: Find user by Firebase UID
    Mongo-->>UI: User document
    UI->>UI: Save to iron-session cookie
    UI-->>Browser: Set-Cookie (eCrop/ielts)
    Browser->>UI: Subsequent requests with cookie
    UI->>UI: withIronSessionSsr validates cookie
```

### Exam Grading Flow (Writing)

```mermaid
sequenceDiagram
    participant Student
    participant UI as ielts-ui API Route
    participant BE as ielts-be
    participant GPT as OpenAI GPT-4o
    participant GPTZero as GPTZero
    participant Mongo as MongoDB

    Student->>UI: Submit writing answer
    UI->>BE: POST /api/exam/grade/writing/{task}
    BE->>BE: Start background task
    BE-->>UI: 200 OK (accepted)
    UI-->>Student: "Grading in progress"

    par Parallel Grading
        BE->>GPT: Evaluate against IELTS rubric
        GPT-->>BE: Scores + feedback
    and AI Detection
        BE->>GPTZero: Check for AI content
        GPTZero-->>BE: AI probability
    end

    BE->>Mongo: Save evaluation result
    Student->>UI: Poll for result
    UI->>Mongo: Query evaluation
    Mongo-->>UI: Grading result
    UI-->>Student: Display scores + feedback
```

### Landing Page Content Flow

```mermaid
sequenceDiagram
    participant Visitor
    participant LP as encoach-landing-page
    participant CMS as encoachcms (Strapi)
    participant Platform as ielts-ui

    Visitor->>LP: Visit encoach.com
    LP->>CMS: GET /api/home/?populate=deep&locale=en
    CMS-->>LP: Home content (JSON)
    LP-->>Visitor: Rendered page

    Visitor->>LP: View pricing
    LP->>CMS: GET /api/price/?populate=deep&locale=en
    LP->>Platform: GET /api/packages
    Platform-->>LP: Package list
    LP-->>Visitor: Pricing page with packages

    Visitor->>LP: Submit contact form
    LP->>Platform: POST /api/tickets
    Platform-->>LP: Ticket created
```

---

## Shared Infrastructure

| Resource | Used By | Details |
|----------|---------|---------|
| **MongoDB** | ielts-ui, ielts-be | Same database (`MONGODB_URI` / `MONGODB_DB`). UI reads users, groups, stats directly. BE reads/writes evaluations, training. |
| **Firebase Auth** | ielts-ui, ielts-be | Shared Firebase project. UI handles login/signup; BE imports users. |
| **Firebase Storage** | ielts-be | Stores exam media (audio, images). |
| **Google Cloud Storage** | encoachcms | CMS file uploads (images, media). |

---

## Deployment Topology

| Service | Port | URL (Production) |
|---------|------|-------------------|
| ielts-ui | 3000 | `platform.encoach.com` |
| ielts-be | 8000 | Internal (proxied by ielts-ui) |
| encoachcms | 1337 | Internal (consumed by landing page) |
| encoach-landing-page | 3000 | `encoach.com` |

Both Next.js apps use `output: "standalone"` and have Dockerfiles. The BE is not directly exposed to the internet -- it sits behind ielts-ui's API route proxy layer.

---

## User Roles

| Role | Access |
|------|--------|
| **student** | Take exams, view stats, training, assignments |
| **teacher** | Manage classrooms, assignments, view student performance |
| **admin** | Full platform management, user management, entities |
| **corporate** | Corporate dashboard, bulk operations |
| **mastercorporate** | Multi-entity corporate management |
| **developer** | Developer dashboard, system tools |
| **agent** | Sales agent, visible on landing page |

---

## Key Environment Variables (Cross-Service)

| Variable | Service | Purpose |
|----------|---------|---------|
| `MONGODB_URI` / `MONGODB_DB` | ielts-ui, ielts-be | Shared MongoDB |
| `BACKEND_URL` | ielts-ui | URL of ielts-be |
| `BACKEND_JWT` / `JWT_SECRET_KEY` | ielts-ui / ielts-be | Shared JWT secret for service-to-service auth |
| `FIREBASE_*` | ielts-ui, ielts-be | Shared Firebase project credentials |
| `STRAPI_URL` / `STRAPI_TOKEN` | encoach-landing-page | CMS connection |
| `STRIPE_KEY` / `STRIPE_SECRET` | ielts-ui, encoach-landing-page | Payment processing |
| `OPENAI_API_KEY` | ielts-be | AI grading and generation |
| `AWS_ACCESS_KEY_ID/SECRET` | ielts-be | AWS Polly TTS |
