# Modul 4: AI Reviewer Simulation

## 1. Arsitektur Modul AI
Modul ini didesain agar tidak memblokir antarmuka pengguna (non-blocking). Karena permintaan ke LLM (Large Language Model) seperti Gemini memakan waktu, prosesnya akan dipisahkan menjadi Background Job yang dijalankan via cron job server:
- **Author/Admin** menekan tombol "Start AI Review".
- Sistem mencatat permintaan ke tabel `ai_review_jobs` dengan status `pending`.
- Pengguna dapat langsung meninggalkan halaman (proses berjalan di belakang).
- **Cron Job cPanel** (berjalan setiap 5 atau 10 menit) mengeksekusi script PHP yang akan mengambil job dengan status `pending`.
- Script tersebut akan membaca isi artikel (PDF di-parse atau ekstraksi teks), mengirim *prompt* ke API eksternal (Google Gemini) via cURL.
- Hasil dari API akan disimpan ke `ai_review_results` dalam format terstruktur, dan status job berubah menjadi `completed` atau `failed`.

## 2. SQL CREATE TABLE
Tabel untuk menyimpan antrean job dan hasil analisis AI disimpan di `database/modul4_ai_review.sql`.

## 3. AI Job Flow
1. User masuk ke detail submission, klik "Request AI Pre-Review".
2. Controller mengecek apakah belum ada job pending/completed untuk submission tersebut, lalu memasukkan 1 row ke tabel job.
3. User melihat tulisan: `Status: Processing (Check back in a few minutes)`.

## 4. Cron Job Flow
- Perintah di cPanel: `*/5 * * * * /usr/local/bin/php /home/user/public_html/cron/process_ai_reviews.php >/dev/null 2>&1`
- File `cron/process_ai_reviews.php` me-load konfigurasi, koneksi ke DB, mencari 1 atau 2 row status `pending`.
- Eksekusi cURL ke Gemini API, mengekstrak file (jika teks PDF belum di ekstrak, ambil metadata, abstrak saja atau jika ada package PHP pdf parser, ekstrak dan kirim).
- Menyimpan JSON response, upate status ke `completed`.
- Kalau gagal, hitung `attempts`. Jika `attempts > 3`, set status `failed`.

## 5. Service Class PHP
File `app/services/GeminiAIService.php` berisi metode statis/kelas menggunakan natif `curl_init()`. Kunci API tidak disimpan di kode sumber publik melainkan di `.env.example` atau `config/env.php`.

## 6. Prompt Internal ke AI
Prompt ditulis tegas menggunakan framework **"You are an expert academic reviewer... Analyze the following abstract and metadata... Output strictly in JSON..."**

## 7. JSON Output Schema
```json
{
  "rejection_risk_score": 80,
  "editorial_readiness_score": 60,
  "structure_score": 70,
  "methodology_score": 50,
  "novelty_score": 80,
  "citation_score": 40,
  "academic_tone_score": 65,
  "weakness_analysis": ["Methodology poorly explained", "Lack of recent citations"],
  "improvement_recommendation": ["Expand sample size", "Include more citations from 2020-2023"],
  "author_next_steps": ["Rewrite methodology section", "Perform additional data validation"]
}
```

## 8. Dashboard Hasil AI
Sebuah halaman atau bagian dalam `submissions/show.php` (atau file view terpisah misal `submissions/ai_review.php`) yang merender skor tersebut menggunakan progress bar dari TailwindCSS dan daftar rekomendasi.

## 9. Error Handling
- Menangkap error cURL (misalnya timeout, DNS issue).
- Menangani response kode HTTP selain 200 (limit exceeded, invalid token).
- Jika AI membalas tanpa mematuhi format JSON, tangkap JSON error *parse error*, lalu lempar Exception agar attempt bertambah, bukan langsung complete tapi kosong.

## 10. Cost Control
- Membatasi panjang teks yang dikirim (maksimal N karakter, misalnya hanya mengirim Abstrak dan Pendahuluan).
- Hanya memperbolehkan maksimal 1 kali request per submission kecuali di-reset admin, agar API cost tidak membengkak karena Author iseng request berkali-kali.
