# User System Plan

## 1. Database Schema (`User` model)

- **Identity & Security**
    - `username` (unique, required)
    - `pgp` (unique, required)
    - `is_verified` (boolean)

- **Contacts**
    - `xmpp` (unique, required)
    - `email` (unique, optional)
    - `phone` (unique, optional)

- **Personal Info**
    - `firstname` (required)
    - `lastname` (required)
    - `sex` (`male` / `female`, required)
    - `date_of_birth` (required)
    - `race` (optional)

- **Profile & Media**
    - `profile_picture` (required)
    - `pictures` (optional array)

- **Location**
    - `country` (required)
    - `city` (optional)

- **Physical Attributes**
    - `height` (optional float)
    - `weight` (optional int)

- **Preferences**
    - `prefered_age_range` (optional)
    - `likes` (optional array)
    - `dislikes` (optional array)

---

## 2. Registration

1. **User fills form**
     - All fields except `id`, `is_verified`.

2. **Server receives data**
     - Validate required fields and unique constraints.
     - Temporarily store as **unverified**.

3. **PGP Verification**
     - Server encrypts a message with user's PGP public key.
     - Show **validation page** with encrypted message.
     - User decrypts message and submits.
     - Server validates ownership and sets `is_verified=True`.

4. **Create Profile Page & Redirect**
     - Generate user profile page with all info.
     - Redirect user to main page or search page.

---

## 3. Search Page

- **Display**: Public user profiles as cards
    - Show `profile_picture`, `firstname`, `lastname`, age, `country`, `city`.

- **Filters**:
    - All fields **except** `pgp`, `id`, `username`.
    - Include boolean checks for presence of `email`, `phone`, `xmpp`.

- **Profile Click**
    - Open full profile page with all info, pictures, likes/dislikes.

---

## 4. Login Flow

1. User enters `username` + `PGP key`.
2. Server verifies PGP via challenge.
3. On success:
    - User can edit **all fields** execpt `id` and `username`.
    - User can change pgp key, new pgp key must be verified.

---

## 5. Software Stack

- **Software used**:
    - Flask (backend framework)
    - MySQL (Database)
    - SQLAlchemy (ORM)
    - python-gnupg (PGP validation)
    - Flask-WTF (Forms validation)
