<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\FormResponseRequest;
use App\Libs\Services\FormSubmissionService;
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;

class FormController extends Controller
{
    protected $formSubmissionService;

    public function __construct(FormSubmissionService $formSubmissionService)
    {
        $this->formSubmissionService = $formSubmissionService;
    }

    /**
     * Alternative submit endpoint that accepts form data directly
     * POST /api/forms/submit
     */
    public function submit(FormResponseRequest $request): JsonResponse
    {
        try {
            $data = $request->validated();

            // Sanitize formSlug for reCAPTCHA action (same rules as frontend)
            $sanitizedFormSlug = preg_replace('/[^A-Za-z\/_]/', '_', $data['formSlug'] ?? 'form_submit');

            $recaptcha = checkRecaptcha($data['tokenRecaptcha'], $sanitizedFormSlug);

            /* if (!$recaptcha) {
                throw ValidationException::withMessages([
                    'error' => ['Invalid Recaptcha'],
                ]);
            } */

            $result = $this->formSubmissionService->processSubmission(
                $data['formSlug'],
                $data['responses'],
            );

            return response()->json($result, 201);

        } catch (ValidationException $e) {
            // Identify fields whose only failed rule is `email` so the
            // frontend can render the bare message without appending the
            // generic "please contact ..." suffix.
            $errorsWithoutContact = [];
            $failed = $e->validator->failed();
            foreach ($failed as $field => $rules) {
                if (count($rules) === 1 && array_key_exists('Email', $rules)) {
                    $errorsWithoutContact[] = $field;
                }
            }

            return response()->json([
                'success' => false,
                'message' => 'Validation failed',
                'errors' => $e->errors(),
                'errorsWithoutContact' => $errorsWithoutContact,
            ], 422);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => $e->getMessage()
            ], 400);
        }
    }
}
