<?php
namespace admin\Support\Forms;

use admin\ViewModels\Forms\FormEditViewModel;
use admin\ViewModels\Forms\FormFieldType;
use admin\Validation\FormValidator;

/**
 * Obsługa żądań formularza (POST, persist, walidacja)
 */
class FormRequestHandler
{
    private FormValidator $validator;

    public function __construct()
    {
        $this->validator = new FormValidator();
    }

    /**
     * Przetwarza żądanie POST formularza
     * 
     * @param FormEditViewModel $formViewModel
     * @param array $postData Dane z $_POST
     * @return array Wynik przetwarzania ['success' => bool, 'errors' => array, 'data' => array]
     */
    public function handleSubmit(FormEditViewModel $formViewModel, array $postData): array
    {
        $result = [
            'success' => false,
            'errors' => [],
            'data' => []
        ];

        // Walidacja
        $errors = $this->validator->validate($postData, $formViewModel->fields, $formViewModel->languages);
        
        if (!empty($errors)) {
            $result['errors'] = $errors;
            // Zapisz dane do persist przy błędzie walidacji
            if ($formViewModel->persist) {
                $formViewModel->saveToPersist($postData);
            }
            return $result;
        }

        // Przetwórz dane (np. konwersja typów)
        $processedData = $this->processData($postData, $formViewModel->fields);
        
        $result['success'] = true;
        $result['data'] = $processedData;
        
        // Wyczyść persist po sukcesie
        if ($formViewModel->persist) {
            $formViewModel->clearPersist();
        }

        return $result;
    }

    /**
     * Przetwarza dane z formularza (konwersja typów)
     */
    private function processData(array $postData, array $fields): array
    {
        $processed = [];

        foreach ($fields as $field) {
            $value = $postData[$field->name] ?? null;

            // Konwersja typów
            switch ($field->type) {
                case FormFieldType::SWITCH:
                    $processed[$field->name] = $value ? 1 : 0;
                    break;

                case FormFieldType::NUMBER:
                    $processed[$field->name] = $value !== null && $value !== '' ? (float)$value : null;
                    break;

                case FormFieldType::LANG_SECTION:
                    if ($field->langFields !== null) {
                        $processed[$field->name] = $this->processLangSection($postData, $field);
                    }
                    break;

                default:
                    $processed[$field->name] = $value;
            }
        }

        return $processed;
    }

    /**
     * Przetwarza sekcję językową
     */
    private function processLangSection(array $postData, $section): array
    {
        $result = [];
        
        if ($section->langFields === null) {
            return $result;
        }

        foreach ($section->langFields as $field) {
            $fieldName = $field->name;
            $langData = $postData[$fieldName] ?? [];

            foreach ($langData as $langId => $value) {
                if (!isset($result[$langId])) {
                    $result[$langId] = [];
                }

                // Konwersja typów dla pól językowych
                switch ($field->type) {
                    case FormFieldType::SWITCH:
                        $result[$langId][$fieldName] = $value ? 1 : 0;
                        break;
                    case FormFieldType::NUMBER:
                        $result[$langId][$fieldName] = $value !== null && $value !== '' ? (float)$value : null;
                        break;
                    default:
                        $result[$langId][$fieldName] = $value;
                }
            }
        }

        return $result;
    }

    /**
     * Przywraca dane z persist do POST (przy błędzie walidacji)
     */
    public function restoreFromPersist(FormEditViewModel $formViewModel): ?array
    {
        if (!$formViewModel->persist) {
            return null;
        }

        return $_SESSION['form_persist'][$formViewModel->formId] ?? null;
    }

    /**
     * Sprawdza czy żądanie jest submitowaniem formularza
     */
    public function isFormSubmit(string $formId): bool
    {
        return $_SERVER['REQUEST_METHOD'] === 'POST' && 
               (isset($_POST['_form_id']) && $_POST['_form_id'] === $formId);
    }
}
