// Store this script in templates/<your-template>/js/rsform-preview.js

/**
 * Create the Review Field based on array with questions
 *
 * @param formIdValue
 * @param previewPageNumber
 * @param totalPages
 * @param validateOnChangingPage
 */
function previewBeforeSubmit(formIdValue, previewPageNumber, totalPages, validateOnChangingPage) {
  /**
   * Object with items to be filled on review
   * [key] should be present as a `<dl id=[key]></dl>` in form field with name = formReview
   * [value] is an array of items that should return in the review list
   * @type {{reviewFormTrainer: string[], reviewFormPractical: string[]}}
   */
  var blocks = {
    'previewFormHeader': [
      'FullName',
      'Email'
    ],
    'previewFormCompany':
      [
        'CompanySize',
        'Position'
      ]
    ,
    'previewFormContact':
      [
        'ContactBy',
        //'ContactWhen'
      ]
  };

  if (previewPageNumber === 3) {
    for (const key in blocks) {
      if (blocks.hasOwnProperty(key)) {
        const questions = blocks[key];

        // Clean preview block
        document.getElementById(key).innerHTML = '';

        // Render Questions
        renderQuestions(key, questions);

        // Cleanup Block if empty
        cleanupEmptyBlock(key);
      }
    }
  }
  rsfp_changePage(formIdValue, previewPageNumber, totalPages, validateOnChangingPage);
}

/**
 * Check if given id is shown or not
 *
 * @param id
 * @returns {boolean}
 */
function isShown(id) {
  var sanitizedId = id.replaceAll('_', '-')
    .replaceAll('--', '-')
    .toLowerCase();
  var elem = document.querySelector('.rsform-block-' + sanitizedId);

  if (!elem) {
    return false;
  }

  return (elem.style.display !== 'none');
}

/**
 * Return the field type of given id
 *
 * @param id
 * @returns {string|boolean}
 */
function getFieldType(id) {
  var element = document.getElementById(id);
  if (!element) {
    element = document.getElementsByName(`form[${id}][]`);
    if (element.length > 0) {
      return 'checkbox';
    }

    element = document.getElementsByName(`form[${id}]`);
    if (element.length > 0) {
      return 'radio';
    }

    return false;
  }

  var tagName = element.tagName.toLowerCase();
  if (tagName !== 'input') {
    return tagName;
  }
  return element.getAttribute('type')
    .toLowerCase();
}

/**
 * Return the field label of given id
 *
 * @param id
 * @param type
 * @returns {string}
 */
function getFieldLabel(id, type = '') {
  let element = '';

// type = radio or checkbox
  if (type === 'radio' || type === 'checkbox') {
    let elementName = `form[${id}]`;

    if (type === 'checkbox') {
      elementName += '[]';
    }

    element = document.getElementsByName(elementName)[0];
  }

// type = textarea, text
  const inputTypes = ['textarea', 'text', 'file', 'email', 'number', 'select'];
  if (inputTypes.indexOf(type) >= 0) {
    element = document.getElementById(id);
  }

  if (!element) {
    return '';
  }

  return element.closest('.rsform-block').firstElementChild.textContent;
}

/**
 * Return the field value of given id
 *
 * @param id
 * @param type
 * @returns {*[]|number}
 */
function getFieldValue(id, type = '') {
  // type = radio or checkbox
  if (type === 'radio' || type === 'checkbox') {
    let i;
    let elementName = `form[${id}]`;
    let outputChoice = [];
    if (type === 'checkbox') {
      elementName += '[]';
    }

    for (i = 0; i < document.getElementsByName(elementName).length; i++) {
      if (document.getElementById(id + i).checked) {
        outputChoice.push(document.getElementById(id + i).value);
      }
    }

    return outputChoice;
  }
  
  // type = select
  if (type === 'select') {
    var outputSelect = [];
    var select = document.getElementById(id);

    outputSelect.push = select.options[select.selectedIndex].value;

    return outputSelect;
  }
  
  // type = file
  if (type === 'file') {
    var outputFile = [];
    var files = document.getElementById(id).files;

    for (var k = 0; k < files.length; k++) {
      outputFile.push(files[k].name);
    }

    return outputFile;
  }

  // type = textarea, text, email, number
  var inputTypes = ['textarea', 'text', 'email', 'number'];
  if (inputTypes.indexOf(type) >= 0) {
    var output = [];
    output.push(document.getElementById(id).value);

    return output;
  }

  return [];
}

/**
 *
 * @param id
 * @param questions
 */
function renderQuestions(id, questions) {
  questions.forEach(function (question) {
    if (isShown(question)) {
      addRow(
        getFieldLabel(question, getFieldType(question)),
        getFieldValue(question, getFieldType(question)),
        id
      );
    }
  });
}

/**
 * Hide Title and Block when the latter is empty
 *
 * @param id
 */
function cleanupEmptyBlock(id) {
  var element = document.getElementById(id);
  if (!element) {
    return;
  }

  if (element.innerHTML !== '') {
    return;
  }

  element.previousElementSibling.style.display = 'none';
  element.style.display = 'none';
}

/**
 * Add new row to definition list
 *
 * @param fieldLabel  string
 * @param fieldValues array
 * @param elementId   string
 */
function addRow(fieldLabel, fieldValues, elementId = 'reviewFormTrainer') {
  if (Array.isArray(fieldValues) && !fieldValues.length) {
    return;
  }

  var DL = document.getElementById(elementId);

  // Cleanup field Label
  fieldLabel = fieldLabel.replace('<strong class="formRequired">*</strong>', '');
  var elementDT = document.createElement('dt');
  elementDT.innerHTML = fieldLabel;
  DL.appendChild(elementDT);

  fieldValues.forEach(function (fieldValue) {
    var elementDD = document.createElement('dd');
    elementDD.innerHTML = fieldValue;
    DL.appendChild(elementDD);
  });
}


/**
 * 
 * - edit Joomla Administrator > Components > RSForm! Pro > RSForm! Pro Multipage example
 * 
 * # Adjust Fields
 * - add new field 
 *   - type = `Pagebreak`
 *   - name = `Page3`
 * - add New Row after added PageBreak
 * - move fields _Submit_ and _Footer_ to newly created row
 * - add new field 
 *   - type = `Free Text`
 *   - name = `previewForm`
 *   - HTML = 
 *   ```
 * <div id="previewForm">
 *   <h3>Header</h3>
 *   <dl id="previewFormHeader">
 *   </dl>
 *   <h3>Company</h3>
 *   <dl id="previewFormCopany">
 *   </dl>
 *   <h3>Contact</h3>
 *   <dl id="previewFormContact">
 *   </dl>
 * </div>
 *   ```
 *   - move new field before `Submit`
 *   
 * # Call to script  
 * - Form Properties > Scripts > PHP Scripts > Script called on form display
 * - ```
 * use Joomla\CMS\HTML\HTMLHelper;
 * HTMLHelper::_('script', 'rsform-preview.js', ['version' => 'auto', 'relative' => true]);
 * ```
 * 
 * # Trigger the script
 * - Form Properties > Scripts > PHP Scripts > Script called on form display
 * - ```
 * $formLayout = str_replace('rsfp_changePage(','previewBeforeSubmit(',$formLayout);
 * ```
 * 
 * note: this example does not cover the Date field yet
 **/