function testGetFormArrangements()
 {
     $plugin = new Arrangement();
     $arrangements = $plugin->getArrangementsForContactForm('demo', 1);
     $this->assertGreaterThan(0, count($arrangements), 'Existing contact form should return a non-empty array');
 }
    /**
     * Generate a contact form
     *
     * @param int $formID
     * @param array $formFields
     * @param array $options
     *
     * @return string
     */
    public static function generateForm($formID, $formFields, $options)
    {
        $arrangementen = [];
        $html = '';
        if ($options['formTitle']) {
            $html .= '<h2>' . $options['formTitle'] . '</h2>';
        }
        // Contact forms need a unique ID, otherwise problems occur when you have multiple of the same forms on one page
        $generatedFormID = uniqid('F' . $formID);
        $html .= '<form class="recras-contact" id="recras-form' . $generatedFormID . '" data-formid="' . $formID . '">';
        $html .= self::generateStartTag($options['element']);
        foreach ($formFields as $field) {
            if ($field->soort_invoer !== 'header' && ($field->soort_invoer !== 'boeking.arrangement' || is_null($options['arrangement']))) {
                //TODO: this fails when arrangement is set but invalid
                $html .= self::generateLabel($options['element'], $field, $options['showLabels']);
                if ($field->verplicht && $options['showLabels']) {
                    $html .= '<span class="recras-required">*</span>';
                }
            }
            switch ($field->soort_invoer) {
                case 'boeking.arrangement':
                    // It is possible that an arrangement was valid for this contact form in the past, not not in the present.
                    // So we show only arrangements that are valid for this form.
                    if (empty($arrangementen)) {
                        $classArrangement = new Arrangement();
                        $arrangementen = $classArrangement->getArrangementsForContactForm($options['subdomain'], $formID);
                    }
                    // The  isset()  is in case an arrangement is set, but it is not valid
                    if (is_null($options['arrangement']) || !isset($arrangementen[$options['arrangement']])) {
                        $html .= self::generateSubTag($options['element']) . self::generateSelect($field, $arrangementen, ['placeholder' => $options['placeholders']]);
                    } else {
                        $html .= self::generateInput($field, ['placeholder' => $options['placeholders'], 'type' => 'hidden', 'value' => $options['arrangement']]);
                    }
                    break;
                case 'boeking.datum':
                    $html .= self::generateSubTag($options['element']) . self::generateInput($field, ['class' => 'recras-input-date', 'pattern' => '[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])', 'placeholder' => 'yyyy-mm-dd', 'type' => 'date']);
                    break;
                case 'boeking.groepsgrootte':
                    $html .= self::generateSubTag($options['element']) . self::generateInput($field, ['placeholder' => $options['placeholders'], 'raw' => ['min' => 1], 'type' => 'number']);
                    break;
                case 'boeking.starttijd':
                    $html .= self::generateSubTag($options['element']) . self::generateInput($field, ['class' => 'recras-input-time', 'pattern' => '(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9])', 'placeholder' => 'hh:mm', 'type' => 'time']);
                    break;
                case 'contactpersoon.geslacht':
                    $html .= self::generateSubTag($options['element']) . self::generateSelect($field, ['onbekend' => __('Unknown', Plugin::TEXT_DOMAIN), 'man' => __('Male', Plugin::TEXT_DOMAIN), 'vrouw' => __('Female', Plugin::TEXT_DOMAIN)], ['placeholder' => $options['placeholders']]);
                    break;
                case 'header':
                    if (strpos($html, '<dt') !== false || strpos($html, '<li') !== false || strpos($html, '<tr') !== false) {
                        $html .= self::generateEndTag($options['element']);
                    }
                    $html .= '<h3>' . $field->naam . '</h3>';
                    if (strpos($html, '<dt') !== false || strpos($html, '<li') !== false || strpos($html, '<tr') !== false) {
                        $html .= self::generateStartTag($options['element']);
                    }
                    break;
                case 'keuze':
                    $keuzes = [];
                    foreach ($field->mogelijke_keuzes as $keuze) {
                        $keuzes[$keuze] = $keuze;
                    }
                    $html .= self::generateSubTag($options['element']) . self::generateChoices($field, $keuzes);
                    break;
                case 'veel_tekst':
                    $html .= self::generateSubTag($options['element']) . self::generateTextarea($field, ['placeholder' => $options['placeholders']]);
                    break;
                default:
                    $html .= self::generateSubTag($options['element']) . self::generateInput($field, ['placeholder' => $options['placeholders']]);
            }
            //$html .= print_r($field, true); //DEBUG
        }
        $plugin = new Plugin();
        $html .= self::generateEndTag($options['element']);
        $html .= '<input type="submit" value="' . $options['submitText'] . '">';
        $html .= '</form>';
        $html .= '<script>jQuery(document).ready(function(){
    jQuery("#recras-form' . $generatedFormID . '").on("submit", function(e){
        e.preventDefault();
        return submitRecrasForm(
            "' . $generatedFormID . '",
            "' . $options['subdomain'] . '",
            "' . $plugin->baseUrl . '/",
            "' . $options['redirect'] . '"
        );
    });
});</script>';
        return $html;
    }