<?php

namespace App\Http\Controllers;

use App\Services\LcrhHelloWorkService;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\View\View;

class LcrhCareerController extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function index(Request $request): View
    {
        return view('careers');
    }

    public function offers(LcrhHelloWorkService $helloWork): JsonResponse
    {
        return response()->json([
            'ok' => true,
            'offers' => $helloWork->getOffers(),
        ]);
    }

    public function detail(string $id, LcrhHelloWorkService $helloWork): JsonResponse
    {
        return response()->json($helloWork->getDetail($id));
    }

    public function apply(Request $request): JsonResponse|RedirectResponse
    {
        // Même logique que le ContactController : honeypot, validation, Mailjet, gestion debug.
        if (filled($request->input('nice_field'))) {
            return $this->errorResponse(
                $request,
                "Merci d'accepter les conditions avant de procéder à l'envoi de votre candidature."
            );
        }

        $maxCvMb = (int) config('lcrh.cv.max_mb', 5);
        $extensions = config('lcrh.cv.extensions', ['pdf', 'doc', 'docx']);
        $mimes = config('lcrh.cv.mimes', []);

        $validator = Validator::make($request->all(), [
            'offer_title'    => ['nullable', 'string', 'max:255'],
            'offer_location' => ['nullable', 'string', 'max:160'],
            'fullname'       => ['required', 'string', 'min:2', 'max:160'],
            'email'          => ['required', 'email:rfc,dns', 'max:190'],
            'phone'          => ['nullable', 'string', 'max:50'],
            'message'        => ['nullable', 'string', 'max:5000', 'not_regex:/(https?:\/\/|www\.|ftp:\/\/|mailto:|@[a-z0-9._-]+\.[a-z]{2,})/i'],
            'cv'             => ['required', 'file', 'max:' . ($maxCvMb * 1024), 'mimes:' . implode(',', $extensions)],
            'accept'         => ['accepted'],
        ], [
            'fullname.required' => __('form.field.required'),
            'email.required' => "L'adresse email est obligatoire.",
            'email.email'    => "L'adresse email doit être au format <strong>adresse@domaine.com</strong>.",
            'email.max'      => "L'adresse email ne peut pas dépasser 190 caractères.",
            'message.not_regex' => "Le contenu de votre message ne doit pas contenir de lien ou de contenu assimilable à du SPAM.",
            'cv.required'    => 'Merci de joindre votre CV.',
            'cv.file'        => 'Le CV doit être un fichier valide.',
            'cv.max'         => 'CV trop volumineux (max ' . $maxCvMb . ' Mo).',
            'cv.mimes'       => 'Format de CV non autorisé (' . implode(', ', $extensions) . ').',
            'accept.accepted' => "Merci d'accepter les conditions avant de procéder à l'envoi de votre candidature.",
        ]);

        if ($validator->fails()) {
            return $this->errorResponse(
                $request,
                $validator->errors()->first(),
                $validator->errors()->toArray()
            );
        }

        $validated = $validator->validated();
        $cv = $request->file('cv');

        if (!empty($mimes) && !in_array($cv->getMimeType(), $mimes, true)) {
            return $this->errorResponse($request, 'Le fichier ne semble pas être un CV valide.');
        }

        try {
            $mj = new \Mailjet\Client(
                env('MJ_APIKEY_PUBLIC'),
                env('MJ_APIKEY_PRIVATE'),
                true,
                ['version' => 'v3.1']
            );

            $application = (object) [
                'fullname' => $validated['fullname'],
                'email' => $validated['email'],
                'phone' => $validated['phone'] ?? null,
                'message' => $validated['message'] ?? null,
                'offer_title' => $validated['offer_title'] ?? null,
                'offer_location' => $validated['offer_location'] ?? null,
            ];

            $subject = 'Candidature'
                . (!empty($application->offer_title) ? ' — ' . $application->offer_title : '')
                . (!empty($application->offer_location) ? ' — ' . $application->offer_location : '');

            $message = [
                'From' => [
                    'Email' => config('lcrh.mail.from.email'),
                    'Name' => config('lcrh.mail.from.name'),
                ],
                'To' => [[
                    'Email' => config('lcrh.mail.to.email'),
                    'Name' => config('lcrh.mail.to.name'),
                ]],
                'ReplyTo' => [
                    'Email' => $application->email,
                    'Name' => $application->fullname,
                ],
                'Subject' => $subject,
                'HTMLPart' => view('email.career-application-submited', [
                    'application' => $application,
                ])->render(),
                'Attachments' => [[
                    'ContentType' => $cv->getMimeType() ?: 'application/octet-stream',
                    'Filename' => $cv->getClientOriginalName(),
                    'Base64Content' => base64_encode(file_get_contents($cv->getRealPath())),
                ]],
            ];

            $bcc = config('lcrh.mail.bcc', []);
            if (!empty($bcc)) {
                $message['Bcc'] = array_map(
                    static fn (string $email): array => ['Email' => $email],
                    $bcc
                );
            }

            $response = $mj->post(\Mailjet\Resources::$Email, [
                'body' => ['Messages' => [$message]],
            ]);

            if (!$response->success()) {
                return $this->errorResponse(
                    $request,
                    "Nous sommes désolés, votre candidature n'a pas pu être envoyée.<br/>Merci de réessayer ultérieurement ou de <a href=\"mailto:" . config('lcrh.mail.to.email') . "?subject=Candidature%20depuis%20le%20site%20internet\">nous contacter directement</a>."
                );
            }
        } catch (\Exception $ex) {
            if (App::hasDebugModeEnabled()) {
                throw $ex;
            }

            return $this->errorResponse(
                $request,
                "Votre candidature n'a pas pu être envoyée.<br/>Merci de réessayer ultérieurement."
            );
        }

        return $this->successResponse(
            $request,
            "Merci pour votre candidature.<br/>Nous vous recontacterons dans les plus brefs délais !<br/><br/><em><strong>LE CABINET RH - LCRH</strong></em>"
        );
    }

    private function errorResponse(Request $request, string $message, array $errors = [], int $status = 422): JsonResponse|RedirectResponse
    {
        if ($request->expectsJson()) {
            return response()->json([
                'ok' => false,
                'message' => $message,
                'errors' => $errors,
            ], $status);
        }

        return back()
            ->with('message_error', $message)
            ->withErrors($errors)
            ->withInput();
    }

    private function successResponse(Request $request, string $message): JsonResponse|RedirectResponse
    {
        if ($request->expectsJson()) {
            return response()->json([
                'ok' => true,
                'message' => $message,
            ]);
        }

        return redirect()
            ->route('careers')
            ->with('message_success', $message);
    }
}
