<?php

use App\Http\Controllers\Admin\AccountController as AdminAccountController;
use App\Http\Controllers\Admin\AnnouncementController as AdminAnnouncementController;
use App\Http\Controllers\Admin\AssignmentController as AdminAssignmentController;
use App\Http\Controllers\Admin\BookController as AdminBookController;
use App\Http\Controllers\Admin\BookIssueController as AdminBookIssueController;
use App\Http\Controllers\Admin\ClassSectionController as AdminClassSectionController;
use App\Http\Controllers\Admin\CourseOrderController as AdminCourseOrderController;
use App\Http\Controllers\Admin\DashboardController as AdminDashboardController;
use App\Http\Controllers\Admin\DepartmentController as AdminDepartmentController;
use App\Http\Controllers\Admin\EventController as AdminEventController;
use App\Http\Controllers\Admin\FaqController as AdminFaqController;
use App\Http\Controllers\Admin\FeeStructureController as AdminFeeStructureController;
use App\Http\Controllers\Admin\FeeWaiverController as AdminFeeWaiverController;
use App\Http\Controllers\Admin\FrontWebController as AdminFrontWebController;
use App\Http\Controllers\Admin\GalleryController as AdminGalleryController;
use App\Http\Controllers\Admin\GradingScaleController as AdminGradingScaleController;
use App\Http\Controllers\Admin\HomeAboutController as AdminHomeAboutController;
use App\Http\Controllers\Admin\HomeFeatureController as AdminHomeFeatureController;
use App\Http\Controllers\Admin\HomeModuleController as AdminHomeModuleController;
use App\Http\Controllers\Admin\InvoiceController as AdminInvoiceController;
use App\Http\Controllers\Admin\NewsPostController as AdminNewsPostController;
use App\Http\Controllers\Admin\PaymentSettingController as AdminPaymentSettingController;
use App\Http\Controllers\Admin\PayrollController as AdminPayrollController;
use App\Http\Controllers\Admin\ProfileController as AdminProfileController;
use App\Http\Controllers\Admin\ProgramController as AdminProgramController;
use App\Http\Controllers\Admin\ResultController as AdminResultController;
use App\Http\Controllers\Admin\RoomController as AdminRoomController;
use App\Http\Controllers\Admin\SiteSettingController as AdminSiteSettingController;
use App\Http\Controllers\Admin\SliderImageController as AdminSliderImageController;
use App\Http\Controllers\Admin\StudentController as AdminStudentController;
use App\Http\Controllers\Admin\StudentTransferController as AdminStudentTransferController;
use App\Http\Controllers\Admin\SubjectController as AdminSubjectController;
use App\Http\Controllers\Admin\TeacherController as AdminTeacherController;
use App\Http\Controllers\Admin\TermController as AdminTermController;
use App\Http\Controllers\Admin\TransportRouteController as AdminTransportRouteController;
use App\Http\Controllers\Admin\VehicleController as AdminVehicleController;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\CourseCheckoutController;
use App\Http\Controllers\ChatbotController;
use App\Http\Controllers\InstallController;
use App\Http\Controllers\PublicPageController;
use App\Http\Controllers\Student\BillingController;
use App\Http\Controllers\Student\CatalogController;
use App\Http\Controllers\Student\DashboardController;
use App\Http\Controllers\Student\EnrollmentController;
use App\Http\Controllers\Student\PortalPageController;
use Illuminate\Support\Facades\Route;

Route::prefix('install')->name('install.')->group(function () {
    Route::get('/', [InstallController::class, 'requirements'])->name('requirements');
    Route::post('/requirements', [InstallController::class, 'acceptRequirements'])->name('requirements.accept');
    Route::get('/database', [InstallController::class, 'database'])->name('database');
    Route::post('/database', [InstallController::class, 'saveDatabase'])->name('database.save');
    Route::get('/admin', [InstallController::class, 'admin'])->name('admin');
    Route::post('/finish', [InstallController::class, 'finish'])->name('finish');
    Route::get('/complete', [InstallController::class, 'complete'])->name('complete');
});

Route::get('/', [PublicPageController::class, 'home'])->name('home');
Route::get('/course', [PublicPageController::class, 'courses'])->name('front.courses');
Route::get('/e-learning', [PublicPageController::class, 'eLearning'])->name('front.elearning');
Route::get('/course/{slug}', [PublicPageController::class, 'courseDetail'])->name('front.course.detail');
Route::get('/event', [PublicPageController::class, 'events'])->name('front.events');
Route::get('/event/{slug}', [PublicPageController::class, 'eventDetail'])->name('front.event.detail');
Route::get('/faqs', [PublicPageController::class, 'faqs'])->name('front.faqs');
Route::get('/gallery', [PublicPageController::class, 'gallery'])->name('front.gallery');
Route::get('/news', [PublicPageController::class, 'news'])->name('front.news');
Route::get('/news/{slug}', [PublicPageController::class, 'newsDetail'])->name('front.news.detail');
Route::get('/about-us', [PublicPageController::class, 'aboutUs'])->name('front.about');
Route::get('/contact-us', [PublicPageController::class, 'contactUs'])->name('front.contact');
Route::post('/contact-us', [PublicPageController::class, 'contactSubmit']);
Route::post('/api/chatbot', [ChatbotController::class, 'handle'])->name('api.chatbot');
// Buying requires an account: guests are sent to login/register and returned here afterwards.
Route::middleware(['auth'])->group(function () {
    Route::get('/course/{code}/checkout', [CourseCheckoutController::class, 'show'])->name('front.course.checkout');
    Route::post('/course/{code}/checkout', [CourseCheckoutController::class, 'store'])->name('front.course.checkout.store');
    Route::get('/course/checkout/paypal/success/{order}', [CourseCheckoutController::class, 'paypalSuccess'])->name('payment.paypal.success');
    Route::get('/course/checkout/stripe/success/{order}', [CourseCheckoutController::class, 'stripeSuccess'])->name('payment.stripe.success');
    Route::get('/course/checkout/{orderNo}/confirmation', [CourseCheckoutController::class, 'confirmation'])->name('front.course.checkout.confirmation');
});
Route::get('/admission', [AuthController::class, 'showRegister'])->name('front.admission');
Route::get('/register', [AuthController::class, 'showRegister'])->name('register');
Route::post('/register', [AuthController::class, 'register']);
Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
Route::post('/login', [AuthController::class, 'login']);
Route::get('/student/login', [AuthController::class, 'showLogin'])->name('student.login');
Route::get('/admin/login', [AuthController::class, 'showLogin'])->name('admin.login');
Route::get('/teacher/login', [AuthController::class, 'showLogin'])->name('teacher.login');
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');

Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', DashboardController::class)->name('dashboard');
    Route::get('/student/dashboard', DashboardController::class)->name('student.dashboard');
    Route::get('/student/exam-schedules', [PortalPageController::class, 'examSchedules'])->name('student.exam-schedules');
    Route::get('/student/attendances', [PortalPageController::class, 'attendances'])->name('student.attendances');
    Route::get('/student/apply-leaves', [PortalPageController::class, 'applyLeaves'])->name('student.apply-leaves');
    Route::get('/student/library', [PortalPageController::class, 'library'])->name('student.library');
    Route::get('/student/notices', [PortalPageController::class, 'notices'])->name('student.notices');
    Route::get('/student/assignments', [PortalPageController::class, 'assignments'])->name('student.assignments');
    Route::get('/student/downloads', [PortalPageController::class, 'downloads'])->name('student.downloads');
    Route::get('/student/download-file', [PortalPageController::class, 'downloadFile'])->name('student.download-file');
    Route::get('/student/stream-video', [PortalPageController::class, 'streamVideo'])->name('student.stream-video');
    Route::get('/student/transcript', [PortalPageController::class, 'transcript'])->name('student.transcript');
    Route::get('/student/profile', [PortalPageController::class, 'profile'])->name('student.profile');
    Route::put('/student/profile', [PortalPageController::class, 'updateProfile'])->name('student.profile.update');
    Route::get('/courses', [CatalogController::class, 'index'])->name('courses.index');
    Route::post('/enroll/{classSection}', [EnrollmentController::class, 'store'])->name('enrollments.store');
    Route::delete('/enrollments/{enrollment}', [EnrollmentController::class, 'destroy'])->name('enrollments.destroy');
    Route::get('/billing', [BillingController::class, 'index'])->name('billing.index');
    Route::post('/billing/pay', [BillingController::class, 'pay'])->name('billing.pay');
    Route::post('/billing/update-info', [BillingController::class, 'updateInfo'])->name('student.billing.update-info');

    // Online Learning System
    Route::get('/student/online-courses', [\App\Http\Controllers\Student\OnlineCourseController::class, 'index'])->name('student.online-courses.index');
    Route::get('/student/online-courses/shop', [\App\Http\Controllers\Student\OnlineCourseController::class, 'shop'])->name('student.online-courses.shop');
    Route::get('/student/online-courses/my', [\App\Http\Controllers\Student\OnlineCourseController::class, 'myCourses'])->name('student.online-courses.my');
    Route::get('/student/online-courses/{onlineCourse}', [\App\Http\Controllers\Student\OnlineCourseController::class, 'show'])->name('student.online-courses.show');
    Route::post('/student/online-courses/{onlineCourse}/enroll', [\App\Http\Controllers\Student\OnlineCourseController::class, 'enroll'])->name('student.online-courses.enroll');

    // Teacher Instructor Portal
    Route::middleware('role:teacher|admin')->prefix('teacher')->name('teacher.')->group(function () {
        Route::get('/dashboard', [\App\Http\Controllers\Teacher\CourseController::class, 'index'])->name('dashboard');
        Route::resource('courses', \App\Http\Controllers\Teacher\CourseController::class)->except(['show']);
    });

    Route::middleware('role:registrar|finance|admin')
        ->get('/admin', AdminDashboardController::class)
        ->name('admin.dashboard');
    Route::middleware('role:registrar|finance|admin')
        ->get('/admin/dashboard', AdminDashboardController::class)
        ->name('admin.dashboard.alias');
    Route::middleware('role:registrar|finance|admin')
        ->get('/admin/front-web', AdminFrontWebController::class)
        ->name('admin.front-web');

    Route::middleware('role:registrar|finance|admin')
        ->prefix('admin')
        ->name('admin.students.')
        ->group(function () {
            Route::get('/students', [AdminStudentController::class, 'index'])->name('index');
            Route::get('/students/create', [AdminStudentController::class, 'create'])->name('create');
            Route::post('/students', [AdminStudentController::class, 'store'])->name('store');
            Route::get('/students/{student}/edit', [AdminStudentController::class, 'edit'])->name('edit');
            Route::put('/students/{student}', [AdminStudentController::class, 'update'])->name('update');
            Route::delete('/students/{student}', [AdminStudentController::class, 'destroy'])->name('destroy');
            Route::get('/students/{student}/id-card', [AdminStudentController::class, 'idCard'])->name('id-card');
        });

    Route::middleware('role:registrar|finance|admin')
        ->prefix('admin')
        ->name('admin.')
        ->group(function () {
            Route::resource('programs', AdminProgramController::class)->except(['show']);
            Route::resource('fee-structures', AdminFeeStructureController::class)->except(['show']);

            Route::get('/invoices', [AdminInvoiceController::class, 'index'])->name('invoices.index');
            Route::get('/invoices/generate', [AdminInvoiceController::class, 'generateForm'])->name('invoices.generate');
            Route::post('/invoices/generate', [AdminInvoiceController::class, 'generate'])->name('invoices.generate.store');
            Route::get('/invoices/dues', [AdminInvoiceController::class, 'dues'])->name('invoices.dues');
            Route::get('/invoices/{invoice}', [AdminInvoiceController::class, 'show'])->name('invoices.show');
            Route::post('/invoices/{invoice}/pay', [AdminInvoiceController::class, 'recordPayment'])->name('invoices.pay');
        });

    Route::middleware('role:registrar|finance|admin')
        ->prefix('admin/admission/transfers/{direction}')
        ->where(['direction' => 'in|out'])
        ->name('admin.transfers.')
        ->group(function () {
            Route::get('/', [AdminStudentTransferController::class, 'index'])->name('index');
            Route::post('/', [AdminStudentTransferController::class, 'store'])->name('store');
            Route::put('/{transfer}', [AdminStudentTransferController::class, 'update'])->name('update');
            Route::delete('/{transfer}', [AdminStudentTransferController::class, 'destroy'])->name('destroy');
        });

    Route::middleware('role:registrar|admin')
        ->prefix('admin')
        ->name('admin.')
        ->group(function () {
            Route::resource('hostels', \App\Http\Controllers\Admin\HostelController::class);
            Route::resource('hostel-rooms', \App\Http\Controllers\Admin\HostelRoomController::class);
        });

    Route::middleware('role:registrar|finance|admin')
        ->prefix('admin')
        ->name('admin.')
        ->group(function () {
            Route::resource('departments', AdminDepartmentController::class)->except(['show']);
            Route::resource('terms', AdminTermController::class)->except(['show']);
            Route::resource('subjects', AdminSubjectController::class)->except(['show']);
            Route::resource('rooms', AdminRoomController::class)->except(['show']);
            Route::resource('classes', AdminClassSectionController::class)->except(['show']);
            Route::resource('teachers', AdminTeacherController::class)->except(['show']);

            Route::get('/waivers', [AdminFeeWaiverController::class, 'index'])->name('waivers.index');
            Route::post('/waivers', [AdminFeeWaiverController::class, 'store'])->name('waivers.store');
            Route::delete('/waivers/{waiver}', [AdminFeeWaiverController::class, 'destroy'])->name('waivers.destroy');

            Route::get('/notices', [AdminAnnouncementController::class, 'index'])->name('notices.index');
            Route::post('/notices', [AdminAnnouncementController::class, 'store'])->name('notices.store');
            Route::post('/notices/{notice}/publish', [AdminAnnouncementController::class, 'publish'])->name('notices.publish');
            Route::delete('/notices/{notice}', [AdminAnnouncementController::class, 'destroy'])->name('notices.destroy');

            Route::resource('transport-routes', AdminTransportRouteController::class)->except(['show']);
            Route::resource('vehicles', AdminVehicleController::class)->except(['show']);

            Route::get('/assignments', [AdminAssignmentController::class, 'index'])->name('assignments.index');
            Route::post('/assignments', [AdminAssignmentController::class, 'store'])->name('assignments.store');
            Route::post('/assignments/{assignment}/publish', [AdminAssignmentController::class, 'publish'])->name('assignments.publish');
            Route::delete('/assignments/{assignment}', [AdminAssignmentController::class, 'destroy'])->name('assignments.destroy');

            Route::get('/results', [AdminResultController::class, 'index'])->name('results.index');
            Route::get('/results/{class}', [AdminResultController::class, 'edit'])->name('results.edit');
            Route::put('/results/{class}/enrollments/{enrollment}', [AdminResultController::class, 'updateEnrollment'])->name('results.enrollments.update');
            Route::post('/results/{class}/publish', [AdminResultController::class, 'publish'])->name('results.publish');

            Route::get('/grading-scales', [AdminGradingScaleController::class, 'index'])->name('grading-scales.index');
            Route::post('/grading-scales', [AdminGradingScaleController::class, 'store'])->name('grading-scales.store');
            Route::delete('/grading-scales/{gradingScale}', [AdminGradingScaleController::class, 'destroy'])->name('grading-scales.destroy');

            Route::get('/payroll', [AdminPayrollController::class, 'index'])->name('payroll.index');
            Route::post('/payroll/generate', [AdminPayrollController::class, 'generate'])->name('payroll.generate');
            Route::post('/payroll/{payroll}/mark-paid', [AdminPayrollController::class, 'markPaid'])->name('payroll.mark-paid');

            Route::resource('accounts', AdminAccountController::class)->except(['show']);

            Route::get('/events', [AdminEventController::class, 'index'])->name('events.index');
            Route::post('/events', [AdminEventController::class, 'store'])->name('events.store');
            Route::post('/events/{event}/publish', [AdminEventController::class, 'publish'])->name('events.publish');
            Route::delete('/events/{event}', [AdminEventController::class, 'destroy'])->name('events.destroy');

            Route::get('/books', [AdminBookController::class, 'index'])->name('books.index');
            Route::post('/books', [AdminBookController::class, 'store'])->name('books.store');
            Route::delete('/books/{book}', [AdminBookController::class, 'destroy'])->name('books.destroy');

            Route::get('/book-issues', [AdminBookIssueController::class, 'index'])->name('book-issues.index');
            Route::post('/book-issues', [AdminBookIssueController::class, 'store'])->name('book-issues.store');
            Route::post('/book-issues/{bookIssue}/return', [AdminBookIssueController::class, 'returnBook'])->name('book-issues.return');

            Route::get('/course-orders', [AdminCourseOrderController::class, 'index'])->name('course-orders.index');
            Route::post('/course-orders/{courseOrder}/mark-paid', [AdminCourseOrderController::class, 'markPaid'])->name('course-orders.mark-paid');
            Route::resource('online-courses', \App\Http\Controllers\Admin\OnlineCourseController::class)->except(['show']);
            Route::post('/online-courses/{onlineCourse}/approve', [\App\Http\Controllers\Admin\OnlineCourseController::class, 'approve'])->name('online-courses.approve');
            Route::post('/online-courses/{onlineCourse}/reject', [\App\Http\Controllers\Admin\OnlineCourseController::class, 'reject'])->name('online-courses.reject');

            Route::get('/slider-images', [AdminSliderImageController::class, 'index'])->name('slider-images.index');
            Route::post('/slider-images', [AdminSliderImageController::class, 'store'])->name('slider-images.store');
            Route::delete('/slider-images/{sliderImage}', [AdminSliderImageController::class, 'destroy'])->name('slider-images.destroy');

            Route::get('/home-features', [AdminHomeFeatureController::class, 'index'])->name('home-features.index');
            Route::put('/home-features', [AdminHomeFeatureController::class, 'update'])->name('home-features.update');
            Route::get('/home-about', [AdminHomeAboutController::class, 'edit'])->name('home-about.edit');
            Route::put('/home-about', [AdminHomeAboutController::class, 'update'])->name('home-about.update');
            Route::get('/home-modules', [AdminHomeModuleController::class, 'index'])->name('home-modules.index');
            Route::put('/home-modules', [AdminHomeModuleController::class, 'update'])->name('home-modules.update');

            Route::get('/gallery', [AdminGalleryController::class, 'index'])->name('gallery.index');
            Route::post('/gallery', [AdminGalleryController::class, 'store'])->name('gallery.store');
            Route::delete('/gallery/{gallery}', [AdminGalleryController::class, 'destroy'])->name('gallery.destroy');

            Route::get('/news', [AdminNewsPostController::class, 'index'])->name('news.index');
            Route::post('/news', [AdminNewsPostController::class, 'store'])->name('news.store');
            Route::post('/news/{newsPost}/publish', [AdminNewsPostController::class, 'publish'])->name('news.publish');
            Route::delete('/news/{newsPost}', [AdminNewsPostController::class, 'destroy'])->name('news.destroy');

            Route::get('/faqs', [AdminFaqController::class, 'index'])->name('faqs.index');
            Route::post('/faqs', [AdminFaqController::class, 'store'])->name('faqs.store');
            Route::delete('/faqs/{faq}', [AdminFaqController::class, 'destroy'])->name('faqs.destroy');

            Route::get('/settings/general', [AdminSiteSettingController::class, 'edit'])->name('settings.general');
            Route::put('/settings/general', [AdminSiteSettingController::class, 'update'])->name('settings.general.update');
            Route::get('/settings/payment', [AdminPaymentSettingController::class, 'edit'])->name('settings.payment');
            Route::put('/settings/payment', [AdminPaymentSettingController::class, 'update'])->name('settings.payment.update');

            Route::get('/contact-messages', [\App\Http\Controllers\Admin\ContactMessageController::class, 'index'])->name('contact-messages.index');
            Route::patch('/contact-messages/{id}/read', [\App\Http\Controllers\Admin\ContactMessageController::class, 'markRead'])->name('contact-messages.read');
            Route::delete('/contact-messages/{id}', [\App\Http\Controllers\Admin\ContactMessageController::class, 'destroy'])->name('contact-messages.destroy');

            Route::get('/profile', [AdminProfileController::class, 'edit'])->name('profile.edit');
            Route::put('/profile', [AdminProfileController::class, 'update'])->name('profile.update');
        });
});
