# Database Setup Guide

This guide will help new team members set up and understand the database system used in this project.

## Quick Setup (New Team Members)

After cloning the repository, follow these steps to get your database ready:

### 1. Install Dependencies
```bash
# Install all dependencies including Alembic
make install-all
```

### 2. Start PostgreSQL Database
```bash
# Start the development database with Docker
make docker-up

# Or manually:
docker-compose up -d db
```

### 3. Set Up Environment
```bash
# Copy the example environment file
cp .env.example .env

# Edit .env with your database configuration
# The default works with docker-compose:
DATABASE_URL=postgresql://orion_user:secure_password@localhost:5432/orion_db
```

!!! note "PostgreSQL Required"
    This project requires PostgreSQL. SQLite is not supported.
    Docker Compose provides the easiest way to run PostgreSQL locally.

### 3. Run Database Migrations
```bash
# Apply all migrations to create the database schema
make migrate-up
```

### 4. Seed Test Data (Optional)
```bash
# Create test stores, products, and inventory
python scripts/create_test_data.py

# Create inventory entries for existing products
python scripts/create_inventory.py

# Create landing pages for stores
python scripts/create_landing_page.py
```

### 5. Verify Setup
```bash
# Check that everything is working
make verify-setup
```

### 6. Start Development
```bash
# Start the development server
make dev
```

## Understanding Our Database System

### What is Alembic?
Alembic is a database migration tool that helps us:
- **Version control our database schema** - Every database change is tracked
- **Share schema changes with the team** - When you pull code, you get database updates too
- **Deploy safely** - Production deployments include database updates
- **Roll back if needed** - We can undo problematic database changes

### Key Concepts

**Migrations**: Files that describe how to change the database schema
- Located in `alembic/versions/`
- Each migration has a unique ID and timestamp
- Migrations run in order to build up the complete schema

**Migration Status**: Alembic tracks which migrations have been applied
- `alembic current` - Shows the current migration
- `alembic history` - Shows all available migrations

## Daily Workflow

### When You Pull Code
```bash
# After pulling changes from git, check for new migrations
make migrate-status

# If there are pending migrations, apply them
make migrate-up
```

### When Working with Models
```bash
# After modifying SQLAlchemy models, create a migration
make migrate-create message="add_user_profile_table"

# Review the generated migration file in alembic/versions/
# Then apply it
make migrate-up
```

## Common Scenarios

### First Time Setup
```bash
make setup  # This handles everything automatically
```

### Database is Out of Sync
```bash
# Check current status
make migrate-status

# Apply any missing migrations
make migrate-up
```

### Something Went Wrong
```bash
# Create a backup first
make backup-db

# Check what migrations are available
make migrate-status

# If you need to rollback the last migration
make migrate-down
```

### Starting Fresh (Development Only)
```bash
# Backup first (just in case)
make backup-db

# Delete database and recreate from scratch
del orion.db  # or drop PostgreSQL database
make migrate-up
```

## Environment-Specific Setup

### Development (Docker - Recommended)
```env
DATABASE_URL=postgresql://orion_user:secure_password@localhost:5432/orion_db
```
- Start with `make docker-up`
- Consistent environment matching production
- Easy to reset with `make db-reset`

### Development (Local PostgreSQL)
```env
DATABASE_URL=postgresql://user:password@localhost:5432/orion_dev
```
- Use if you prefer a local PostgreSQL installation
- Ensure PostgreSQL 15+ is installed

### Production
```env
DATABASE_URL=postgresql://user:password@production-host:5432/orion_prod
```
- PostgreSQL is required for production
- Migrations are applied automatically during deployment

## Troubleshooting

### "No module named 'models'"
```bash
# Make sure you're in the project root and have activated the virtual environment
cd /path/to/project
source venv/bin/activate  # or venv\Scripts\activate on Windows
```

### "Database connection failed"
```bash
# Check your DATABASE_URL in .env
# For SQLite, make sure the directory exists and is writable
# For PostgreSQL, ensure the server is running and credentials are correct
```

### "Migration conflicts"
```bash
# Check migration status
make migrate-status

# If there are conflicts, contact the team lead
# We may need to merge or reorder migrations
```

### Need Help?
- Check `make help-db` for database commands
- Use `make verify-setup` to diagnose issues
- Ask in the team chat if you're stuck

## Best Practices

1. **Always run migrations after pulling code**
2. **Never edit migration files after they're committed**
3. **Test your migrations on a copy of production data**
4. **Include meaningful messages when creating migrations**
5. **Review generated migrations before applying them**

## Data Seeding for Development

### Overview

After setting up your database schema with migrations, you'll need test data to develop and test features. We provide several scripts to populate your database with sample data.

### Available Seeding Scripts

#### 1. Create Test Data
**Script:** `scripts/create_test_data.py`

Creates complete test data including stores, marketplace products, store products, themes, and content pages.

```bash
python scripts/create_test_data.py
```

**What it creates:**
- 3 test stores (Orion, Fashion Hub, The Book Store)
- 20 marketplace products per store
- Store-specific products with pricing
- Store themes with custom colors
- Sample CMS content pages (About, Contact, FAQ, etc.)

#### 2. Create Inventory Entries
**Script:** `scripts/create_inventory.py`

Creates inventory entries for products that don't have inventory. This is **required** for the shop to function properly, as products with 0 inventory cannot be added to cart.

```bash
python scripts/create_inventory.py
```

**What it does:**
- Finds all products without inventory entries
- Creates inventory record for each product
- Sets 100 units available in "Main Warehouse"
- Can be run multiple times (only creates missing entries)

**Why it's needed:**
- Product `available_inventory` is calculated from inventory entries
- Empty inventory table = 0 inventory for all products
- Add to cart functionality requires `available_inventory > 0`

#### 3. Create Landing Pages
**Script:** `scripts/create_landing_page.py`

Creates or updates landing pages for stores with different templates.

```bash
# Interactive mode
python scripts/create_landing_page.py

# Or programmatically in Python
from scripts.create_landing_page import create_landing_page
create_landing_page('orion', template='modern')
```

**Available templates:**
- `default` - Clean professional layout with 3-column quick links
- `minimal` - Ultra-simple centered design with single CTA
- `modern` - Full-screen hero with animations and features
- `full` - Maximum features with split-screen hero and stats

### Complete Setup Workflow

For a fresh development environment with test data:

```bash
# 1. Setup database schema
make migrate-up

# 2. Create test stores and products
python scripts/create_test_data.py

# 3. Create inventory (REQUIRED for shop to work)
python scripts/create_inventory.py

# 4. Create landing pages
python scripts/create_landing_page.py
# Follow interactive prompts to create landing pages

# 5. Start the server
make dev

# 6. Test the shop
# Visit: http://localhost:8000/storefront/orion
```

### Common Issues

**Problem: Products can't be added to cart**
```bash
# Solution: Create inventory entries
python scripts/create_inventory.py
```

**Problem: Landing page shows 404**
```bash
# Solution: Create landing page for the store
python scripts/create_landing_page.py
# OR the store will auto-redirect to /storefront/
```

**Problem: No products showing in shop**
```bash
# Solution: Create test data
python scripts/create_test_data.py
```

### Database Reset (Development Only)

To start completely fresh:

```bash
# Complete reset (drops all data and recreates)
make db-reset

# Or step by step:
# 1. Rollback all migrations
make migrate-down  # Run multiple times or use: alembic downgrade base

# 2. Recreate schema
make migrate-up

# 3. Seed data
make init-prod
make seed-demo
```

## Next Steps

- [Landing Pages Guide](../features/store-landing-pages.md) - Customize landing pages
- [Database Migrations Guide](../development/migration/database-migrations.md) - Advanced migration workflows
- [API Documentation](../api/index.md) - Start building features
