<?php
namespace App\Modules\Journal\Controllers;

class JournalController extends \Core\Controller {

    private function getJournalModel() {
        return $this->model('Journal/Models/JournalModel');
    }

    public function index() {
        $userId = $this->userId ?? 1;
        $date = date('Y-m-d');

        // Fetch Today's Journal
        $journalModel = $this->getJournalModel();
        $todayJournal = $journalModel->getTodayEntry($userId, $date);

        // Fetch Todos for Tasks Module
        $todoModel = $this->model('Todo/Models/TodoModel');
        $tasks = $todoModel->getDashboardTasks($userId, $date);

        // Fetch Behaviors
        $behaviorModel = $this->model('Behavior/Models/BehaviorModel');
        $behaviors = $behaviorModel->getDailyBehaviors($userId, $date);

        // Add New Layer: History / Timeline
        $recentEntries = $journalModel->getRecentEntries($userId, 5); // last 5 days

        // Light Analytics: Mood Trend & Energy Trend
        $thirtyDaysEntries = $journalModel->getRecentEntries($userId, 30);
        
        $moodSum = 0; $energySum = 0; $count = count($thirtyDaysEntries);
        $moodTrend = 0; $energyTrend = 0;
        
        if ($count > 0) {
            foreach ($thirtyDaysEntries as $e) {
                $moodSum += $e->mood;
                $energySum += $e->energy_level;
            }
            $moodTrend = round($moodSum / $count, 1);
            $energyTrend = round($energySum / $count, 1);
        }

        $this->view('Journal/Views/dashboard', [
            'title' => 'مركز القيادة | اليومية',
            'todayJournal' => $todayJournal,
            'tasks' => $tasks,
            'behaviors' => $behaviors,
            'recentEntries' => $recentEntries,
            'moodTrend' => $moodTrend,
            'energyTrend' => $energyTrend
        ]);
    }

    // ─── COMMAND CENTER: EXECUTE COMMANDS ─────────────────────────────────
    public function executeCmd() {
        header('Content-Type: application/json; charset=utf-8');
        try {
            $input = json_decode(file_get_contents('php://input'), true);
            $userId = $this->userId ?? 1;
            
            $module = $input['module'] ?? '';
            $action = $input['action'] ?? '';
            $data   = $input['data'] ?? [];
            $date   = date('Y-m-d');

            $newId = null;
            $msg = 'تم التنفيذ';

            switch ($module) {
                case 'Todo':
                    $todoModel = $this->model('Todo/Models/TodoModel');
                    if ($action === 'addTask') {
                        $todoModel->addTask($userId, [
                            'title' => $data['title'],
                            'target_date' => $date,
                            'priority' => 'medium',
                            'category' => 'from_journal'
                        ]);
                        // Get the newly inserted ID
                        $db = \Core\Database::getInstance();
                        $newId = $db->lastInsertId();
                        $msg = 'تمت إضافة المهمة';
                    } elseif ($action === 'completeTask') {
                        $todoModel->updateTaskStatus($data['id'], $userId, 'done');
                        $msg = 'أنجزت المهمة!';
                    }
                    break;
                
                case 'Behavior':
                    $behaviorModel = $this->model('Behavior/Models/BehaviorModel');
                    if ($action === 'toggleLog') {
                        $behaviorModel->toggleLog($data['id'], $userId, $date, $data['status']);
                        $msg = 'تم تسجيل السلوك';
                    }
                    break;
                
                case 'Health':
                    $healthModel = $this->model('Health/Models/HealthModel');
                    if ($action === 'addMeal') {
                        $healthModel->addMeal($userId, 'General', $data['description'], 0, false);
                        $msg = 'تم تسجيل الوجبة';
                    } elseif ($action === 'addActivity') {
                        $healthModel->addActivity($userId, $data['type'], $data['duration'], 'Medium');
                        $msg = 'تم تسجيل النشاط';
                    }
                    break;

                case 'Finance':
                    $financeModel = $this->model('Finance/Models/FinanceModel');
                    if ($action === 'addIncome') {
                        $financeModel->addIncome($userId, $data['source'], $data['amount'], $date);
                        $msg = 'تم تسجيل الدخل';
                    } elseif ($action === 'addExpense') {
                        $financeModel->addExpense($userId, $data['category'], 'variable', $data['amount'], $date, 'From Journal');
                        $msg = 'تم تسجيل المصروف';
                    }
                    break;

                case 'Education':
                    $eduModel = $this->model('Education/Models/EducationModel');
                    if ($action === 'addLearning') {
                        $eduModel->addCourse($userId, [
                            'title' => 'تعلم يومي: ' . $data['title'],
                            'status' => 'completed',
                            'category' => 'General Journal Learning'
                        ]);
                        $msg = 'تم تسجيل التعلم';
                    }
                    break;

                default:
                    throw new \Exception("Unknown module {$module}");
            }

            echo json_encode(['success' => true, 'message' => $msg, 'new_id' => $newId]);
            exit;

        } catch (\Exception $e) {
            echo json_encode(['success' => false, 'message' => $e->getMessage()]);
            exit;
        }
    }

    // ─── AJAX: Save Journal Entry ─────────────────────────────────────────
    public function save() {
        header('Content-Type: application/json; charset=utf-8');
        
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            http_response_code(405);
            echo json_encode(['success' => false, 'message' => 'Method Not Allowed']);
            exit;
        }

        try {
            $input = json_decode(file_get_contents('php://input'), true);
            if (!$input) {
                // Also accept form-posted data as fallback
                $input = $_POST;
            }
            if (!$input) {
                echo json_encode(['success' => false, 'message' => 'Invalid input']);
                exit;
            }

            $userId = $this->userId ?? 1;
            $journal = $this->getJournalModel();

            $data = [
                'date'         => date('Y-m-d'),
                'mood'         => max(1, min(5, (int)($input['mood'] ?? 3))),
                'energy_level' => max(1, min(5, (int)($input['energy_level'] ?? 3))),
                'achieved'     => trim($input['achieved'] ?? ''),
                'failed'       => trim($input['failed'] ?? ''),
                'notes'        => trim($input['notes'] ?? ''),
            ];

            $journalId = $journal->saveEntry($userId, $data);

            // ─── SMART DISTRIBUTION ENGINE ─────────────────────────────────
            $smartActions = [];
            $smartActions = array_merge($smartActions, $this->processTaskDetection($userId, $data));
            $smartActions = array_merge($smartActions, $this->processHealthDetection($userId, $data));
            $smartActions = array_merge($smartActions, $this->processBehaviorDetection($userId, $data));

            // ─── GENERATE SUMMARY ──────────────────────────────────────────
            $moodLabels    = ['', '😞 يوم صعب', '😕 يوم غير مريح', '😐 يوم عادي', '😊 يوم جيد', '🌟 يوم رائع'];
            $energyLabels  = ['', '🔋 طاقة منهكة', '🔋 طاقة منخفضة', '⚡ طاقة متوسطة', '⚡ طاقة جيدة', '⚡⚡ طاقة عالية'];

            $summary = [
                'mood_label'   => $moodLabels[$data['mood']] ?? '😐 يوم عادي',
                'energy_label' => $energyLabels[$data['energy_level']] ?? '⚡ طاقة متوسطة',
                'key_note'     => !empty($data['achieved']) ? mb_substr($data['achieved'], 0, 80) : (!empty($data['notes']) ? mb_substr($data['notes'], 0, 80) : 'لا يوجد إنجاز مسجل اليوم'),
                'advisor_hint' => $this->buildAdvisorHint($data),
            ];

            echo json_encode([
                'success'      => true,
                'journal_id'   => $journalId,
                'smart_actions'=> $smartActions,
                'summary'      => $summary,
                'message'      => 'تم حفظ اليومية بنجاح ✓'
            ], JSON_UNESCAPED_UNICODE);
            exit;

        } catch (\Exception $e) {
            error_log('JournalController::save error: ' . $e->getMessage());
            echo json_encode([
                'success' => false,
                'message' => 'خطأ في الحفظ: ' . $e->getMessage()
            ], JSON_UNESCAPED_UNICODE);
            exit;
        }
    }

    // ─── AJAX: Get Today's Entry ──────────────────────────────────────────
    public function today() {
        $journal = $this->getJournalModel();
        $entry   = $journal->getTodayEntry($this->userId);
        echo json_encode(['success' => true, 'entry' => $entry]);
        exit;
    }

    // ───────────────────────────────────────────────────────────────────────
    // SMART ENGINE — Task Detection
    // ───────────────────────────────────────────────────────────────────────
    private function processTaskDetection($userId, $data) {
        $actions  = [];
        $combined = ($data['achieved'] ?? '') . ' ' . ($data['notes'] ?? '');

        // Actionable patterns (Arabic)
        $actionPatterns = [
            '/يجب|لازم|ضروري|يستلزم|سأفعل|سأقوم|سأكمل|ناوي|خطط|أخطط|أريد أن أفعل/u',
            '/ذكرني|تذكر أن|لا تنسى|افعل|اعمل|أكمل|أرجع|راجع/u',
            '/مهمة|واجب|التزام|اجتماع|موعد|تسليم/u',
        ];

        $isActionable = false;
        foreach ($actionPatterns as $pattern) {
            if (preg_match($pattern, $combined)) {
                $isActionable = true;
                break;
            }
        }

        if ($isActionable && !empty(trim($combined))) {
            // Extract a task title (first sentence of achieved or notes)
            $taskText = !empty(trim($data['notes'])) ? $data['notes'] : $data['achieved'];
            $taskTitle = mb_substr(trim($taskText), 0, 100);

            // Create task via TodoModel
            try {
                $todo = $this->model('Todo/Models/TodoModel');
                $todo->addTask($userId, [
                    'title'       => $taskTitle,
                    'priority'    => 'medium',
                    'target_date' => date('Y-m-d'),
                    'category'    => 'من اليومية',
                ]);
                $actions[] = ['type' => 'task', 'message' => 'تم إنشاء مهمة تلقائياً من ملاحظاتك'];
            } catch (\Exception $e) {
                // Silently fail — task creation is optional
            }
        }

        return $actions;
    }

    // ───────────────────────────────────────────────────────────────────────
    // SMART ENGINE — Health Detection
    // ───────────────────────────────────────────────────────────────────────
    private function processHealthDetection($userId, $data) {
        $actions  = [];
        $combined = strtolower(($data['achieved'] ?? '') . ' ' . ($data['failed'] ?? '') . ' ' . ($data['notes'] ?? ''));

        $healthKeywords = ['أكلت', 'طعام', 'وجبة', 'جائع', 'متعب', 'تعب', 'إرهاق', 'نوم', 'نمت', 'صداع', 'مريض', 'وجع', 'آلام', 'صيام', 'أكل'];
        $found = false;
        foreach ($healthKeywords as $kw) {
            if (mb_strpos($combined, $kw) !== false) {
                $found = true;
                break;
            }
        }

        // Also flag if very low energy
        if ($data['energy_level'] <= 2) {
            $found = true;
        }

        if ($found) {
            // Log a health note in notifications table if exists
            try {
                $db = \Core\Database::getInstance();
                $noteText = 'ملاحظة صحية من اليومية: طاقة=' . $data['energy_level'] . '/5';
                if (!empty($data['notes'])) {
                    $noteText .= ' | ' . mb_substr($data['notes'], 0, 100);
                }
                $db->query(
                    "INSERT INTO notifications (user_id, title, message, type, created_at) VALUES (?, ?, ?, 'info', NOW())",
                    [$userId, 'ملاحظة صحية', $noteText]
                );
            } catch (\Exception $e) { /* Silently fail */ }

            $actions[] = ['type' => 'health', 'message' => 'تم تسجيل ملاحظة صحية تلقائياً'];
        }

        return $actions;
    }

    // ───────────────────────────────────────────────────────────────────────
    // SMART ENGINE — Behavior Detection
    // ───────────────────────────────────────────────────────────────────────
    private function processBehaviorDetection($userId, $data) {
        $actions  = [];
        $combined = strtolower(($data['failed'] ?? '') . ' ' . ($data['notes'] ?? ''));

        $negBehaviorKeywords = [
            'سهرت', 'تأخرت', 'فشلت', 'أضعت وقت', 'استسلمت', 'وقعت في',
            'ضعفت', 'انتكاست', 'راجعت', 'رجعت', 'انتكس', 'وقعت',
            'مشكلة', 'خطأ', 'غلط', 'سيئ', 'أسوأ'
        ];

        $found = false;
        foreach ($negBehaviorKeywords as $kw) {
            if (mb_strpos($combined, $kw) !== false) {
                $found = true;
                break;
            }
        }

        // Also flag very low mood
        if ($data['mood'] <= 2) {
            $found = true;
        }

        if ($found && !empty(trim($data['failed'] ?? ''))) {
            try {
                $db = \Core\Database::getInstance();
                $hint = 'تنبيه سلوكي من اليومية: ' . mb_substr($data['failed'], 0, 120);
                $db->query(
                    "INSERT INTO notifications (user_id, title, message, type, created_at) VALUES (?, ?, ?, 'warning', NOW())",
                    [$userId, 'تنبيه سلوكي من اليومية', $hint]
                );
            } catch (\Exception $e) { /* Silently fail */ }

            $actions[] = ['type' => 'behavior', 'message' => 'تم تسجيل ملاحظة سلوكية تلقائياً'];
        }

        return $actions;
    }

    // ───────────────────────────────────────────────────────────────────────
    // Advisor Hint Generator
    // ───────────────────────────────────────────────────────────────────────
    private function buildAdvisorHint($data) {
        $mood   = $data['mood'];
        $energy = $data['energy_level'];

        if ($mood <= 2 && $energy <= 2) {
            return '💡 المستشار: يومك كان صعباً. خصص وقتاً للراحة الآن وابدأ غداً بصفحة جديدة.';
        } elseif ($mood <= 2) {
            return '💡 المستشار: مزاجك منخفض اليوم، حاول التواصل مع شخص تثق به أو اخرج لتغيير الجو.';
        } elseif ($energy <= 2) {
            return '💡 المستشار: طاقتك منخفضة. يُنصح بالراحة المبكرة وتجنب الأعباء الإضافية.';
        } elseif ($mood >= 4 && $energy >= 4) {
            return '💡 المستشار: طاقة ومزاج رائعان! استغل هذه الذروة لإنجاز أهم مهمة لديك.';
        } else {
            return '💡 المستشار: يوم متوازن، استمر في التقدم خطوة بخطوة.';
        }
    }

    // ─── Timeline View ──────────────────────────────────────────
    public function timeline() {
        $userId = $this->userId ?? 1;
        $journalModel = $this->getJournalModel();
        
        // Fetch last 30 days of entries
        $entries = $journalModel->getRecentEntries($userId, 30);
        
        $this->view('Journal/Views/timeline', [
            'title' => 'أرشيف اليوميات | العرض الزمني',
            'entries' => $entries
        ]);
    }
}
