# DATABASE SCHEMA DOCUMENTATION

> Documentația structurii bazelor de date pentru INDEX-SISTEM-JOCURI
> 
> **IMPORTANT**: Fișierele `*.db` sunt excluse din git prin `.gitignore`. Această documentație permite recrearea structurii bazelor de date.

## Prezentare Generală

Sistemul folosește SQLite pentru stocarea datelor, cu următoarele baze de date:

- **`activities.db`** - Baza de date principală pentru activități educaționale
- **`game_library.db`** - Baza de date pentru biblioteca de jocuri (sistem legacy)
- **`test_activities.db`** - Baza de date pentru teste

## 1. ACTIVITIES.DB (Baza de Date Principală)

### Tabel: `activities`

Tabelul principal pentru stocarea activităților educaționale (conform PRD Section 5.3).

```sql
CREATE TABLE IF NOT EXISTS activities (
    id INTEGER PRIMARY KEY,
    title TEXT NOT NULL,
    description TEXT,
    file_path TEXT NOT NULL,
    file_type TEXT,
    page_number INTEGER,
    tags TEXT,
    category TEXT,
    age_group TEXT,
    participants TEXT,
    duration TEXT,
    materials TEXT,
    difficulty TEXT DEFAULT 'mediu',
    source_text TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

**Descrierea coloanelor:**

| Coloană | Tip | Descriere |
|---------|-----|-----------|
| `id` | INTEGER | Cheia primară, auto-increment |
| `title` | TEXT | Titlul activității (obligatoriu) |
| `description` | TEXT | Descrierea activității |
| `file_path` | TEXT | Calea către fișierul sursă (obligatoriu) |
| `file_type` | TEXT | Tipul fișierului (PDF, DOCX, etc.) |
| `page_number` | INTEGER | Numărul paginii în fișierul sursă |
| `tags` | TEXT | Tag-uri în format JSON |
| `category` | TEXT | Categoria activității |
| `age_group` | TEXT | Grupa de vârstă (ex: "8-12 ani") |
| `participants` | TEXT | Numărul de participanți (ex: "5-10 persoane") |
| `duration` | TEXT | Durata activității (ex: "15-30min") |
| `materials` | TEXT | Materialele necesare |
| `difficulty` | TEXT | Dificultatea (implicit: "mediu") |
| `source_text` | TEXT | Textul complet extras din fișier |
| `created_at` | TIMESTAMP | Data creării (implicit: now) |

### Tabel Virtual: `activities_fts`

Tabel pentru căutare full-text (FTS5) pentru performanță optimă.

```sql
CREATE VIRTUAL TABLE IF NOT EXISTS activities_fts USING fts5(
    title, description, source_text,
    content='activities'
);
```

### Tabel: `search_history`

Istoricul căutărilor pentru analiză și optimizare.

```sql
CREATE TABLE IF NOT EXISTS search_history (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    query TEXT NOT NULL,
    results_count INTEGER,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

### Tabel: `file_processing_log`

Log-ul procesării fișierelor pentru urmărirea indexării.

```sql
CREATE TABLE IF NOT EXISTS file_processing_log (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    file_path TEXT NOT NULL,
    file_type TEXT,
    status TEXT,
    activities_extracted INTEGER DEFAULT 0,
    error_message TEXT,
    processed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

**Status-uri posibile:**
- `processing` - în procesare
- `completed` - finalizat cu succes
- `error` - eroare în procesare
- `skipped` - omis (ex: fișier deja procesat)

## 2. GAME_LIBRARY.DB (Sistem Legacy)

### Tabel: `activities`

Varianta legacy a tabelului de activități.

```sql
CREATE TABLE IF NOT EXISTS activities (
    id TEXT PRIMARY KEY,
    title TEXT NOT NULL,
    file_path TEXT NOT NULL,
    category TEXT NOT NULL,
    subcategory TEXT,
    age_group TEXT,
    participants TEXT,
    duration TEXT,
    materials TEXT,
    description TEXT,
    tags TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

**Diferențe față de tabelul principal:**
- `id` este TEXT (nu INTEGER)
- Lipsesc câmpurile: `file_type`, `page_number`, `difficulty`, `source_text`
- `subcategory` este prezentă doar aici

### Tabel: `search_history`

```sql
CREATE TABLE IF NOT EXISTS search_history (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    query TEXT NOT NULL,
    results_count INTEGER,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

## 3. RECREAREA BAZELOR DE DATE

### Metoda 1: Folosind DatabaseManager (Recomandat)

```python
from src.database import DatabaseManager

# Crearea bazei de date principale
db = DatabaseManager("data/activities.db")
print("✅ Baza de date activities.db creată")

# Crearea bazei de date de test
test_db = DatabaseManager("data/test_activities.db")
print("✅ Baza de date test_activities.db creată")
```

### Metoda 2: Folosind game_library_manager

```python
from src.game_library_manager import GameLibraryManager

# Crearea bazei legacy
manager = GameLibraryManager("data/game_library.db")
print("✅ Baza de date game_library.db creată")
```

### Metoda 3: SQL Direct

```bash
# Crearea manuală cu sqlite3
sqlite3 data/activities.db < scripts/create_activities_db.sql
```

## 4. POPULAREA CU DATE

### Indexarea Automată

```bash
# Rulează din directorul src/
cd src/
python indexer.py --clear-db
```

**Parametri disponibili:**
- `--clear-db` - șterge și recreează baza de date
- `--base-path` - calea către fișierele de indexat
- `--db-path` - calea către baza de date

### Testarea Funcționalității

```bash
# Testează baza de date
cd src/
python -c "from database import test_database; test_database()"
```

## 5. EXEMPLE DE DATE

### Exemplu Activitate

```json
{
    "id": 1,
    "title": "Jocul Celor 5 Simțuri",
    "description": "Activitate pentru dezvoltarea percepției senzoriale",
    "file_path": "/path/to/file.pdf",
    "file_type": "PDF",
    "page_number": 23,
    "tags": "[\"senzorial\", \"educativ\", \"interior\"]",
    "category": "educativ",
    "age_group": "8-12 ani",
    "participants": "5-10 persoane",
    "duration": "15-30min",
    "materials": "Materiale simple",
    "difficulty": "mediu",
    "source_text": "Textul complet din PDF...",
    "created_at": "2025-09-09 12:00:00"
}
```

## 6. ÎNTREȚINERE

### Backup-ul Bazelor de Date

```bash
# Backup
cp data/activities.db backups/activities_$(date +%Y%m%d_%H%M%S).db

# Restaurare
cp backups/activities_20250909_120000.db data/activities.db
```

### Verificarea Integrității

```sql
-- Verifică integritatea bazei de date
PRAGMA integrity_check;

-- Statistici
SELECT 
    COUNT(*) as total_activities,
    COUNT(DISTINCT category) as categories,
    COUNT(DISTINCT age_group) as age_groups
FROM activities;
```

### Rebuilding FTS Index

```sql
-- Recreează indexul FTS în caz de probleme
INSERT INTO activities_fts(activities_fts) VALUES('rebuild');
```

## 7. PERFORMANȚĂ

### Indexuri Recomandate

```sql
-- Indexuri pentru performanță
CREATE INDEX IF NOT EXISTS idx_activities_category ON activities(category);
CREATE INDEX IF NOT EXISTS idx_activities_age_group ON activities(age_group);
CREATE INDEX IF NOT EXISTS idx_activities_duration ON activities(duration);
CREATE INDEX IF NOT EXISTS idx_activities_file_path ON activities(file_path);
CREATE INDEX IF NOT EXISTS idx_search_history_timestamp ON search_history(timestamp);
```

### Optimizări

```sql
-- Analizează și optimizează
ANALYZE;
VACUUM;
```

## 8. TROUBLESHOOTING

### Probleme Comune

1. **"Database is locked"**
   ```bash
   # Verifică procesele care folosesc DB
   lsof data/activities.db
   ```

2. **"No such table"**
   ```python
   # Recreează schema
   from src.database import DatabaseManager
   db = DatabaseManager("data/activities.db")
   ```

3. **FTS nu funcționează**
   ```sql
   -- Verifică dacă FTS5 este disponibil
   SELECT sqlite_version(), sqlite_compileoption_used('ENABLE_FTS5');
   ```

### Log-uri

- Logurile aplicației: vezi console output
- Loguri indexer: vezi tabelul `file_processing_log`
- Loguri căutări: vezi tabelul `search_history`