<?php
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$kernel->handle($request = Illuminate\Http\Request::capture());

function jsonResponse($data, $code = 200) {
    http_response_code($code);
    header('Content-Type: application/json');
    echo json_encode($data);
    exit;
}

try {
    $email = $request->input('email');
    $language = $request->input('language', 'en');
    $recaptchaToken = $request->input('g-recaptcha-response');

    // Vérification reCAPTCHA v3 avec score et action
    if (!$recaptchaToken) {
        jsonResponse(['success' => false, 'message' => 'reCAPTCHA verification failed.'], 422);
    }
    $secret = env('RECAPTCHA_SECRET_KEY');
    $url = 'https://www.google.com/recaptcha/api/siteverify';
    $data = ['secret' => $secret, 'response' => $recaptchaToken];
    $options = [
        'http' => [
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($data)
        ]
    ];
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    $recaptchaSuccess = false;
    $score = 0;
    $action = '';
    if ($result !== false) {
        $result = json_decode($result, true);
        \Illuminate\Support\Facades\Log::info('reCAPTCHA response', $result);
        $recaptchaSuccess = $result['success'] ?? false;
        $score = $result['score'] ?? 0;
        $action = $result['action'] ?? '';
    }
    if (
        !$recaptchaSuccess ||
        $score < 0.5 ||
        $action !== 'send_code'
    ) {
        jsonResponse(['success' => false, 'message' => 'reCAPTCHA verification failed.'], 422);
    }

    if (!in_array($language, ['en', 'fr'])) {
        $language = 'en';
    }

    $msg = [
        'en' => [
            'invalid_email' => 'Invalid email.',
            'disposable' => 'Disposable email not allowed.',
            'already_registered' => 'Email already registered.',
            'queue_failed' => 'Failed to queue email.',
            'internal_error' => 'Internal error.',
            'max_send_exceeded' => 'Too many code requests. Please use the code already sent.',
            'cooldown' => 'Please wait at least 60 seconds before requesting a new code.',
            'rate_limit' => 'Too many requests. Please try again later.',
            'daily_limit' => 'Daily limit reached. Please try again tomorrow.',
        ],
        'fr' => [
            'invalid_email' => 'Adresse email invalide.',
            'disposable' => 'Les adresses email jetables ne sont pas autorisées.',
            'already_registered' => 'Cet email est déjà enregistré.',
            'queue_failed' => "Échec de l'ajout de l'email dans la file d'attente.",
            'internal_error' => 'Erreur interne.',
            'max_send_exceeded' => 'Trop de demandes de code. Veuillez utiliser le code déjà envoyé.',
            'cooldown' => 'Veuillez attendre au moins 60 secondes avant de demander un nouveau code.',
            'rate_limit' => 'Trop de requêtes. Veuillez réessayer plus tard.',
            'daily_limit' => 'Limite quotidienne atteinte. Veuillez réessayer demain.',
        ],
    ];
    $messages = $msg[$language];

    if (!$email || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        jsonResponse(['success' => false, 'message' => $messages['invalid_email']], 422);
    }

    if (class_exists(\App\Rules\RegistrationEmail::class)) {
        $rule = new \App\Rules\RegistrationEmail();
        if (!$rule->passes('email', $email)) {
            jsonResponse(['success' => false, 'message' => $messages['disposable']], 422);
        }
    }

    $userModel = class_exists('\App\Models\User') ? '\App\Models\User' : '\App\User';
    if ($userModel::where('email', $email)->exists()) {
        jsonResponse(['success' => false, 'message' => $messages['already_registered']], 422);
    }

    // Limites par IP
    $ip = $request->ip();
    $ipCountHour = \DB::table('registration_email_rate_limits')
        ->where('ip', $ip)
        ->where('created_at', '>=', now()->subHour())
        ->count();
    if ($ipCountHour >= 5) {
        jsonResponse(['success' => false, 'message' => $messages['rate_limit']], 429);
    }
    $ipCountDay = \DB::table('registration_email_rate_limits')
        ->where('ip', $ip)
        ->where('created_at', '>=', now()->subDay())
        ->count();
    if ($ipCountDay >= 10) {
        jsonResponse(['success' => false, 'message' => $messages['daily_limit']], 429);
    }

    // Vérification des limites par email
    $record = \App\Models\RegistrationEmailVerification::where('email', $email)->first();
    if ($record) {
        if ($record->expires_at < now()) {
            $record->delete();
            $record = null;
        }
    }
    if ($record) {
        if ($record->send_count >= 3) {
            jsonResponse(['success' => false, 'message' => $messages['max_send_exceeded']], 429);
        }
        if ($record->last_sent_at && $record->last_sent_at->diffInSeconds(now()) < 60) {
            jsonResponse(['success' => false, 'message' => $messages['cooldown']], 429);
        }
    }

    $code = random_int(100000, 999999);
    $hashedCode = password_hash((string)$code, PASSWORD_BCRYPT);

    \App\Models\RegistrationEmailVerification::updateOrCreate(
        ['email' => $email],
        [
            'code'            => $hashedCode,
            'verified'        => false,
            'expires_at'      => now()->addMinutes(10),
            'send_count'      => ($record ? $record->send_count + 1 : 1),
            'verify_attempts' => 0,
            'last_sent_at'    => now(),
        ]
    );

    // Enregistrement du rate limiting
    \DB::table('registration_email_rate_limits')->insert([
        'ip' => $ip,
        'email' => $email,
        'created_at' => now(),
    ]);

    // Purge aléatoire des vieilles entrées (1 chance sur 10)
    if (random_int(1, 10) === 1) {
        \DB::table('registration_email_rate_limits')
            ->where('created_at', '<', now()->subDay())
            ->delete();
    }

    try {
        \Illuminate\Support\Facades\DB::table('email_queue')->insert([
            'template_id' => 54,
            'params' => json_encode([
                'recipient_email' => $email,
                'email' => $email,
                'code' => $code,
                'minutes' => 10,
                'language' => $language,
            ]),
            'source' => 'worker',
            'attempts' => 0,
            'created_at' => now(),
            'updated_at' => now(),
        ]);
    } catch (\Exception $queueException) {
        \Illuminate\Support\Facades\Log::error('Email queue failed: '.$queueException->getMessage());
        jsonResponse(['success' => false, 'message' => $messages['queue_failed']], 500);
    }

    jsonResponse(['success' => true]);

} catch (\Exception $e) {
    \Illuminate\Support\Facades\Log::error('register-send-email-code error: '.$e->getMessage());
    jsonResponse(['success' => false, 'message' => ($msg['en']['internal_error'] ?? 'Internal error.')], 500);
}