<?php

use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\BookingController;
use App\Http\Controllers\Api\ProfessionalController;
use App\Http\Controllers\Api\ProfessionController;
use App\Http\Controllers\Api\RatingController;
use App\Http\Controllers\Api\RoleController;
use App\Http\Controllers\Api\UserController;
use App\Http\Controllers\PaymentApiController;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\InternalPayoutNotificationController;

Route::prefix('v1')->group(function () {
    Route::post('internal/payout-disbursed', InternalPayoutNotificationController::class);
    Route::apiResource('roles', RoleController::class);
    Route::post('accounts/register', [AuthController::class, 'register']);
    Route::post('accounts/activation', [AuthController::class, 'activation']);
    
    Route::post('login', [AuthController::class, 'login']);
    Route::post('refresh', [AuthController::class, 'refresh']);
    Route::post('forgot-password', [AuthController::class, 'forgotPassword']);
    Route::post('change-password', [AuthController::class, 'changePassword']);
    Route::post('code/verify', [AuthController::class, 'verifyCode']);
    Route::post('code/resend', [AuthController::class, 'resendCode']);

    Route::post('professionals/application', [ProfessionalController::class, 'submitApplication']);
    Route::patch('professionals/application/update-status', [ProfessionalController::class, 'updateApplicationStatus']);
    Route::get('professionals/application/list', [ProfessionalController::class, 'applicationList']);

    Route::get('professions', [ProfessionController::class, 'index']);
    Route::get('professions/{id}', [ProfessionController::class, 'show']);
    Route::get('professions/{id}/specialties', [ProfessionController::class, 'getSpecialties']);
    
    Route::group(['middleware' => 'auth:api'], function () {
        Route::get('users/profile', [UserController::class, 'getProfile']);
        Route::post('users/profile/update', [UserController::class, 'updateProfile']);
        Route::post('users/profile/change-password', [UserController::class, 'changePassword']);
        Route::put('users/push-token', [UserController::class, 'updatePushToken']);
        Route::delete('users/push-token', [UserController::class, 'deletePushToken']);
        Route::get('professionals/search', [ProfessionalController::class, 'searchProfessional']);
        Route::get('professionals/view-details/{professionalId}', [ProfessionalController::class, 'viewProfessionalDetails']);
        Route::get('professionals/view-schedule/{professionalId}/{date}', [ProfessionalController::class, 'viewProfessionalSchedule']);
        // Professionals routes
        Route::group(['middleware' => 'verify.professional.token'], function () {
            Route::post('professionals/schedules', [ProfessionalController::class, 'updateSchedule']);
            Route::get('professionals/profile-information', [ProfessionalController::class, 'getProfileInformation']);
            Route::put('professionals/profile-information', [ProfessionalController::class, 'updateProfileInformation']);
            Route::get('professionals/schedules/override', [ProfessionalController::class, 'getOverrideSchedule']);
            Route::post('professionals/schedules/override', [ProfessionalController::class, 'overrideSchedule']);
            Route::put('professionals/schedules/override/{id}', [ProfessionalController::class, 'updateOverrideSchedule']);
            Route::delete('professionals/schedules/override/{id}', [ProfessionalController::class, 'deleteOverrideSchedule']);
            Route::get('professionals/payouts/setting', [ProfessionalController::class, 'getPayoutSetting']);
            Route::post('professionals/payouts/setting', [ProfessionalController::class, 'storePayoutSetting']);
            Route::get('professionals/unreleased-earnings', [ProfessionalController::class, 'unreleasedEarnings']);
            Route::get('professionals/payouts/{payout}/proof', [ProfessionalController::class, 'downloadPayoutProof']);
        }); 
        // Booking routes
        Route::group(['middleware' => 'verify.generalUser.token'], function () {
            Route::post('bookings/create', [BookingController::class, 'createBooking']);
            Route::post('bookings/update-status', [BookingController::class, 'updateBookingStatus']);
            Route::get('bookings', [BookingController::class, 'getBookingByUser']);
            Route::get('bookings/view-details/{bookingId}', [BookingController::class, 'viewBookingDetails']);
            Route::post('bookings/create-payment', [BookingController::class, 'createPayment']);
            Route::post('bookings/consultation/start', [BookingController::class, 'startConsultation']);
            Route::post('bookings/consultation/presence', [BookingController::class, 'consultationPresence']);
            Route::post('bookings/consultation/close', [BookingController::class, 'closeConsultation']);
            Route::post('ratings', [RatingController::class, 'submitRating']);
            Route::get('notifications', [\App\Http\Controllers\Api\NotificationController::class, 'index']);
            Route::post('notifications/read', [\App\Http\Controllers\Api\NotificationController::class, 'markAllRead']);
            Route::get('notifications/preferences', [\App\Http\Controllers\Api\NotificationController::class, 'preferences']);
            Route::put('notifications/preferences', [\App\Http\Controllers\Api\NotificationController::class, 'updatePreferences']);
            Route::delete('notifications/clear', [\App\Http\Controllers\Api\NotificationController::class, 'clear']);
            Route::delete('notifications/{id}', [\App\Http\Controllers\Api\NotificationController::class, 'destroy']);
        });

        // Book Now routes
        Route::group(['middleware' => 'verify.generalUser.token'], function () {
            Route::post('book-now', [\App\Http\Controllers\Api\InstantBookingController::class, 'store']);
            Route::get('book-now/pending', [\App\Http\Controllers\Api\InstantBookingController::class, 'pending']);
            Route::get('book-now/{uuid}', [\App\Http\Controllers\Api\InstantBookingController::class, 'show']);
            Route::post('book-now/{uuid}/respond', [\App\Http\Controllers\Api\InstantBookingController::class, 'respondToRequest']);
            Route::post('book-now/{uuid}/select', [\App\Http\Controllers\Api\InstantBookingController::class, 'select']);
            Route::post('book-now/{uuid}/cancel', [\App\Http\Controllers\Api\InstantBookingController::class, 'cancel']);
            Route::post('book-now/{uuid}/retry', [\App\Http\Controllers\Api\InstantBookingController::class, 'retry']);
        });
    });

    Route::post('/payment-callback/paymaya/success', [PaymentApiController::class, 'success']);
    Route::post('/payment-callback/paymaya/failure', [PaymentApiController::class, 'failure']);
    Route::post('/payment-callback/paymaya/dropout', [PaymentApiController::class, 'dropout']);


    Route::post('/payment-callback/paymaya/checkout-success', [PaymentApiController::class, 'checkoutSuccess']);
    Route::post('/payment-callback/paymaya/checkout-failure', [PaymentApiController::class, 'checkoutFailure']);
    Route::post('/payment-callback/paymaya/checkout-dropout', [PaymentApiController::class, 'checkoutDropout']);
});
