const silentLaunchDivId = 'silentLaunch';

var launcherDeviceId;

var isLaunchButtonsDebug = document.location.host.startsWith('cms-') || document.location.host.startsWith('v3-test-');

var launcherConfig = {}
function setupLauncher(ppid, fv, relaunchId, isPreInstalled) {
    launcherConfig.ppid = ppid;
    launcherConfig.fv = fv;
    launcherConfig.relaunchId = relaunchId;
    launcherConfig.isPreInstalled = isPreInstalled;

    
    document.body.classList.add(isAppInstalled() ? 'app-installed' : 'app-not-installed');
}

setupLauncher('','','2.9.2,2.18.1,3.16.0');

function loadJS(onLoad) {
    if (!document.getElementById('som-js')) {
        let searchParams = new URL(document.location).searchParams;
        let installed = searchParams.get("installed");
        let src = 'https://screenpal.com/api/som.js?androidEnabled=true&iosEnabled=true&chromeAppId=ofhomjgaaamjpmjogmkglfojkdlabekg&brand=screenpal';
        if (installed) {
            src += '&installed=' + encodeURIComponent(installed);
        }
        let somJsScript = document.createElement('script');
        somJsScript.id = 'som-js';
        somJsScript.src = src;
        document.getElementsByTagName('body')[0].appendChild(somJsScript);
        somJsScript.addEventListener('load', function() {
            let checkOpentip = function() {
                setTimeout(function() {
                    if (window.Opentip) {
                        onLoad();
                        return;
                    }
                    checkOpentip();
                },200);
            }
            checkOpentip();
        }, false);
        return;
    }

    onLoad();
}

/***** Starting recorder and opening the editor *****/
function getFV(useVersion) {
  if (!useVersion) {
    useVersion = '';
  }

  // If they are requesting version then we'll use it unless this is old mac...
  let b = navigator.userAgent.toLowerCase();

  if (b.indexOf("mac os x 10_7") > 0 || b.indexOf("mac os x 10.7") > 0) {
    return 'MAC-10.7';
  }

  if (b.indexOf("mac os x 10_8") > 0 || b.indexOf("mac os x 10.8") > 0) {
    return 'MAC-10.8';
  }

  return useVersion;
}

// Split n times where the last array element is all the rest (like java string split).
function splitStringWithRemainder(string,separator,n) {
    let split = string.split(separator);
    if (split.length <= n)
        return split;
    let out = split.slice(0,n-1);
    out.push(split.slice(n-1).join(separator));
    return out;
}

function updateParamsWithCommand(params, command) {
  if (command === 'manager') {
    params.options.sm = "true";
  }
  else if (command === 'screenshot') {
    params.options.runCommand = "takeScreenshotAskIfReady";
  }
  else if (command === 'recorder') {
    // Recorder is default so nothing to set in runCommand
  }
  else if (command.indexOf("editHostedId-") === 0) {
    params.options.editHostedId = command.substr("editHostedId-".length);
  }
  else if (command.indexOf("workflow-") === 0) {
    let args = splitStringWithRemainder(command,'-',3);
    params.options.workflowName = args[1];
    if (args.length>2)
        params.options.workflowUrl = args[2];
  }
  else {
    params.options.runCommand = command;
  }

  return params;
}

function launchRecorder(analyticsName, downloadPageUrl) {
  launchApp(analyticsName, 'recorder', downloadPageUrl);
}

function launchManager(analyticsName, downloadPageUrl) {
  launchApp(analyticsName, 'manager', downloadPageUrl);
}

function launchScreenshot(analyticsName, downloadPageUrl) {
  launchApp(analyticsName, 'screenshot', downloadPageUrl);
}

function launchStories(analyticsName, downloadPageUrl) {
  launchApp(analyticsName, 'workflow-createStory', downloadPageUrl);
}

function launchEditImage(analyticsName, downloadPageUrl) {
  launchApp(analyticsName, 'workflow-openImageManager', downloadPageUrl);
}

function launchEditVideo(analyticsName, downloadPageUrl) {
  launchApp(analyticsName, 'workflow-openVideoManager', downloadPageUrl);
}

function launchEditHosted(analyticsName, videoId) {
  launchApp(analyticsName, 'editHostedId-'+videoId);
}

function isAppInstalled() {
    return launcherConfig.isPreInstalled || localStorage.getItem('mark-installed');
}


function useDownloadPage() {
    let b = navigator.userAgent.toLowerCase();
    let isWin = b.indexOf("windows")>0;
    let isMac = b.indexOf("mac")>0 && b.indexOf("iphone")==-1 && b.indexOf("ipad")==-1 && (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints <= 1);
    let isFireFox = b.indexOf("firefox")>0;
    let isChrome = b.indexOf("chrome")>0 && /Google Inc/.test(navigator.vendor);

    if (isMac && !isChrome) {
        return false;
    }

    return !isAppInstalled() &&
           !isFireFox &&
           (isWin || isMac)
}

function launchApp(analyticsName, runcommand, downloadPageUrl) {
  let eventName = 'Mkg' + 'ButtonClick';
  let eventProps = {
    action: 'click',
    name: analyticsName
  };

  // Only fire if we're on a host where this is defined (ie won't be setup on CMS).
  if (typeof analyticsEvent === "function") {
    analyticsEvent(eventName, eventProps, null);
  }

  if (downloadPageUrl && useDownloadPage()) {
      window.location = downloadPageUrl;
      return;
  }

  
  let silentInstallDiv = document.getElementById(silentLaunchDivId);
  if (silentInstallDiv) {
      document.body.removeChild(silentInstallDiv);
  }

  loadJS(function(){
    let params = {
      id: 'som-0',
      type: 'bottom-bar',
      options:{"fv": getFV(launcherConfig.fv) }
    };

    if (runcommand) {
      params = updateParamsWithCommand(params, runcommand);
    }
    if (launcherConfig.ppid) {
      params.options.pp = launcherConfig.ppid;
    }
    if (launcherConfig.relaunchId) {
      params.options.relaunchId = launcherConfig.relaunchId;
    }
    if (launcherConfig.isPreInstalled) {
      params.options.installed = 'screenpal';
    }
    if (launcherDeviceId) {
      params.options.deviceId = launcherDeviceId;
    }

    SOM.Recorder(params).start();

    logLaunchButtonsDebug('Analytics for "' + eventName + '" would fire for: "' + analyticsName + '"');
  });
}

function downloadForRecorder() {
  downloadApp('recorder');
}

function downloadForManager() {
  downloadApp('manager');
}

function downloadForScreenshot() {
  downloadApp('screenshot');
}

function downloadForStories() {
  downloadApp('workflow-createStory');
}

function downloadForEditImage() {
  downloadApp('workflow-openImageManager');
}

function downloadApp(runcommand) {
  loadJS(function(){
    let installed = isAppInstalled();
    logLaunchButtonsDebug('Launching runcommand from downloadApp: "' + runcommand + '" with app installed: ' + installed);

    if (!installed && !document.getElementById(silentLaunchDivId)) {
      let silentLaunch = document.createElement('div');
      silentLaunch.id = silentLaunchDivId;
      silentLaunch.style.position = 'absolute';
      silentLaunch.style.width = '1px';
      silentLaunch.style.height = '1px';
      silentLaunch.style.opacity = 0;
      document.body.appendChild(silentLaunch);
    }

    let params = {
      id: 'som-0',
      type: installed ? 'bottom-bar' : 'in-div',
      element: installed ? undefined : '#'+silentLaunchDivId,
      options: {
          "fv": getFV(launcherConfig.fv),
          "forceDownload": true
      }
    };

    if (runcommand) {
      params = updateParamsWithCommand(params, runcommand);
    }
    if (launcherConfig.ppid) {
      params.options.pp = launcherConfig.ppid;
    }
    if (launcherConfig.relaunchId) {
      params.options.relaunchId = launcherConfig.relaunchId;
    }
    if (launcherConfig.isPreInstalled) {
      params.options.installed = 'screenpal';
    }
    if (launcherDeviceId) {
      params.options.deviceId = launcherDeviceId;
    }

    SOM.Recorder(params).start();
  });
}

function setupDownloadLink(type, link) {
    logLaunchButtonsDebug('Found download button for type "' + type + '"');

    link.addEventListener('click',(event)=>{
        event.preventDefault();
        downloadApp(type);
    });
}

function setupLaunchLink(type, link) {
    let analyticsName = 'Launch'+(type.charAt(0).toUpperCase()+type.slice(1));
    if (link.innerText.trim() !== '')
        analyticsName = link.innerText.trim();

    logLaunchButtonsDebug('Found launch button for type "' + type + '" with analyticsName "' + analyticsName + '"');

    link.addEventListener('click',(event)=>{
        event.preventDefault();
        launchApp(analyticsName,type);
    });
}

function setupLaunchWorkflowLink(link) {
    let workflowName = getWorkflowNameFromElementOrParents(link);

    let analyticsName = 'LaunchWorkflow'+(workflowName.charAt(0).toUpperCase()+workflowName.slice(1));
    if (link.innerText.trim() !== '')
        analyticsName = link.innerText.trim();

    let command = 'workflow-' + workflowName;

    let url = 'NONE';
    if (link.href !== '' && !link.href.endsWith('#') && !link.href.startsWith('#') && link.href !== 'https://themify.me/') {
        url = link.href;
        command += '-' + url;
    }

    logLaunchButtonsDebug('Found launch button for workflow "' + workflowName + '" with analyticsName "' + analyticsName + '" and url="' + url + '"');

    link.addEventListener('click',(event)=>{
        event.preventDefault();
        launchApp(analyticsName, command);
    });
}

function getWorkflowNameFromElementOrParents(e) {
    let checkLinkClasses = Array.from(e.classList).filter(c => c.includes('workflow-'));
    if (checkLinkClasses.length==1) {
        return checkLinkClasses[0].split('workflow-',2)[1];
    }

    return e.parentElement ? getWorkflowNameFromElementOrParents(e.parentElement) : undefined;
}

function queryType(q) {
    logLaunchButtonsDebug('Looking for launch buttons with query: "' + q + '"');
    return Array.from(document.querySelectorAll(q));
}

function queryDownloadButtons(type) {
    return [].concat(
        queryType('.cms-download-button-'+type+' a'),
        queryType('a.download-button-'+type)
    );
}

function queryLaunchButtons(type) {
    return [].concat(
        queryType('.cms-launch-button-'+type+' a'),
        queryType('a.launch-button-'+type)
    );
}

function queryLaunchWorkflowButtons() {
    return [].concat(
        queryType('[class*="cms-launch-button-workflow-"] a'),
        queryType('a[class*="launch-button-workflow-"]')
    );
}

function logLaunchButtonsDebug(s) {
    if (isLaunchButtonsDebug)
        console.log('logLaunchButtonsDebug -- ' + s);
}

function setupLaunchButtons() {
    let launchTypes = ['recorder','manager','screenshot'];

    for (let type of launchTypes) {
        for (let link of queryLaunchButtons(type)) {
            setupLaunchLink(type, link);
        }
    }

    for (let link of queryLaunchWorkflowButtons()) {
        setupLaunchWorkflowLink(link);
    }

    
    let downloadTypes = ['recorder','manager','screenshot','workflow-createStory','workflow-openImageManager'];
    let foundDownloadTypes = {};
    for (let type of downloadTypes) {
        for (let link of queryDownloadButtons(type)) {
            setupDownloadLink(type, link);
            foundDownloadTypes[type] = true;
        }
    }

    
    if (Object.keys(foundDownloadTypes).length===1) {
        let singleDownloadType = Object.keys(foundDownloadTypes)[0];
        setTimeout(() => {
            downloadApp(singleDownloadType);
        },1000);
    }

    
    if (typeof analyticsGetDeviceId === "function") {
        analyticsGetDeviceId(function(dId) {
            launcherDeviceId = dId;
        });
    }
}

if (document.readyState === "loading")
    document.addEventListener('DOMContentLoaded', setupLaunchButtons);
else
    setupLaunchButtons();


window.addEventListener('message', (event)=>{
    if(typeof event.data === 'string' && event.data.indexOf('som-success') === 0 ) {
        let timestamp = Math.floor(Date.now() / 1000);
        document.cookie = 'sp-launch-success=' + timestamp + '; max-age=31536000; domain=screenpal.com; SameSite=None; Secure';

        
        let silentInstallDiv = document.getElementById(silentLaunchDivId);
        if (silentInstallDiv) {
            document.body.removeChild(silentInstallDiv);
        }
    }
}, false);
