<?php

namespace App\Service\Liform\Transformer;

use Limenius\Liform\FormUtil;
use Limenius\Liform\Transformer\AbstractTransformer;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Guess\Guess;

class StringTransformer extends AbstractTransformer
{
    public function transform(FormInterface $form, array $extensions = [], $widget = null)
    {
        $schema = ['type' => 'string'];
        $schema = $this->addCommonSpecs($form, $schema, $extensions, $widget);
        $schema = $this->addMaxLength($form, $schema);
        $schema = $this->addMinLength($form, $schema);

        return $this->addEmailContstraint($form, $schema);
    }

    /**
     * @param FormInterface $form
     * @param array         $schema
     *
     * @return array
     */
    protected function addMaxLength(FormInterface $form, array $schema)
    {
        if (null === $this->validatorGuesser) {
            return $schema;
        }

        $class = FormUtil::findDataClass($form);

        if (null === $class) {
            return $schema;
        }

        $maxLengthGuess = $this->validatorGuesser->guessMaxLength($class, $form->getName());
        $maxLength = $maxLengthGuess ? $maxLengthGuess->getValue() : null;

        if ($maxLength) {
            $schema['maxLength'] = $maxLength;
        }

        return $schema;
    }

    /**
     * @param FormInterface $form
     * @param array         $schema
     *
     * @return array
     */
    protected function addMinLength(FormInterface $form, array $schema)
    {
        if (null === $this->validatorGuesser) {
            return $schema;
        }

        $class = FormUtil::findDataClass($form);

        if (null === $class) {
            return $schema;
        }

        $minLengthGuess = $this->validatorGuesser->guessMinLength($class, $form->getName());
        $minLength = $minLengthGuess ? $minLengthGuess->getValue() : null;

        if ($minLength) {
            $schema['minLength'] = $minLength;
        }

        return $schema;
    }

    /**
     * @param FormInterface $form
     * @param array         $schema
     *
     * @return array
     */
    protected function addEmailContstraint(FormInterface $form, array $schema)
    {
        if (null === $this->validatorGuesser) {
            return $schema;
        }

        $class = FormUtil::findDataClass($form);

        if (null === $class) {
            return $schema;
        }

        $emailGuess = $this->validatorGuesser->guessType($class, $form->getName());

        $email = $emailGuess && $emailGuess->getConfidence() >= Guess::MEDIUM_CONFIDENCE ? $emailGuess->getType() : null;

        if ($email) {
            $schema['format'] = 'email';
        }

        return $schema;
    }
}
