<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <h1 style="text-align: center;">Facebook Login/Signup FirebaseUI Tests</h1>
  <!--Have created google button using existing UI CSS styles and SVG icon file-->
  <div id="firebaseui-auth-container"></div>
  <div id="loader">Loading...</div>
  <title>Log in</title>
  <!-- update the version number as needed -->
  <link type="text/css" rel="stylesheet" href="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.css" />
  <style media="screen">
    body {
      background: #ECEFF1;
      color: rgba(0, 0, 0, 0.87);
      font-family: Roboto, Helvetica, Arial, sans-serif;
      margin: 0;
      padding: 0;
    }

    #message {
      background: white;
      max-width: 360px;
      margin: 100px auto 16px;
      padding: 32px 24px;
      border-radius: 3px;
    }

    #message h2 {
      color: #ffa100;
      font-weight: bold;
      font-size: 16px;
      margin: 0 0 8px;
    }

    #message h1 {
      font-size: 22px;
      font-weight: 300;
      color: rgba(0, 0, 0, 0.6);
      margin: 0 0 16px;
    }

    #message p {
      line-height: 140%;
      margin: 16px 0 24px;
      font-size: 14px;
    }

    #message a {
      display: block;
      text-align: center;
      background: #039be5;
      text-transform: uppercase;
      text-decoration: none;
      color: white;
      padding: 16px;
      border-radius: 4px;
    }

    #message,
    #message a {
      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
    }

    #load {
      color: rgba(0, 0, 0, 0.4);
      text-align: center;
      font-size: 13px;
    }

    @media (max-width: 600px) {

      body,
      #message {
        margin-top: 0;
        background: white;
        box-shadow: none;
      }

      body {
        border-top: 16px solid #ffa100;
      }
    }
  </style>
</head>

<body>
  <script src="/__/firebase/7.21.1/firebase-app.js"></script>
  <!-- include only the Firebase features as you need -->
  <script src="/__/firebase/7.21.1/firebase-auth.js"></script>
  <script src="/__/firebase/7.21.1/firebase-database.js"></script>
  <script src="/__/firebase/7.21.1/firebase-messaging.js"></script>
  <script src="/__/firebase/7.21.1/firebase-storage.js"></script>
  <!-- initialize the SDK after all desired features are loaded -->
  <script src="/__/firebase/init.js"></script>
  <script src="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.js"></script>
  <script src="https://thunkable.github.io/webviewer-extension/thunkableWebviewerExtension.js"
    type="text/javascript"></script>

  <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
  <script>

    let pw = ""//password variable to pass to Thunkuable login block along with email
    $(document).ready(function () {//listens for and gets password input field if password is selected as a provider.
      const elementToObserve = document.getElementById("firebaseui-auth-container")
      const observer = new MutationObserver(function () {//observer function
        let passinput = document.getElementsByName('password')[0]//Signin Password input field
        let passinput2 = document.getElementsByName('newPassword')[0]//Signup input password field
        //console.log(passinput2)
        if (passinput) {
          passinput.addEventListener('input', updateValue);//'input' option works best for async reasons of loading global pw variable
          function updateValue(e) {
            pw = e.target.value;
          }
        }
        if (passinput2) {
          passinput2.addEventListener('input', updateValue2);
          function updateValue2(e) {
            pw = e.target.value;
          }
        }
      });
      observer.observe(elementToObserve, { subtree: true, childList: true });
    })
    var ui = new firebaseui.auth.AuthUI(firebase.auth());
    var uiConfig = {
      callbacks: {
        signInSuccessWithAuthResult: function (authResult, redirectUrl) {
          ProcessResults(authResult)//This is our function below
          return false;
        },
        uiShown: function () {
          // The widget is rendered.
          // Hide the loader.
          document.getElementById('loader').style.display = 'none'; //this causes null error
        }
      },
      signInSuccessUrl: '<url-to-redirect-to-on-success>',
      signInOptions: [
        {
          provider: firebase.auth.FacebookAuthProvider.PROVIDER_ID,
          scopes: [
            'instagram_basic',//requires Facebook app review
            'user_link',
            'public_profile',
            'email'//This is the one we need and it is provided by default
          ],
          //customParameters: {
          // Forces password re-entry.
          //   auth_type: 'reauthenticate'
          // }
        },
        // firebase.auth.TwitterAuthProvider.PROVIDER_ID, // Twitter does not support scopes.
        firebase.auth.EmailAuthProvider.PROVIDER_ID, // Other providers don't need to be given as object.
        //firebase.auth.PhoneAuthProvider.PROVIDER_ID,
        //firebase.auth.GoogleAuthProvider.PROVIDER_ID// Google won't work in web viewers
      ],
      // Terms of service url.
      tosUrl: '<your-tos-url>',
      // Privacy policy url.
      privacyPolicyUrl: '<your-privacy-policy-url>'
    };
    ui.start('#firebaseui-auth-container', uiConfig);//load firebaseui
    function ProcessResults(result) {
      console.log(result)
      if (result.additionalUserInfo.isNewUser === true) {//First Time Signup: Link Thunkable email login, create User database node and pass results to nodeJS
        if (result.additionalUserInfo.providerId !== "password") {//can't link email type accounts to email type account
          pw = result.user.refreshToken//this could also be a random generated or short access lived token
          pw = pw.slice(pw.length - 8, pw.length)//create a password as last 8 characters of Refresh token
          var credential = firebase.auth.EmailAuthProvider.credential(result.user.email, pw);//this is what Thunkable will use to log in
          firebase.auth().currentUser.linkWithCredential(credential)//link the facebook account with email/password credentials
            .then(async function (usercred) {
              let user = usercred.user;
              console.log("Account linking success", user);
              ThunkableWebviewerExtension.postMessage(`success:${result.user.uid},${result.user.email},${pw}`)
            }).catch(function (error) {
              console.log("Account linking error", error);
              ThunkableWebviewerExtension.postMessage(`error:${error}`)
            });
        }
        else {
          ThunkableWebviewerExtension.postMessage(`success:${result.user.uid},${result.user.email},${pw}`)
        }//pw is loaded from observer function
      }
      else {//if existing user (sign in) then update the account with the new password of the linked auth and pass it to Thunkable
        if (result.additionalUserInfo.providerId !== "password") {
          let user = firebase.auth().currentUser;
          user.updatePassword(pw).then(() => {// Update successful.
            //console.log(`${result.user.uid},${result.user.email},${pw}`)
            ThunkableWebviewerExtension.postMessage(`success:${result.user.uid},${result.user.email},${pw}`)
          }, (error) => {
            console.error(error)
            ThunkableWebviewerExtension.postMessage(`error:${error}`)
          });
        }
        else {
          ThunkableWebviewerExtension.postMessage(`success:${result.user.uid},${result.user.email},${pw}`)
        }
      }
    }
  </script>
</body>
</html>