importVisualforceRemoting();

var selectedDonorType = "individual";

function donorInformationIsValid_sResource() {
  var fieldErrorCount = 0;
  var returnVal = false;

  if (selectedReceiptType == 'Acknowledge/Receipt CRA Donation (Send)' ) {
    donor_Street.classList.add("is_required");
    donor_City.classList.add("is_required");
    donor_StateProvince.classList.add("is_required");
    donor_PostalCode.classList.add("is_required");
  } else if (donorAddressIsRequired != true) {
    donor_Street.classList.remove("is_required");
    donor_City.classList.remove("is_required");
    donor_StateProvince.classList.remove("is_required");
    donor_PostalCode.classList.remove("is_required");
  }

  if (selectedDonorType == 'individual') {  var inputTextFields = payment_information_tab.getElementsByClassName('ind_inputfield');
    } else {  var inputTextFields = payment_information_tab.getElementsByClassName('org_inputfield');
  }

  console.log('selectedReceiptType:' + selectedReceiptType);
  for (var i = 0; i < inputTextFields.length; i++) {
      if (inputTextFields.item(i).classList.contains('is_required')) {
        console.log('REQUIRED: donorInformationIsValid: ' + inputTextFields.item(i).name + ', ' + inputTextFields.item(i).value + ', ' + inputTextFields.item(i).type);
        if (fieldIsNotValid(inputTextFields.item(i), inputTextFields.item(i).type, 'required')) { fieldErrorCount++; }
      } else if (inputTextFields.item(i).type == 'email') {
          console.log('EMAIL: donorInformationIsValid: ' + inputTextFields.item(i).name + ', ' + inputTextFields.item(i).type);
          if (fieldIsNotValid(inputTextFields.item(i), inputTextFields.item(i).type, 'optional')) { fieldErrorCount++; }
      } else if ((inputTextFields.item(i).value === undefined || inputTextFields.item(i).value.trim() === "") && (inputTextFields.item(i).name == 'companyContact_FirstName' || inputTextFields.item(i).name == 'companyContact_LastName') 
          && (selectedReceiptType === "Acknowledge CRA Donation (Send)" || selectedReceiptType === "Acknowledge/Receipt CRA Donation (Send)"
          || selectedReceiptType === "Acknowledge Recurring Donation (Send)" || selectedReceiptType === "Acknowledge IRS Donation (Send)"
          || selectedReceiptType === "Acknowledge Recurring Donation (Send)" )) { 
            console.log('CHECK: donorInformationIsValid: ' + inputTextFields.item(i).name + ', ' + inputTextFields.item(i).type);
            if (fieldIsNotValid(inputTextFields.item(i), inputTextFields.item(i).type, 'optional')) { fieldErrorCount++; }
            inputTextFields.item(i).style.borderColor = 'red';
            console.log('email field blank but Acknowledgement Type needs email:' + inputTextFields.item(i).value + 'valid: ' + returnVal);
      } else if ((inputTextFields.item(i).value === undefined || inputTextFields.item(i).value.trim() === "") && (inputTextFields.item(i).name == 'companyContact_FirstName' || inputTextFields.item(i).name == 'companyContact_LastName' || inputTextFields.item(i).name == 'companyContact_Email') 
          && (selectedReceiptType === "Acknowledge Later" )) { 
            console.log('CHECK: donorInformationIsValid: ' + inputTextFields.item(i).name + ', ' + inputTextFields.item(i).type);
            inputTextFields.item(i).style.borderColor = 'var(--primaryThemeColor)';
          }
        else{
          inputTextFields.item(i).style.borderColor = 'var(--primaryThemeColor)';
        }
  }

  if (fieldErrorCount == 0) { returnVal = true; }
  console.log('fieldErrorCount: '+fieldErrorCount);
  return returnVal;
} // end donorInformationIsValid_sResource

function createNewStripeCharge_sResource(stripeToken, transactionRecordId, amount, chargeDescription) {
  var newStripeChargeInfo = {};
    newStripeChargeInfo.token = stripeToken;
    newStripeChargeInfo.newTransactionRecordId = transactionRecordId;
    newStripeChargeInfo.amount = amount;
    newStripeChargeInfo.chargeDescription = chargeDescription;
    newStripeChargeInfo.formPaymentProcessorId = formPaymentProcessorId;
    newStripeChargeInfo.chargeCurrency = chargeCurrency;
    newStripeChargeInfo.logTraceId = logTraceId;
  var newStripeChargeInfoJSON = JSON.stringify(newStripeChargeInfo);

  Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.donationForm.createNewStripeChargeWithDescription}', newStripeChargeInfoJSON,
  // Visualforce.remoting.Manager.invokeAction(donationForm.createNewStripeChargeWithDescription, newStripeChargeInfoJSON,
    function (stripeChargeWithDescriptionVal, event) {
      if (event.status) {
        var newChargeStatus = stripeChargeWithDescriptionVal.returnVal;
        var stripeCustomerId = '';
        if (newChargeStatus == 'succeeded' || newChargeStatus == 'paid') {
          createFormSubmission(transactionRecordId);
        } else {
          hide("donateNowSpinner"); show("stripeResultFailPage");
          stripeResultFailPage.innerHTML = newChargeStatus;
          stripeResultFailPage.setAttribute("align", "center");
          stripeResultFailPage.style.color = 'red';
        }
      } else if (event.type === 'exception') { responseErrors.innerHTML = event.message + "<br/>\n<pre>" + event.where + "</pre>";
      } else { responseErrors.innerHTML = event.message; } }, { escape: true }
  );
} // end createNewStripeCharge_sResource

function newTransactionRecord_sResource(transactionType, selectedDonationFrequency, stripeToken, amount, taxAmountVal, chargeDescription) {
  var newTransactionRecordInfo = {};
  newTransactionRecordInfo.transactionType = transactionType;
  newTransactionRecordInfo.chargeDescription = chargeDescription;
  newTransactionRecordInfo.taxAmount = taxAmountVal;
  newTransactionRecordInfo.logTraceId = logTraceId;
  var newTransactionRecordJSON = JSON.stringify(newTransactionRecordInfo);
  // Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.css_fm2__donationForm.newTransactionRecord}', newTransactionRecordJSON,
  // Visualforce.remoting.Manager.invokeAction(donationForm.newTransactionRecord, newTransactionRecordJSON,
  donationForm.newTransactionRecord( newTransactionRecordJSON,
  function (transactionRecord, event) {
      transactionRecordId = transactionRecord.transactionRecordId;
      if (event.status) {
        if (transactionType == 'Stripe Transaction' && selectedDonationFrequency == 'One-time') {
          createNewStripeCharge_sResource(stripeToken, transactionRecordId, amount, chargeDescription);
        } else if (transactionType == 'Stripe Transaction' && selectedDonationFrequency != 'One-time') {
          // do nothing for recurring donation - just return transactionRecordId
        } else {
          updateOfflineTransactionRecord(transactionRecordId);
        }
        return transactionRecordId;
      } else if (event.type === 'exception') {
        responseErrors.innerHTML = event.message + "<br/>\n<pre>" + event.where + "</pre>";
      } else { responseErrors.innerHTML = event.message; }
    }, { escape: true }
  );
} // end newTransactionRecord_sResource

function processPayment_sResource(paymentType) {
  var dFirstName, dlastName, dEmail;
  if (paymentType == 'Credit Card') {
    if (selectedDonorType == 'individual') {
      dFirstName = donor_FirstName.value;
      dlastName = donor_LastName.value;
      dEmail = donor_Email.value
    } else {
      dFirstName = "Organization";
      dlastName = organization_Name.value;
      dEmail = organization_Contact_Email.value;
    }
    var dName = dFirstName + ' ' + dlastName;
    
    event.preventDefault();
    if (selectedDonationFrequency == "One-time") {
      var chargeDescription = dName + " " + dEmail + " : one-time";
      stripe.createToken(card).then(function (result) {
        if (result.error) {
          // Inform the donor that there was an error.
            stripeCardErrors.innerHTML = result.error.message;
        } else {
          // Create Transaction record, Process Token and create Opportunity
            hide("stripePaymentDetails");
            show("donateNowSpinner");
            document.getElementById('payment_information_tab').style.opacity = 0.4;
            new_disable("stripeButton");
            new_disable("backButton");
            newTransactionRecord_sResource('Stripe Transaction', selectedDonationFrequency, result.token.id, donationAmount, taxAmountVal, chargeDescription);
        }
      });
    } else { // Recurring Donation
        var chargeDescription = dName + " " + dEmail + " : recurring";
        stripe.createToken(card).then(function (result) {
          if (result.error) {
            // Inform the donor that there was an error.
              stripeCardErrors.innerHTML = result.error.message;
          } else {
              show("donateNowSpinner");
              document.getElementById('payment_information_tab').style.opacity = 0.4;
              new_disable("stripeButton");
              new_disable("backButton");
              transactionRecordId = newTransactionRecord_sResource('Stripe Transaction', selectedDonationFrequency, '', donationAmount, taxAmountVal, chargeDescription);
              stripe.createPaymentMethod({ type: 'card', card: card, billing_details: { email: dEmail, }, }).then(stripePaymentMethodHandler);
              // should be passing transactionRecordId to stripePaymentMethodHandler (or running stripe.createPaymentMethod after we know newTransactionRecord is complete)
          }
      });
    }
  } else {
    show("donateNowSpinner");
    document.getElementById('payment_information_tab').style.opacity = 0.4;
    new_disable("stripeButton");
    new_disable("backButton");
    newTransactionRecord_sResource('Offline Transaction', selectedDonationFrequency, null, donationAmount, taxAmountVal, chargeDescription);
  }
} // end processPayment_sResource

function setupStripePAD_sRecource() {
  //   console.log('setupStripePAD_sRecource');

  //   var form = document.getElementById('card-element');
  //   var accountholderName = 'ken klinger';                          //document.getElementById('accountholder-name');
  //   var email = 'ken@cloudstackservices.com';                       //document.getElementById('email');
  //   var submitButton = document.getElementById('stripeButton');
  //   var sKey = 'sk_test_cZrOkbbLo7LFThXWe9d1KFq2'; //submitButton.dataset.secret;
  //   var pKey = 'pk_test_2ptabNCBYXjibjNweXJ5l6I7'; //submitButton.dataset.secret;
  //   var stripe;
  //   var clientSecret = 'seti_1L5xFmLE4pshh23jTcx0a5sa_secret_LnYMlkvE7sMjWla5MAZjy3BWj7fnyE5';
  //   stripe = Stripe(pKey);

  //   // stripe.SetupIntent.create(
  //   //   payment_method_types=["acss_debit"],
  //   //   customer="cus_LYZoHdw3sFCFJf",
  //   //   payment_method_options={
  //   //     "acss_debit": {
  //   //       "currency": "cad",
  //   //       "mandate_options": {
  //   //         "payment_schedule": "interval",
  //   //         "interval_description": "First day of every month",
  //   //         "transaction_type": "personal",
  //   //       },
  //   //     },
  //   //   },
  //   // )

  //   // form.addEventListener('submit', function(event) {
  //   //   event.preventDefault();

  //     stripe.confirmAcssDebitSetup(clientSecret, {
  //       payment_method: {
  //         billing_details: {
  //           name: accountholderName,
  //           email: email,
  //         },
  //       },
  //     }).then(function(result) {
  //       if (result.error) {
  //         // Inform the customer that there was an error.
  //         console.log(result.error.message);
  //       } else {
  //         // Handle next step based on SetupIntent's status.
  //         console.log("SetupIntent ID: " + result.setupIntent.id);
  //         console.log("SetupIntent status: " + result.setupIntent.status);
  //       }
  //     });
  //   // });
} // setupStripePAD_sRecource

function importVisualforceRemoting() {
  console.log('importVisualforceRemoting');
  const script = document.createElement('script');
  script.src = '/soap/ajax/49.0/connection.js'; // Adjust the version number as needed
  script.type = 'text/javascript';
  script.onload = function() {
    console.log('importVisualforceRemoting - ready');
  };
  document.head.appendChild(script);
}