<?php

use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\ExpenseController;
use App\Http\Controllers\Api\FcmTokenController;
use App\Http\Controllers\Api\FinanceController;
use App\Http\Controllers\Api\FormController;
use App\Http\Controllers\Api\HrMobileController;
use App\Http\Controllers\Api\Integrations\RazorpayWebhookController;
use App\Http\Controllers\Api\Integrations\ZktecoAttendanceWebhookController;
use App\Http\Controllers\Api\LocationController;
use App\Http\Controllers\Api\MobileCompatController;
use App\Http\Controllers\Api\NotificationController;
use App\Http\Controllers\Api\PayrollBankExportController;
use App\Http\Controllers\Api\RecruitmentController;
use App\Models\PayrollCycle;
use Illuminate\Support\Facades\Route;
use Modules\Attendance\Http\Controllers\Api\AttendanceController;
use Modules\Employees\Http\Controllers\Api\EmployeeController;
use Modules\Leave\Http\Controllers\Api\LeaveController;
use Modules\Payroll\Http\Controllers\Api\PayrollController;
use Modules\SaaS\Http\Controllers\Api\SubscriptionController;

Route::post('hrms/login', [AuthController::class, 'login'])->middleware('throttle:auth-login');
Route::post('face/login', [MobileCompatController::class, 'faceLogin'])->middleware('throttle:face-login');

Route::post('integrations/zkteco/attendance', ZktecoAttendanceWebhookController::class)
    ->middleware(['biometric.device', 'throttle:zkteco-webhook'])
    ->name('api.integrations.zkteco.attendance');

Route::post('integrations/razorpay/webhook', RazorpayWebhookController::class)
    ->middleware('throttle:api')
    ->name('api.integrations.razorpay.webhook');

Route::prefix('auth')->group(function () {
    Route::post('login', [AuthController::class, 'login'])->middleware('throttle:auth-login');
    Route::post('two-factor/verify', [AuthController::class, 'verifyTwoFactor'])->middleware('throttle:auth-two-factor');
    Route::post('two-factor/resend', [AuthController::class, 'resendTwoFactor'])->middleware('throttle:auth-two-factor-resend');
    Route::post('register', [AuthController::class, 'register'])->middleware('throttle:auth-login');
    Route::post('forgot-password', [AuthController::class, 'forgotPassword'])->middleware('throttle:auth-login');
    Route::post('reset-password', [AuthController::class, 'resetPassword'])->middleware('throttle:auth-login');

    Route::middleware('auth:sanctum')->group(function () {
        Route::post('logout', [AuthController::class, 'logout'])->name('api.auth.logout');
        Route::post('delete-account', [AuthController::class, 'deleteAccount'])->name('api.auth.delete-account');

        Route::middleware('account.active')->group(function () {
            Route::get('user', [AuthController::class, 'user'])->name('api.auth.user');
            Route::post('fcm-token', [FcmTokenController::class, 'store'])->name('api.auth.fcm-token.store');
            Route::delete('fcm-token', [FcmTokenController::class, 'destroy'])->name('api.auth.fcm-token.destroy');
        });
    });
});

Route::middleware([
    'auth:sanctum',
    'account.active',
    'tenant.user',
    'tenant',
    'tenant.subscription',
    'tenant.permission',
    'tenant.module',
    'tenant.2fa',
    'throttle:api',
])->group(function () {
    Route::get('notifications/feed', [NotificationController::class, 'feed'])->name('api.notifications.feed');
    Route::post('notifications/{id}/read', [NotificationController::class, 'markRead'])->name('api.notifications.mark-read');
    Route::delete('notifications/{id}', [NotificationController::class, 'destroy'])->name('api.notifications.destroy');
    Route::post('notifications/mark-all-read', [NotificationController::class, 'markAllRead'])->name('api.notifications.mark-all-read');
    Route::apiResource('expenses', ExpenseController::class)->names('api.expenses')->only(['index', 'store', 'show']);
    Route::post('expenses/{expense}/status', [ExpenseController::class, 'updateStatus'])->name('api.expenses.update-status');
    Route::get('finance/home', [FinanceController::class, 'home'])->name('api.finance.home');
    Route::get('finance/self', [FinanceController::class, 'self'])->name('api.finance.self');
    Route::get('finance/team', [FinanceController::class, 'team'])->name('api.finance.team');
    Route::get('finance/operational', [FinanceController::class, 'operational'])->name('api.finance.operational');
    Route::get('finance/my-advances', [FinanceController::class, 'myAdvances'])->name('api.finance.my-advances');
    Route::get('recruitment/home', [RecruitmentController::class, 'home'])->name('api.recruitment.home');
    Route::get('recruitment/open-roles', [RecruitmentController::class, 'openRoles'])->name('api.recruitment.open-roles');
    Route::get('recruitment/my-interviews', [RecruitmentController::class, 'myInterviews'])->name('api.recruitment.my-interviews');
    Route::get('recruitment/my-referrals', [RecruitmentController::class, 'myReferrals'])->name('api.recruitment.my-referrals');
    Route::get('recruitment/my-referrals/{applicant}', [RecruitmentController::class, 'showReferral'])->name('api.recruitment.my-referrals.show');
    Route::post('recruitment/refer', [RecruitmentController::class, 'storeRefer'])->name('api.recruitment.refer.store');
    Route::get('recruitment/pipeline', [RecruitmentController::class, 'pipeline'])->name('api.recruitment.pipeline');
    Route::get('recruitment/referral-leaderboard', [RecruitmentController::class, 'referralLeaderboard'])->name('api.recruitment.referral-leaderboard');
    Route::get('forms', [FormController::class, 'index'])->name('api.forms.index');
    Route::get('forms/my-submissions', [FormController::class, 'mySubmissions'])->name('api.forms.my-submissions');
    Route::get('form-submissions', [FormController::class, 'submissionsIndex'])->name('api.form-submissions.index');
    Route::get('form-submissions/{formSubmission}', [FormController::class, 'submissionsShow'])->name('api.form-submissions.show');
    Route::get('forms/{form}', [FormController::class, 'show'])->name('api.forms.show');
    Route::post('forms/{form}/submit', [FormController::class, 'submit'])->name('api.forms.submit');
    Route::apiResource('employees', EmployeeController::class)->names('api.employees');
    Route::get('attendance/today', [AttendanceController::class, 'today'])->name('api.attendance.today');
    Route::get('attendance/policy', [AttendanceController::class, 'policy'])->name('api.attendance.policy');
    Route::get('attendance/settings', [AttendanceController::class, 'settings'])->name('api.attendance.settings');
    Route::put('attendance/settings', [AttendanceController::class, 'updateSettings'])->name('api.attendance.settings.update');
    Route::post('attendance/clock-in', [AttendanceController::class, 'clockIn'])->name('api.attendance.clock-in');
    Route::post('attendance/clock-out', [AttendanceController::class, 'clockOut'])->name('api.attendance.clock-out');
    Route::post('attendance/login', [AttendanceController::class, 'clockIn'])->name('api.attendance.login');
    Route::post('attendance/logout', [AttendanceController::class, 'clockOut'])->name('api.attendance.logout');
    Route::apiResource('attendance', AttendanceController::class)
        ->names('api.attendance')
        ->only(['index', 'show']);
    Route::get('hrm/today-attendance-details', [MobileCompatController::class, 'todayAttendanceDetails']);
    Route::get('self/summary-month', [MobileCompatController::class, 'summaryMonth']);
    Route::get('users', [MobileCompatController::class, 'listUsers']);
    Route::get('users/missing-faces', [MobileCompatController::class, 'usersMissingFaces']);
    Route::get('users/{id}', [MobileCompatController::class, 'showUser']);
    Route::post('face/attendance', [MobileCompatController::class, 'faceAttendance'])
        ->middleware('throttle:face-attendance')
        ->name('api.face.attendance');
    Route::get('face/sync', [MobileCompatController::class, 'faceSync'])->name('api.face.sync');
    Route::post('face/register', [MobileCompatController::class, 'faceRegister'])->name('api.face.register');
    Route::get('leave-types', [LeaveController::class, 'types'])->name('api.leave-types.index');
    Route::apiResource('leaves', LeaveController::class)->names('api.leaves');
    Route::post('leaves/{leave}/withdraw', [LeaveController::class, 'withdraw'])->name('api.leaves.withdraw');
    Route::post('leaves/{leave}/withdraw/review', [LeaveController::class, 'reviewWithdraw'])->name('api.leaves.withdraw.review');
    Route::post('leaves/{leave}/status', [LeaveController::class, 'updateStatus'])->name('api.leaves.update-status');
    Route::apiResource('locations', LocationController::class)->names('api.locations');
    Route::get('payroll/my-payslip', [PayrollController::class, 'myPayslip']);
    Route::get('payroll/cycles/{cycle}/bank-export', [PayrollBankExportController::class, 'download'])->name('api.payroll.bank-export');
    Route::get('payroll/v2/cycles/{cycle}/bank-export', fn (PayrollCycle $cycle) => redirect()->route('api.payroll.bank-export', $cycle, 301));
    Route::get('hr/resignations', [HrMobileController::class, 'resignations'])->name('api.hr.resignations');
    Route::get('hr/resignations/{resignation}', [HrMobileController::class, 'showResignation'])->name('api.hr.resignations.show');
    Route::get('hr/offboardings', [HrMobileController::class, 'offboardings'])->name('api.hr.offboardings');
    Route::get('hr/offboardings/{offboarding}', [HrMobileController::class, 'showOffboarding'])->name('api.hr.offboardings.show');
    Route::get('hr/performance-reviews', [HrMobileController::class, 'performanceReviews'])->name('api.hr.performance-reviews');
    Route::get('hr/performance-cycles', [HrMobileController::class, 'performanceCycles'])->name('api.hr.performance-cycles');
    Route::get('hr/deposits', [HrMobileController::class, 'deposits'])->name('api.hr.deposits');
    Route::get('hr/generated-letters', [HrMobileController::class, 'generatedLetters'])->name('api.hr.generated-letters');
    Route::get('hr/generated-letters/{generatedLetter}', [HrMobileController::class, 'showGeneratedLetter'])->name('api.hr.generated-letters.show');
    Route::get('hr/pre-payments', [HrMobileController::class, 'prePayments'])->name('api.hr.pre-payments');
    Route::post('hr/pre-payments', [HrMobileController::class, 'storePrePayment'])->name('api.hr.pre-payments.store');
    Route::get('payroll', [PayrollController::class, 'index'])->name('api.payroll.index');
    Route::get('payroll/{employeePayroll}', [PayrollController::class, 'show'])->name('api.payroll.show');
});

Route::prefix('subscription')->middleware(['auth:sanctum', 'tenant.user', 'tenant', 'subscription'])->group(function () {
    Route::get('status', [SubscriptionController::class, 'status']);
});
