<?php
declare(strict_types=1);

namespace App\Modules\Tutorials\Controllers;

use App\Core\Controller;
use App\Core\Request;
use App\Core\Response;
use App\Modules\Tutorials\TutorialRegistry;

class TutorialController extends Controller
{
    private const SA_TUTORIALS = [
        'setup-discipline' => [
            'title'    => 'إنشاء لعبة رياضية جديدة',
            'subtitle' => 'تعريف نشاط رياضي في النظام',
            'icon'     => 'activity',
            'color'    => '#8B5CF6',
            'category' => 'setup',
            'order'    => 1,
        ],
        'setup-facility' => [
            'title'    => 'إنشاء مرفق ووحداته',
            'subtitle' => 'تعريف ملعب أو حمام سباحة مع الوحدات',
            'icon'     => 'building',
            'color'    => '#3B82F6',
            'category' => 'setup',
            'order'    => 2,
        ],
        'setup-time-brackets' => [
            'title'    => 'إعداد شرائح الوقت',
            'subtitle' => 'تعريف أوقات الذروة والعادية',
            'icon'     => 'clock',
            'color'    => '#06B6D4',
            'category' => 'setup',
            'order'    => 3,
        ],
        'setup-pricing' => [
            'title'    => 'إعداد قواعد التسعير',
            'subtitle' => 'ربط المرفق × الشريحة × عدد الأفراد بالسعر',
            'icon'     => 'banknote',
            'color'    => '#059669',
            'category' => 'setup',
            'order'    => 4,
        ],
        'register-coach' => [
            'title'    => 'تسجيل مدرب جديد',
            'subtitle' => 'إضافة مدرب مع تخصصاته ونظام الدفع',
            'icon'     => 'user-check',
            'color'    => '#059669',
            'category' => 'registration',
            'order'    => 5,
        ],
        'register-player' => [
            'title'    => 'تسجيل لاعب جديد',
            'subtitle' => 'تسجيل لاعب ورفع الشهادة الطبية',
            'icon'     => 'user-plus',
            'color'    => '#F59E0B',
            'category' => 'registration',
            'order'    => 6,
        ],
        'medical-workflow' => [
            'title'    => 'دورة الموافقة الطبية',
            'subtitle' => 'من الرفع حتى الاعتماد من اللجنة الطبية',
            'icon'     => 'heart-pulse',
            'color'    => '#F97316',
            'category' => 'registration',
            'order'    => 7,
        ],
        'setup-academy' => [
            'title'    => 'إنشاء أكاديمية وعقدها',
            'subtitle' => 'تسجيل أكاديمية خارجية مع عقد PDF',
            'icon'     => 'school',
            'color'    => '#8B5CF6',
            'category' => 'academy',
            'order'    => 8,
        ],
        'create-program' => [
            'title'    => 'إنشاء برنامج تدريبي',
            'subtitle' => 'تعريف برنامج بمواصفات العمر والمستوى',
            'icon'     => 'book-open',
            'color'    => '#EC4899',
            'category' => 'academy',
            'order'    => 9,
        ],
        'create-group' => [
            'title'    => 'إنشاء مجموعة تدريبية',
            'subtitle' => 'مجموعة مع مدرب وجدول أسبوعي',
            'icon'     => 'layers',
            'color'    => '#EC4899',
            'category' => 'academy',
            'order'    => 10,
        ],
        'enroll-player' => [
            'title'    => 'تسجيل لاعب في مجموعة',
            'subtitle' => 'التحاق لاعب بمجموعة تدريبية مع طلب الدفع الإجباري',
            'icon'     => 'user-plus',
            'color'    => '#10B981',
            'category' => 'academy',
            'order'    => 11,
        ],
        'enrollment-payment' => [
            'title'    => 'الدفع الإجباري عند التسجيل',
            'subtitle' => 'لا يتم تفعيل التسجيل بدون دفع أول اشتراك من خزنة الأنشطة',
            'icon'     => 'shield-check',
            'color'    => '#059669',
            'category' => 'financial',
            'order'    => 12,
        ],
        'sports-payment-queue' => [
            'title'    => 'طابور دفع الأنشطة الرياضية',
            'subtitle' => 'عرض ومعالجة طلبات الدفع في خزنة الأنشطة الفرعية',
            'icon'     => 'list-ordered',
            'color'    => '#2563EB',
            'category' => 'financial',
            'order'    => 13,
        ],
        'generate-training-bookings' => [
            'title'    => 'توليد حجوزات التمارين',
            'subtitle' => 'إنشاء حجوزات تلقائية من جدول المجموعة',
            'icon'     => 'calendar-plus',
            'color'    => '#06B6D4',
            'category' => 'scheduling',
            'order'    => 12,
        ],
        'create-hourly-booking' => [
            'title'    => 'حجز ساعة ملعب',
            'subtitle' => 'حجز وحدة لوقت محدد (حجز بالساعة)',
            'icon'     => 'calendar-clock',
            'color'    => '#3B82F6',
            'category' => 'scheduling',
            'order'    => 13,
        ],
        'booking-shared-lane' => [
            'title'    => 'حجز حارة سباحة (مشترك)',
            'subtitle' => 'حجز أماكن في حارة مع آخرين',
            'icon'     => 'waves',
            'color'    => '#0EA5E9',
            'category' => 'scheduling',
            'order'    => 14,
        ],
        'conflict-detection' => [
            'title'    => 'كشف التعارضات',
            'subtitle' => 'كيف يمنع النظام الحجوزات المتعارضة',
            'icon'     => 'shield-alert',
            'color'    => '#DC2626',
            'category' => 'scheduling',
            'order'    => 15,
        ],
        'generate-subscriptions' => [
            'title'    => 'توليد الاشتراكات الشهرية',
            'subtitle' => 'إنشاء فواتير شهرية للاعبين المسجلين',
            'icon'     => 'receipt',
            'color'    => '#059669',
            'category' => 'financial',
            'order'    => 16,
        ],
        'collect-payment' => [
            'title'    => 'تحصيل اشتراك',
            'subtitle' => 'تسجيل دفع اشتراك لاعب',
            'icon'     => 'credit-card',
            'color'    => '#10B981',
            'category' => 'financial',
            'order'    => 17,
        ],
        'exempt-subscription' => [
            'title'    => 'إعفاء من اشتراك',
            'subtitle' => 'إعفاء لاعب من رسوم شهرية',
            'icon'     => 'badge-percent',
            'color'    => '#F59E0B',
            'category' => 'financial',
            'order'    => 18,
        ],
        'record-attendance' => [
            'title'    => 'تسجيل الحضور',
            'subtitle' => 'تسجيل حضور لاعبين في تمرين',
            'icon'     => 'clipboard-check',
            'color'    => '#059669',
            'category' => 'operations',
            'order'    => 19,
        ],
        'mirror-view' => [
            'title'    => 'شاشة المراية (المرافق)',
            'subtitle' => 'عرض حالة المرافق والحجوزات لحظياً',
            'icon'     => 'monitor',
            'color'    => '#6366F1',
            'category' => 'operations',
            'order'    => 20,
        ],
        'waitlist-management' => [
            'title'    => 'إدارة قائمة الانتظار',
            'subtitle' => 'إضافة لاعب لقائمة انتظار مجموعة ممتلئة',
            'icon'     => 'list-ordered',
            'color'    => '#F97316',
            'category' => 'operations',
            'order'    => 21,
        ],
        'blackout-dates' => [
            'title'    => 'حجب مواعيد (صيانة)',
            'subtitle' => 'إغلاق مرفق لفترة صيانة أو إجازة',
            'icon'     => 'calendar-x',
            'color'    => '#DC2626',
            'category' => 'operations',
            'order'    => 22,
        ],
        'full-swimming-workflow' => [
            'title'    => 'سيناريو كامل: حمام سباحة',
            'subtitle' => 'من الإعداد حتى التشغيل اليومي',
            'icon'     => 'waves',
            'color'    => '#0EA5E9',
            'category' => 'scenarios',
            'order'    => 23,
        ],
        'full-football-workflow' => [
            'title'    => 'سيناريو كامل: كرة قدم',
            'subtitle' => 'أكاديمية كرة قدم من الصفر للتشغيل',
            'icon'     => 'circle-dot',
            'color'    => '#10B981',
            'category' => 'scenarios',
            'order'    => 24,
        ],
        'full-tennis-workflow' => [
            'title'    => 'سيناريو كامل: تنس',
            'subtitle' => 'ملاعب تنس بحجز بالساعة وتمارين',
            'icon'     => 'target',
            'color'    => '#F59E0B',
            'category' => 'scenarios',
            'order'    => 25,
        ],
    ];

    private const CATEGORIES = [
        'setup'        => ['label' => 'الإعداد الأساسي',    'icon' => 'settings',       'color' => '#8B5CF6'],
        'registration' => ['label' => 'التسجيل',            'icon' => 'user-plus',      'color' => '#F59E0B'],
        'academy'      => ['label' => 'الأكاديميات والبرامج', 'icon' => 'school',        'color' => '#EC4899'],
        'scheduling'   => ['label' => 'الجدولة والحجوزات',   'icon' => 'calendar',       'color' => '#3B82F6'],
        'financial'    => ['label' => 'المالي والاشتراكات',  'icon' => 'banknote',       'color' => '#059669'],
        'operations'   => ['label' => 'التشغيل اليومي',     'icon' => 'monitor',        'color' => '#06B6D4'],
        'scenarios'    => ['label' => 'سيناريوهات كاملة',   'icon' => 'play-circle',    'color' => '#6366F1'],
    ];

    private const TREASURY_TUTORIALS = [
        'open-session' => ['title' => 'فتح وردية', 'subtitle' => 'بدء وردية جديدة في الخزنة الفرعية', 'icon' => 'play', 'color' => '#059669', 'category' => 'operations', 'order' => 1],
        'collect-payment' => ['title' => 'تحصيل دفعة', 'subtitle' => 'تحصيل اشتراك نشاط رياضي من الطابور', 'icon' => 'credit-card', 'color' => '#3B82F6', 'category' => 'operations', 'order' => 2],
        'close-session' => ['title' => 'إغلاق وردية', 'subtitle' => 'إغلاق الوردية وعرض الإجمالي', 'icon' => 'square', 'color' => '#F59E0B', 'category' => 'operations', 'order' => 3],
        'initiate-settlement' => ['title' => 'تسوية مع الرئيسية', 'subtitle' => 'تحويل كامل المحصل للخزنة الرئيسية', 'icon' => 'arrow-up-right', 'color' => '#8B5CF6', 'category' => 'settlement', 'order' => 4],
        'receive-settlement' => ['title' => 'استلام تسوية', 'subtitle' => 'تأكيد استلام التسوية في الخزنة الرئيسية', 'icon' => 'arrow-down-left', 'color' => '#EC4899', 'category' => 'settlement', 'order' => 5],
        'bank-deposit' => ['title' => 'إيداع في البنك', 'subtitle' => 'إيداع النقدية ورفع إيصال البنك', 'icon' => 'building-2', 'color' => '#06B6D4', 'category' => 'deposit', 'order' => 6],
        'confirm-deposit' => ['title' => 'تأكيد الإيداع', 'subtitle' => 'تأكيد مدير الحسابات وإخلاء العهدة', 'icon' => 'check-circle', 'color' => '#059669', 'category' => 'deposit', 'order' => 7],
        'custody-tracking' => ['title' => 'متابعة العهدة', 'subtitle' => 'فهم رصيد العهدة وسجل الحركات', 'icon' => 'eye', 'color' => '#F97316', 'category' => 'custody', 'order' => 8],
        'full-cycle' => ['title' => 'دورة التحصيلات الكاملة', 'subtitle' => 'من التحصيل حتى إخلاء العهدة', 'icon' => 'play-circle', 'color' => '#6366F1', 'category' => 'scenarios', 'order' => 9],
    ];

    private const TREASURY_CATEGORIES = [
        'operations' => ['label' => 'العمليات اليومية', 'icon' => 'monitor', 'color' => '#059669'],
        'settlement' => ['label' => 'التسويات', 'icon' => 'arrow-right-left', 'color' => '#8B5CF6'],
        'deposit'    => ['label' => 'الإيداعات البنكية', 'icon' => 'building-2', 'color' => '#06B6D4'],
        'custody'    => ['label' => 'العهدة', 'icon' => 'eye', 'color' => '#F97316'],
        'scenarios'  => ['label' => 'سيناريوهات كاملة', 'icon' => 'play-circle', 'color' => '#6366F1'],
    ];

    private const MEMBERSHIP_TUTORIALS = [
        'new-member-registration' => ['title' => 'تسجيل عضو جديد', 'subtitle' => 'إنشاء استمارة عضوية من الصفر', 'icon' => 'user-plus', 'color' => '#8B5CF6', 'category' => 'registration', 'order' => 1],
        'pay-form-fee' => ['title' => 'دفع رسوم الاستمارة', 'subtitle' => 'إرسال طلب دفع 505 ج.م للخزينة', 'icon' => 'receipt', 'color' => '#059669', 'category' => 'registration', 'order' => 2],
        'fill-form' => ['title' => 'ملء استمارة العضوية', 'subtitle' => 'إكمال البيانات الشخصية والمهنية', 'icon' => 'file-text', 'color' => '#3B82F6', 'category' => 'registration', 'order' => 3],
        'membership-pricing' => ['title' => 'تسعير العضوية', 'subtitle' => 'حساب قيمة العضوية حسب المؤهل', 'icon' => 'calculator', 'color' => '#F59E0B', 'category' => 'registration', 'order' => 4],
        'pay-membership-cash' => ['title' => 'دفع العضوية كاش', 'subtitle' => 'سداد قيمة العضوية دفعة واحدة', 'icon' => 'banknote', 'color' => '#10B981', 'category' => 'financial', 'order' => 5],
        'pay-membership-installments' => ['title' => 'دفع العضوية بالتقسيط', 'subtitle' => 'مقدم 25% وتقسيط حتى 30 شهر', 'icon' => 'calendar-range', 'color' => '#06B6D4', 'category' => 'financial', 'order' => 6],
        'collective-payment' => ['title' => 'الفاتورة المجمعة وتفعيل التابعين', 'subtitle' => 'دفع العضوية يفعّل العضو وجميع تابعيه', 'icon' => 'receipt', 'color' => '#059669', 'category' => 'financial', 'order' => 7],
        'payment-queue-management' => ['title' => 'إدارة طابور الدفع', 'subtitle' => 'إلغاء طلبات وإعادتها للطابور', 'icon' => 'list-ordered', 'color' => '#D97706', 'category' => 'financial', 'order' => 8],
        'special-discounts' => ['title' => 'الخصومات الخاصة', 'subtitle' => 'تطبيق خصم خاص أو عرض مجلس الإدارة', 'icon' => 'badge-percent', 'color' => '#EC4899', 'category' => 'financial', 'order' => 9],
        'add-spouse' => ['title' => 'إضافة زوج/زوجة', 'subtitle' => 'إضافة زوجة للعضوية مع حساب الرسوم', 'icon' => 'heart', 'color' => '#F97316', 'category' => 'family', 'order' => 10],
        'add-child' => ['title' => 'إضافة أبناء', 'subtitle' => 'إضافة أبناء مع التصنيف التلقائي', 'icon' => 'baby', 'color' => '#F59E0B', 'category' => 'family', 'order' => 11],
        'add-temporary-member' => ['title' => 'إضافة عضو مؤقت', 'subtitle' => 'والدين أو أشقاء أو مربية', 'icon' => 'user-cog', 'color' => '#6366F1', 'category' => 'family', 'order' => 12],
        'children-aging' => ['title' => 'تقادم أعمار الأبناء', 'subtitle' => 'التجميد التلقائي والفصل عند بلوغ 25', 'icon' => 'clock', 'color' => '#DC2626', 'category' => 'family', 'order' => 13],
        'interview-process' => ['title' => 'المقابلات', 'subtitle' => 'جدولة وإجراء مقابلة العضوية', 'icon' => 'message-square', 'color' => '#0EA5E9', 'category' => 'procedures', 'order' => 14],
        'change-status' => ['title' => 'تغيير حالة العضوية', 'subtitle' => 'دورة الحالات من محتمل حتى فعال', 'icon' => 'refresh-cw', 'color' => '#8B5CF6', 'category' => 'procedures', 'order' => 15],
        'annual-subscription' => ['title' => 'الاشتراك السنوي', 'subtitle' => 'توليد وتحصيل الاشتراكات السنوية', 'icon' => 'calendar-check', 'color' => '#059669', 'category' => 'financial', 'order' => 16],
        'fines-violations' => ['title' => 'المخالفات والغرامات', 'subtitle' => 'فرض غرامة وتصعيد العقوبات', 'icon' => 'alert-triangle', 'color' => '#DC2626', 'category' => 'procedures', 'order' => 17],
        'carnet-issuance' => ['title' => 'إصدار الكارنيه', 'subtitle' => 'شروط وإجراءات طباعة الكارنيه', 'icon' => 'id-card', 'color' => '#3B82F6', 'category' => 'procedures', 'order' => 18],
        'transfer-separation' => ['title' => 'فصل الأبناء', 'subtitle' => 'فصل ابن/ابنة لعضوية مستقلة', 'icon' => 'git-branch', 'color' => '#F97316', 'category' => 'transfers', 'order' => 19],
        'divorce-transfer' => ['title' => 'تحويل عند الطلاق', 'subtitle' => 'نقل العضوية بعد الطلاق', 'icon' => 'split', 'color' => '#DC2626', 'category' => 'transfers', 'order' => 20],
        'death-transfer' => ['title' => 'تحويل عند الوفاة', 'subtitle' => 'نقل العضوية للزوج/الزوجة', 'icon' => 'heart-off', 'color' => '#6B7280', 'category' => 'transfers', 'order' => 21],
        'waiver-process' => ['title' => 'التنازل عن العضوية', 'subtitle' => 'تنازل لشخص آخر مع رسوم 30%', 'icon' => 'arrow-right-left', 'color' => '#8B5CF6', 'category' => 'transfers', 'order' => 22],
        'membership-freeze-drop' => ['title' => 'التجميد والإسقاط', 'subtitle' => 'تجميد العضوية أو إسقاطها', 'icon' => 'snowflake', 'color' => '#06B6D4', 'category' => 'transfers', 'order' => 23],
        'honorary-membership' => ['title' => 'العضوية الشرفية', 'subtitle' => 'عضوية بدون رسوم بقرار مجلس', 'icon' => 'award', 'color' => '#F59E0B', 'category' => 'types', 'order' => 24],
        'foreign-membership' => ['title' => 'العضوية الأجنبية', 'subtitle' => 'عضوية لغير المصريين بـ 10,000$', 'icon' => 'globe', 'color' => '#10B981', 'category' => 'types', 'order' => 25],
        'athletic-conversion' => ['title' => 'تحويل لاعب لعضو', 'subtitle' => 'تحويل عضوية رياضية لعاملة', 'icon' => 'trophy', 'color' => '#EC4899', 'category' => 'types', 'order' => 26],
        'full-new-member-scenario' => ['title' => 'سيناريو كامل: عضو جديد', 'subtitle' => 'من التسجيل حتى استلام الكارنيه', 'icon' => 'play-circle', 'color' => '#6366F1', 'category' => 'scenarios', 'order' => 27],
    ];

    private const MEMBERSHIP_CATEGORIES = [
        'registration' => ['label' => 'التسجيل والاستمارة', 'icon' => 'user-plus', 'color' => '#8B5CF6'],
        'financial'    => ['label' => 'المالي والرسوم',     'icon' => 'banknote',  'color' => '#059669'],
        'family'       => ['label' => 'التابعين والعائلة',  'icon' => 'users',     'color' => '#F59E0B'],
        'procedures'   => ['label' => 'الإجراءات',          'icon' => 'clipboard', 'color' => '#3B82F6'],
        'transfers'    => ['label' => 'التحويل والفصل',     'icon' => 'git-branch','color' => '#F97316'],
        'types'        => ['label' => 'أنواع العضوية',      'icon' => 'crown',     'color' => '#EC4899'],
        'scenarios'    => ['label' => 'سيناريوهات كاملة',   'icon' => 'play-circle','color' => '#6366F1'],
    ];

    private const MEMBERSHIP_RELATED = ['carnets', 'interviews', 'installments', 'seasonal', 'fines', 'subscriptions', 'documents'];
    private const SA_RELATED = ['coaches', 'facilities', 'tournaments', 'reservations', 'match-center', 'pool-management', 'playgrounds', 'sa-registration', 'player-affairs'];

    public function index(Request $request): Response
    {
        $modules = [
            // ── العمليات (Operations) ──────────────────────────
            'membership' => [
                'title' => 'شئون العضوية',
                'subtitle' => 'التسجيل والرسوم والتحويلات والكارنيهات',
                'icon' => 'users',
                'color' => '#3B82F6',
                'count' => count(self::MEMBERSHIP_TUTORIALS),
            ],
            'sports-activity' => [
                'title' => 'النشاط الرياضي',
                'subtitle' => 'المرافق والأكاديميات والبطولات والحجوزات',
                'icon' => 'activity',
                'color' => '#8B5CF6',
                'count' => count(self::SA_TUTORIALS),
            ],
            // ── المالية (Finance) ──────────────────────────────
            'treasury' => [
                'title' => 'دورة التحصيلات',
                'subtitle' => 'الخزنة الفرعية والرئيسية والإيداعات',
                'icon' => 'safe',
                'color' => '#059669',
                'count' => count(self::TREASURY_TUTORIALS),
            ],
        ];

        $hidden = array_merge(self::MEMBERSHIP_RELATED, self::SA_RELATED);
        foreach (TutorialRegistry::getSections() as $key => $section) {
            if (in_array($key, $hidden, true)) {
                continue;
            }
            $modules[$key] = [
                'title'    => $section['title'],
                'subtitle' => $section['subtitle'],
                'icon'     => $section['icon'],
                'color'    => $section['color'],
                'count'    => count(TutorialRegistry::getTutorials($key)),
            ];
        }

        return $this->view('Tutorials.Views.index', ['modules' => $modules]);
    }

    public function treasury(Request $request): Response
    {
        $grouped = [];
        foreach (self::TREASURY_TUTORIALS as $slug => $tutorial) {
            $cat = $tutorial['category'];
            if (!isset($grouped[$cat])) {
                $grouped[$cat] = self::TREASURY_CATEGORIES[$cat];
                $grouped[$cat]['tutorials'] = [];
            }
            $grouped[$cat]['tutorials'][$slug] = $tutorial;
        }

        return $this->view('Tutorials.Views.treasury.index', [
            'categories' => $grouped,
            'totalCount' => count(self::TREASURY_TUTORIALS),
        ]);
    }

    public function showTreasury(Request $request, string $slug): Response
    {
        if (!isset(self::TREASURY_TUTORIALS[$slug])) {
            return $this->redirect('/tutorials/treasury')->withError('الشرح غير موجود');
        }

        $tutorial = self::TREASURY_TUTORIALS[$slug];
        $viewFile = 'Tutorials.Views.treasury.' . str_replace('-', '_', $slug);

        $keys = array_keys(self::TREASURY_TUTORIALS);
        $currentIdx = array_search($slug, $keys);
        $prev = $currentIdx > 0 ? $keys[$currentIdx - 1] : null;
        $next = $currentIdx < count($keys) - 1 ? $keys[$currentIdx + 1] : null;

        return $this->view($viewFile, [
            'tutorial'     => $tutorial,
            'slug'         => $slug,
            'prevSlug'     => $prev,
            'nextSlug'     => $next,
            'prevTitle'    => $prev ? self::TREASURY_TUTORIALS[$prev]['title'] : null,
            'nextTitle'    => $next ? self::TREASURY_TUTORIALS[$next]['title'] : null,
            'categories'   => self::TREASURY_CATEGORIES,
        ]);
    }

    public function membership(Request $request): Response
    {
        $grouped = [];
        foreach (self::MEMBERSHIP_TUTORIALS as $slug => $tutorial) {
            $cat = $tutorial['category'];
            if (!isset($grouped[$cat])) {
                $grouped[$cat] = self::MEMBERSHIP_CATEGORIES[$cat];
                $grouped[$cat]['tutorials'] = [];
            }
            $grouped[$cat]['tutorials'][$slug] = $tutorial;
        }

        return $this->view('Tutorials.Views.membership.index', [
            'categories' => $grouped,
            'totalCount' => count(self::MEMBERSHIP_TUTORIALS),
        ]);
    }

    public function showMembership(Request $request, string $slug): Response
    {
        if (!isset(self::MEMBERSHIP_TUTORIALS[$slug])) {
            return $this->redirect('/tutorials/membership')->withError('الشرح غير موجود');
        }

        $tutorial = self::MEMBERSHIP_TUTORIALS[$slug];
        $viewFile = 'Tutorials.Views.membership.' . str_replace('-', '_', $slug);

        $keys = array_keys(self::MEMBERSHIP_TUTORIALS);
        $currentIdx = array_search($slug, $keys);
        $prev = $currentIdx > 0 ? $keys[$currentIdx - 1] : null;
        $next = $currentIdx < count($keys) - 1 ? $keys[$currentIdx + 1] : null;

        return $this->view($viewFile, [
            'tutorial'     => $tutorial,
            'slug'         => $slug,
            'prevSlug'     => $prev,
            'nextSlug'     => $next,
            'prevTitle'    => $prev ? self::MEMBERSHIP_TUTORIALS[$prev]['title'] : null,
            'nextTitle'    => $next ? self::MEMBERSHIP_TUTORIALS[$next]['title'] : null,
        ]);
    }

    public function sportsActivity(Request $request): Response
    {
        $grouped = [];
        foreach (self::SA_TUTORIALS as $slug => $tutorial) {
            $cat = $tutorial['category'];
            if (!isset($grouped[$cat])) {
                $grouped[$cat] = self::CATEGORIES[$cat];
                $grouped[$cat]['tutorials'] = [];
            }
            $grouped[$cat]['tutorials'][$slug] = $tutorial;
        }

        return $this->view('Tutorials.Views.sports_activity.index', [
            'categories' => $grouped,
            'totalCount' => count(self::SA_TUTORIALS),
        ]);
    }

    public function show(Request $request, string $slug): Response
    {
        if (!isset(self::SA_TUTORIALS[$slug])) {
            return $this->redirect('/tutorials/sports-activity')->withError('الشرح غير موجود');
        }

        $tutorial = self::SA_TUTORIALS[$slug];
        $viewFile = 'Tutorials.Views.sports_activity.' . str_replace('-', '_', $slug);

        $keys = array_keys(self::SA_TUTORIALS);
        $currentIdx = array_search($slug, $keys);
        $prev = $currentIdx > 0 ? $keys[$currentIdx - 1] : null;
        $next = $currentIdx < count($keys) - 1 ? $keys[$currentIdx + 1] : null;

        return $this->view($viewFile, [
            'tutorial'     => $tutorial,
            'slug'         => $slug,
            'prevSlug'     => $prev,
            'nextSlug'     => $next,
            'prevTitle'    => $prev ? self::SA_TUTORIALS[$prev]['title'] : null,
            'nextTitle'    => $next ? self::SA_TUTORIALS[$next]['title'] : null,
            'categories'   => self::CATEGORIES,
        ]);
    }

    public function section(Request $request, string $section): Response
    {
        $sections = TutorialRegistry::getSections();
        if (!isset($sections[$section])) {
            return $this->redirect('/tutorials')->withError('القسم غير موجود');
        }

        $tutorials = TutorialRegistry::getTutorials($section);
        $categories = TutorialRegistry::getCategories($section);

        $grouped = [];
        foreach ($tutorials as $slug => $tutorial) {
            $cat = $tutorial['category'];
            if (!isset($grouped[$cat])) {
                $grouped[$cat] = $categories[$cat] ?? ['label' => $cat, 'icon' => 'folder', 'color' => '#6B7280'];
                $grouped[$cat]['tutorials'] = [];
            }
            $grouped[$cat]['tutorials'][$slug] = $tutorial;
        }

        return $this->view('Tutorials.Views.section_index', [
            'section'    => $sections[$section],
            'sectionKey' => $section,
            'categories' => $grouped,
            'totalCount' => count($tutorials),
        ]);
    }

    public function showSection(Request $request, string $section, string $slug): Response
    {
        $sections = TutorialRegistry::getSections();
        if (!isset($sections[$section])) {
            return $this->redirect('/tutorials')->withError('القسم غير موجود');
        }

        $tutorials = TutorialRegistry::getTutorials($section);
        if (!isset($tutorials[$slug])) {
            return $this->redirect("/tutorials/{$section}")->withError('الشرح غير موجود');
        }

        $tutorial = $tutorials[$slug];

        $keys = array_keys($tutorials);
        $currentIdx = array_search($slug, $keys);
        $prev = $currentIdx > 0 ? $keys[$currentIdx - 1] : null;
        $next = $currentIdx < count($keys) - 1 ? $keys[$currentIdx + 1] : null;

        $steps = TutorialRegistry::getSteps($section, $slug);

        return $this->view('Tutorials.Views.section_show', [
            'tutorial'     => $tutorial,
            'section'      => $sections[$section],
            'sectionKey'   => $section,
            'slug'         => $slug,
            'steps'        => $steps,
            'prevSlug'     => $prev,
            'nextSlug'     => $next,
            'prevTitle'    => $prev ? $tutorials[$prev]['title'] : null,
            'nextTitle'    => $next ? $tutorials[$next]['title'] : null,
        ]);
    }
}
