<?php

namespace App\Services\Forms;

use App\Models\Form;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;

class FormSubmissionService
{
    /**
     * @return array<string, mixed>
     */
    public function validationRules(Form $form): array
    {
        $rules = [];
        foreach ($form->fields ?? [] as $index => $field) {
            $key = 'responses.field_' . $index;
            $type = (string) ($field['type'] ?? 'text');
            $required = (bool) ($field['required'] ?? false);

            if ($type === 'checkbox') {
                $rules[$key] = $required ? ['accepted'] : ['nullable', 'boolean'];
                continue;
            }

            if ($type === 'number') {
                $rules[$key] = $required ? ['required', 'numeric'] : ['nullable', 'numeric'];
                continue;
            }

            if ($type === 'date') {
                $rules[$key] = $required ? ['required', 'date'] : ['nullable', 'date'];
                continue;
            }

            $rules[$key] = $required ? ['required', 'string', 'max:5000'] : ['nullable', 'string', 'max:5000'];
        }

        return $rules;
    }

    /**
     * @param  array<string, mixed>  $input
     * @return list<array{label: string, type: string, value: mixed}>
     */
    public function validateAndNormalize(Form $form, array $input): array
    {
        $validator = Validator::make($input, $this->validationRules($form));
        if ($validator->fails()) {
            throw new ValidationException($validator);
        }

        $validated = $validator->validated();
        $responses = [];

        foreach ($form->fields ?? [] as $index => $field) {
            $value = data_get($validated, 'responses.field_' . $index);
            if (($field['type'] ?? '') === 'checkbox') {
                $value = (bool) $value;
            }
            $responses[] = [
                'label' => (string) ($field['label'] ?? 'Field'),
                'type' => (string) ($field['type'] ?? 'text'),
                'value' => $value,
            ];
        }

        return $responses;
    }
}
