<?php

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\GroupController;
use Illuminate\Support\Facades\Broadcast;
use App\Http\Controllers\SubscriptionController;
use App\Http\Controllers\StripeWebhookController;

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']);

Route::post('/webhook/stripe', [StripeWebhookController::class, 'handle'])
    ->withoutMiddleware([
        \Illuminate\Foundation\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \Illuminate\Foundation\Http\Middleware\TransformsRequest::class,
    ]);


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')
    ->group(function(){
        Route::get('course', [FrontCourseController::class, 'index'])->name('course');
     }
);


// Manager

Route::name('manager.')
    ->prefix('manager')
    ->middleware(['auth:sanctum', 'role: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('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');

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

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


    }
    
);


// learner

Route::name('learner.')
    ->prefix('learner')
    ->middleware(['auth:sanctum', 'role:learner','check.password.age'])
    ->group(function(){
        // Enrollment
        Route::post('enroll', [EnrollmentController::class, 'enroll'])->name('enroll');
        Route::post('my-courses', [LearnerCourseController::class, 'myCourse'])->name('mycourse');
        Route::get('my-profile', [UserProfileController::class, 'learnerProfile'])->name('myprofile');
        Route::post('my-profile', [UserProfileController::class, 'updateLearnerProfile'])->name('myprofile.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');
        // 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');


    }
    
);


// 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');
   }
    
);


// 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::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');


   }
    
);

    // chat

Route::middleware('auth:sanctum')->group(function () {
    
    // 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::middleware('auth:sanctum', 'role:admin|manager')->group(function () {
    
    Route::get('course-type', [CommonController::class, 'courseType']);

});

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