<?php

use App\Http\Controllers\NotificationController;
use App\Http\Controllers\Admin\UserController;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\SessionController;
use App\Http\Controllers\Auth\ForgotPasswordController;
use App\Http\Controllers\CourseController;
use App\Http\Controllers\FrontCourseController;
use App\Http\Controllers\Learner\EnrollmentController;
use App\Http\Controllers\Learner\LearnerCourseController;
use App\Http\Controllers\LessonController;
use App\Http\Controllers\QuestionController;
use App\Http\Controllers\QuizController;
use App\Http\Controllers\SectionController;
use App\Http\Controllers\Teacher\MyStudentController;
use App\Http\Controllers\Manager\MyLearnerController;
use App\Http\Controllers\UserProfileController;
use App\Http\Controllers\ChatController;
use App\Http\Controllers\CommonController;
use App\Http\Controllers\CourseChatController;
use App\Http\Controllers\CourseResourceController;
use App\Http\Controllers\DashBoardController;
use App\Http\Controllers\GroupController;
use App\Http\Controllers\InvitationByEmailController;
use Illuminate\Support\Facades\Broadcast;
use App\Http\Controllers\SubscriptionController;
use App\Http\Controllers\StripeWebhookController;
use App\Http\Controllers\TagController;
use App\Models\LearningPath;


Route::middleware(['auth:sanctum', 'role:learner'])->group(function () {
    Route::post('/subscribe/{plan}', [SubscriptionController::class, 'subscribe']);
});
Route::get('/plans', [SubscriptionController::class, 'listPlans']);
Route::get('/current-plan', [SubscriptionController::class, 'currentSubscription']);
// Single Course
Route::get('/course-purchase', [SubscriptionController::class, 'coursePurchase']);

Route::post('/webhook/stripe', [StripeWebhookController::class, 'handle']);

Route::post('password/email', [ForgotPasswordController::class, 'sendResetPasswordCode'])->name('password.email');
Route::post('password/otp/resend', [ForgotPasswordController::class, 'resendResetPasswordCode'])->name('password.resend');
Route::post('password/otp/verify', [ForgotPasswordController::class, 'verifyResetPasswordCode'])->name('password.otp_verify');
Route::post('password/reset', [ForgotPasswordController::class, 'resetPassword'])->middleware('guest')->name('password.update');
Route::middleware('auth:sanctum')->post('password/change', [UserProfileController::class, 'changePassword']);


/* Auth */
Route::name('session.')
    ->prefix('session')
    ->group(
        function () {
            Route::post('signup', [SessionController::class, 'signup'])->name('signup');
            Route::post('signup/verify', [SessionController::class, 'verifySignupOtp'])->name('verifySignupOtp');
            Route::post('send-otp', [SessionController::class, 'sendOTP'])->name('sendOTP');
            Route::post('verify-otp', [SessionController::class, 'verifyOTP'])->name('verifyOTP');
            Route::post('resend-otp', [SessionController::class, 'resendOTP'])->name('resendOTP');
            Route::middleware('auth:sanctum')->post('logout', [SessionController::class, 'logout']);
        }
    );

/* Auth */
Route::name('front.')
    ->prefix('front')
    ->middleware(['auth:sanctum'])
    ->group(
        function () {
            Route::get('course', [FrontCourseController::class, 'index'])->name('course');
            Route::post('courseWithNamesList', [FrontCourseController::class, 'courseWithNamesList'])->name('course.names.list');
        }
    );


// Manager

Route::name('manager.')
    ->prefix('manager')
    ->middleware(['auth:sanctum', 'role:manager|admin|sub_manager', 'check.password.age'])
    ->group(
        function () {
            //Profile
            Route::get('my-profile', [UserProfileController::class, 'managerProfile'])->name('myprofile');
            Route::post('my-profile', [UserProfileController::class, 'updateManagerProfile'])->name('myprofile');
            // Courses

            Route::get('submanager-my-profile', [UserProfileController::class, 'subManagerProfile'])->name('submanager.myprofile');
            Route::post('submanager-my-profile', [UserProfileController::class, 'updateSubmanagerProfile'])->name('submanager.myprofile');

            Route::get('course-types', [CourseController::class, 'courseType'])->name('course.type.index');
            Route::get('courses', [CourseController::class, 'index'])->name('courses.index');
            Route::post('courses/store', [CourseController::class, 'store'])->name('courses.store');
            Route::get('courses/show/{course}', [CourseController::class, 'show'])->name('courses.show');
            Route::post('courses/update/{course}', [CourseController::class, 'update'])->name('courses.update');
            Route::delete('courses/destroy/{course}', [CourseController::class, 'destroy'])->name('courses.destroy');
            Route::post('courses/update/status/{course}', [CourseController::class, 'updateStatus'])->name('courses.update.status');

            // Section
            Route::get('section', [SectionController::class, 'index'])->name('section.index');
            Route::post('sections/items/reorder', [SectionController::class, 'reorder']);
            Route::put('section/organize', [SectionController::class, 'sectionOrganize'])->name('section.index');
            Route::post('section/store', [SectionController::class, 'store'])->name('section.store');
            Route::get('section/show/{section}', [SectionController::class, 'show'])->name('section.show');
            Route::post('section/update/{section}', [SectionController::class, 'update'])->name('section.update');
            Route::delete('section/destroy/{section}', [SectionController::class, 'destroy'])->name('section.destroy');

            // Lesson
            Route::get('lesson', [LessonController::class, 'index'])->name('lesson.index');
            Route::post('lesson/store', [LessonController::class, 'store'])->name('lesson.store');
            Route::get('lesson/show/{section}', [LessonController::class, 'show'])->name('lesson.show');
            Route::post('lesson/update/{section}', [LessonController::class, 'update'])->name('lesson.update');
            Route::delete('lesson/destroy/{section}', [LessonController::class, 'destroy'])->name('lesson.destroy');
            Route::post('lesson/update/status/{lesson}', [LessonController::class, 'updateStatus'])->name('lesson.update.status');
            Route::delete('lesson/video/destroy/{lesson}', [LessonController::class, 'deleteVideo'])->name('lesson.destroy');
            Route::delete('lesson/image/destroy/{lesson}', [LessonController::class, 'deleteImage'])->name('lesson.destroy');

            //Quiz  
            Route::get('quiz', [QuizController::class, 'index'])->name('quiz.index');
            Route::post('quiz/store', [QuizController::class, 'store'])->name('quiz.store');
            Route::get('quiz/show/{quiz}', [QuizController::class, 'show'])->name('quiz.show');
            Route::put('quiz/passing/percent/{quiz}', [QuizController::class, 'updatePassingPercentage'])->name('quiz.updatePassingPercentage');
            Route::post('quiz/update/{quiz}', [QuizController::class, 'update'])->name('quiz.update');
            Route::delete('quiz/destroy/{quiz}', [QuizController::class, 'destroy'])->name('quiz.destroy');
            Route::post('quiz/update/status/{quiz}', [QuizController::class, 'updateStatus'])->name('quiz.update.status');

            //Question  
            Route::get('question', [QuestionController::class, 'index'])->name('question.index');
            Route::post('question/store', [QuestionController::class, 'store'])->name('question.store');
            Route::get('question/show/{question}', [QuestionController::class, 'show'])->name('question.show');
            Route::post('question/update/{question}', [QuestionController::class, 'update'])->name('question.update');
            Route::delete('question/destroy/{question}', [QuestionController::class, 'destroy'])->name('question.destroy');

            //My Learners 
            Route::get('my-learners', [MyLearnerController::class, 'mystudents'])->name('mylearner');
            Route::get('my-submanager', [MyLearnerController::class, 'subManagerList']);

            //  Techear List
            Route::get('teachers', [MyLearnerController::class, 'teacherList'])->name('teacher');

            Route::get('course/enrollments/requestList', [EnrollmentController::class, 'requestOfEnrollments'])->name('course.enroll.request.list');
            Route::post('course/enroll/status-update', [EnrollmentController::class, 'updateEnrollmentStatus'])->name('update.enrollment.request');
            Route::get('coursesList', [FrontCourseController::class, 'coursesList'])->name('courses.list');
            Route::post('/download-all-certificates', [FrontCourseController::class, 'downloadAllCertificates']);
            Route::get('learnerList', [FrontCourseController::class, 'learnerList'])->name('learners.list');
            Route::get('sub-manager/learnerList', [FrontCourseController::class, 'subManagerLearnerList'])->name('sub_manager.learners.list');
            Route::post('sub-manager/store', [UserController::class, 'subManagerStore'])->name('sub_manager.store');
            Route::post('sub-manager/update/{id}', [UserController::class, 'subManagerUpdate'])->name('sub_manager.update');
            Route::get('user/show/{user}', [UserController::class, 'show'])->name('manager.user.show');
            Route::delete('user/destroy/{user}', [UserController::class, 'destroy'])->name('user.destroy');
            Route::post('users/export', [MyLearnerController::class, 'exportUsers'])->name('users.export');
            Route::get('learner/detail/{id}', [UserController::class, 'learnerDetail'])->name('users.details');
        }

    );


// learner

Route::name('learner.')
    ->prefix('learner')
    ->middleware(['auth:sanctum', 'role:learner|admin|teacher|manager|sub_manager', 'check.password.age'])
    ->group(
        function () {
            // Enrollment
            Route::post('enroll', [EnrollmentController::class, 'enroll'])->name('enroll');
            Route::post('my-courses', [LearnerCourseController::class, 'myCourse'])->name('mycourse');
            Route::post('my-courses-history', [LearnerCourseController::class, 'myHistory'])->name('myHistory');
            Route::get('my-profile', [UserProfileController::class, 'learnerProfile'])->name('myprofile');
            Route::post('my-profile', [UserProfileController::class, 'updateLearnerProfile'])->name('myprofile.update');
            Route::post('bio-update', [UserProfileController::class, 'bioUpdate'])->name('myprofile.bio.update');
            Route::get('my-status', [LearnerCourseController::class, 'myStatus'])->name('mystatus.update');
            Route::post('lesson/complete/{lesson}', [EnrollmentController::class, 'completeLesson'])->name('complete.lesson');
            Route::post('quiz/complete/{quiz}', [EnrollmentController::class, 'completeQuiz'])->name('complete.quiz');
            Route::get('certificates', [LearnerCourseController::class, 'certificateList'])->name('complete.quiz');
            Route::get('certificates/download/{id}', [LearnerCourseController::class, 'downloadCertificate'])->name('certificate.download');
            // Quiz attempt 
            Route::post('attempt/question', [LearnerCourseController::class, 'attemptQuestion'])->name('question.attempt');
            Route::post('quiz/retake/{id}', [LearnerCourseController::class, 'quizRetake'])->name('quiz.retake');
            Route::get('quiz/leaderboard/{id}', [LearnerCourseController::class, 'leaderboardList'])->name('quiz.leaderboard');
            Route::get('quiz/result/{id}', [LearnerCourseController::class, 'quizResult'])->name('quiz.leaderboard');

            Route::get('courses/show/{course}', [CourseController::class, 'show'])->name('courses.show')->middleware('role:learner|admin');
            // section
            Route::get('section', [SectionController::class, 'index'])->name('section.index');
            //Quiz    
            Route::get('quiz', [QuizController::class, 'index'])->name('quiz.index');
            //Lesson
            Route::get('lesson', [LessonController::class, 'index'])->name('lesson.index');

            // Course Bookmarks
            Route::post('course/bookmark', [LearnerCourseController::class, 'courseBookmark'])->name('course.bookmark');
            Route::get('course/bookmark/list', [LearnerCourseController::class, 'getBookmarkedCourses'])->name('bookmark.course.list');

            //request for enrollment    
            Route::post('course/enroll/request', [EnrollmentController::class, 'requestForCourseEnrollment'])->name('course.enroll.request');
            Route::get('mybadges', [App\Http\Controllers\BadgeController::class, 'userBadges']);
        }

    );


// Teacher
Route::name('teacher.')
    ->prefix('teacher')
    ->middleware(['auth:sanctum', 'role:teacher', 'check.password.age'])
    ->group(
        function () {
            // Enrollment
            Route::get('my-profile', [UserProfileController::class, 'teacherProfile'])->name('myprofile');
            Route::post('my-profile', [UserProfileController::class, 'updateTeacherProfile'])->name('myprofile');
            Route::get('my-students', [MyStudentController::class, 'mystudents'])->name('myprofile')->withoutMiddleware("role:teacher");
            Route::get('my-course', [MyStudentController::class, 'myCourse'])->name('myprofile');

            Route::post('bio-update', [UserProfileController::class, 'teacherBioUpdate'])->name('teacher.bio.update');
        }

    );


// Admin
Route::name('admin.')
    ->prefix('admin')
    ->middleware(['auth:sanctum', 'role:admin'])
    ->group(
        function () {

            Route::get('user', [UserController::class, 'index'])->name('user.index');
            Route::post('user/update/{user}', [UserController::class, 'updateUserProfile'])->name('user.update');
            Route::put('user/update-status/{user}', [UserController::class, 'updateUserStatus'])->name('user.update.status');
            Route::get('user/show/{user}', [UserController::class, 'show'])->name('user.show');
            Route::post('user/store', [UserController::class, 'store'])->name('user.store');
            Route::delete('user/destroy/{user}', [UserController::class, 'destroy'])->name('user.destroy');

            //Teacher
            Route::get('teachers', [MyLearnerController::class, 'teacherList'])->name('teacher');

            // Courses
            Route::get('course-types', [CourseController::class, 'courseType'])->name('course.type.index');
            Route::get('courses', [CourseController::class, 'index'])->name('courses.index');
            Route::post('courses/store', [CourseController::class, 'store'])->name('courses.store');
            Route::get('courses/show/{course}', [CourseController::class, 'show'])->name('courses.show');
            Route::post('courses/update/{course}', [CourseController::class, 'update'])->name('courses.update');
            Route::delete('courses/destroy/{course}', [CourseController::class, 'destroy'])->name('courses.destroy');
            Route::post('courses/update/status/{course}', [CourseController::class, 'updateStatus'])->name('courses.update.status');

            // Section
            Route::get('section', [SectionController::class, 'index'])->name('section.index');
            Route::post('section/store', [SectionController::class, 'store'])->name('section.store');
            Route::get('section/show/{section}', [SectionController::class, 'show'])->name('section.show');
            Route::post('section/update/{section}', [SectionController::class, 'update'])->name('section.update');
            Route::delete('section/destroy/{section}', [SectionController::class, 'destroy'])->name('section.destroy');

            // Lesson
            Route::get('lesson', [LessonController::class, 'index'])->name('lesson.index');
            Route::post('lesson/store', [LessonController::class, 'store'])->name('lesson.store');
            Route::get('lesson/show/{section}', [LessonController::class, 'show'])->name('lesson.show');
            Route::post('lesson/update/{section}', [LessonController::class, 'update'])->name('lesson.update');
            Route::delete('lesson/destroy/{section}', [LessonController::class, 'destroy'])->name('lesson.destroy');
            Route::post('lesson/update/status/{lesson}', [LessonController::class, 'updateStatus'])->name('lesson.update.status');
            Route::delete('lesson/video/destroy/{lesson}', [LessonController::class, 'deleteVideo'])->name('lesson.destroy');
            Route::delete('lesson/image/destroy/{lesson}', [LessonController::class, 'deleteImage'])->name('lesson.destroy');

            //Quiz  
            Route::get('quiz', [QuizController::class, 'index'])->name('quiz.index');
            Route::post('quiz/store', [QuizController::class, 'store'])->name('quiz.store');
            Route::get('quiz/show/{quiz}', [QuizController::class, 'show'])->name('quiz.show');
            Route::post('quiz/update/{quiz}', [QuizController::class, 'update'])->name('quiz.update');
            Route::delete('quiz/destroy/{quiz}', [QuizController::class, 'destroy'])->name('quiz.destroy');
            Route::post('quiz/update/status/{quiz}', [QuizController::class, 'updateStatus'])->name('quiz.update.status');

            //Question  
            Route::get('question', [QuestionController::class, 'index'])->name('question.index');
            Route::post('question/store', [QuestionController::class, 'store'])->name('question.store');
            Route::get('question/show/{question}', [QuestionController::class, 'show'])->name('question.show');
            Route::post('question/update/{question}', [QuestionController::class, 'update'])->name('question.update');
            Route::delete('question/destroy/{question}', [QuestionController::class, 'destroy'])->name('question.destroy');
            Route::get('my-profile', [UserProfileController::class, 'adminProfile'])->name('myprofile');
            Route::post('my-profile', [UserProfileController::class, 'updateAdminProfile'])->name('myprofile');

            Route::get('course/enrollments/requestList', [EnrollmentController::class, 'requestOfEnrollments'])->name('course.enroll.request.list');
            Route::post('course/enroll/status-update', [EnrollmentController::class, 'updateEnrollmentStatus'])->name('update.enrollment.request');

            // Setting
            Route::post('update-setting', [App\Http\Controllers\SettingController::class, 'updateSetting']);
            Route::get('settings/list', [App\Http\Controllers\SettingController::class, 'list']);

            // Point System
            Route::get('points/list', [App\Http\Controllers\Admin\PointSystemController::class, 'list']);
            Route::post('points/update', [App\Http\Controllers\Admin\PointSystemController::class, 'updatePoints']);

            Route::get('badges-list', [App\Http\Controllers\BadgeController::class, 'BadgesList']);

            // LearningPath
            Route::get('learning-path/index', [App\Http\Controllers\LearningPathController::class, 'index']);
            Route::get('learning-path/show/{id}', [App\Http\Controllers\LearningPathController::class, 'show']);
            Route::post('learning-path/store', [App\Http\Controllers\LearningPathController::class, 'storeLp']);
            Route::post('learning-path/update/{id}', [App\Http\Controllers\LearningPathController::class, 'updateLp']);
            Route::delete('learning-path/delete/{id}', [App\Http\Controllers\LearningPathController::class, 'delete']);
            Route::post('learning-path/status-update/{id}', [App\Http\Controllers\LearningPathController::class, 'updateStatus']);
            Route::post('learningPathCourses', [App\Http\Controllers\LearningPathController::class, 'learningPathCourses']);
        }


    );

// chat

Route::middleware('auth:sanctum')->group(function () {
    Route::get('subcategories-list', [App\Http\Controllers\SubcategoryController::class, 'subcategoriesList']);
    Route::get('learner/courses/show/{course}', [CourseController::class, 'show'])->name('courses.show');

    // Group chat
    Route::post('/groups', [GroupController::class, 'create']);
    Route::post('/groups/{group}/add-member', [GroupController::class, 'addMember']);
    Route::get('/groups/{group}/messages', [ChatController::class, 'getGroupMessages']);
    Route::post('/groups/{group}/message', [ChatController::class, 'sendGroupMessage']);

    // 1-on-1 chat
    Route::get('/chat/{userId}/messages', [ChatController::class, 'getDirectMessages']);
    Route::post('/chat/{userId}/message', [ChatController::class, 'sendDirectMessage']);
    Route::get('/chat/users', [ChatController::class, 'contacts']);
    Route::delete('/full-chat/delete', [ChatController::class, 'chatDelete']);
    Route::delete('/full-chat/group-delete', [ChatController::class, 'groupChatDelete']);

    // Dashboard Counts
    Route::post('/dashboard/index', [DashBoardController::class, 'index']);
    Route::post('/dashboard/submanager/index', [DashBoardController::class, 'subManagerDashboard']);
    Route::get('learner/categoryList', [App\Http\Controllers\CategoryController::class, 'categoryList']);
    Route::post('month-wise-chart', [App\Http\Controllers\DashBoardController::class, 'MonthWiseCharts']);
    Route::post('course-ration-chart', [App\Http\Controllers\DashBoardController::class, 'CourseCompleRation']);

    Route::get('banner-data', [App\Http\Controllers\SettingController::class, 'bannerData']);

    Route::name('notifications.')
        ->prefix('notifications')
        ->group(function () {
            Route::post('/', [NotificationController::class, 'index'])->name('index');
            Route::get('/unread', [NotificationController::class, 'unreadNotifications'])->name('unread.notifications');
            Route::get('/unread-count', [NotificationController::class, 'unreadCount'])->name('unread.count');
            Route::get('mark-as-read/{id}', [NotificationController::class, 'markAsRead'])->name('mark-as-read');
        });

    //sidebar statics        
    Route::get('sidebar/statics', [App\Http\Controllers\DashBoardController::class, 'sidebarStatics']);
    Route::post('follow/unfollow', [App\Http\Controllers\FollowController::class, 'doFollowUnfollow']);

    Route::prefix('course-chat')->middleware('auth:sanctum')->group(function () {
        // Get all messages for a course
        Route::get('{courseId}/messages', [CourseChatController::class, 'getCourseMessages']);
        // Send a new message in a course
        Route::post('{courseId}/messages', [CourseChatController::class, 'sendCourseMessage']);
        // Reply to a message (nested reply)
        Route::post('reply/{messageId}', [CourseChatController::class, 'replyMessage']);
        // Like/unlike a message
        Route::post('like/{messageId}', [CourseChatController::class, 'toggleLike']);
        Route::post('/follow/{messageId}/', [CourseChatController::class, 'toggleFollow']); // 👈 new
    });
});

Route::middleware('auth:sanctum', 'role:admin|manager|sub_manager|teacher|learner')->group(function () {

    Route::get('course-type', [CommonController::class, 'courseType']);
    Route::resource('categories', App\Http\Controllers\CategoryController::class);
    Route::put('category/organize', [CommonController::class, 'categoriesOrganize']);
    Route::post('invite', [InvitationByEmailController::class, 'import']);
    Route::post('invite-mail', [InvitationByEmailController::class, 'inviteByEmails']);
    Route::get('invite-list', [InvitationByEmailController::class, 'invitedGuests']);
    Route::resource('tag', TagController::class);
    Route::resource('tag', TagController::class);
    Route::post('courses/{courseId}/tags', [TagController::class, 'attachToCourse']);
    Route::get('tags/{tagId}/courses', [TagController::class, 'courseByTag']);
    Route::resource('subcategories', App\Http\Controllers\SubcategoryController::class);
    Route::get('subcategory-dropdown/{course}', [App\Http\Controllers\SubcategoryController::class, 'ByCategory']);
    Route::get('category-dropdown', [App\Http\Controllers\CategoryController::class, 'dropDownCatefory']);
    Route::post('/course/upload-files', [CourseResourceController::class, 'uploadFiles']);
    Route::delete('/course/delete-file/{id}', [CourseResourceController::class, 'deleteFile']);
    Route::get('/course/{course_id}/files', [CourseResourceController::class, 'getFiles']);
});

Broadcast::routes(['middleware' => ['auth:sanctum']]);
