async function setDownloadButtonsToLoading() {
  const stableBtn = document.querySelector('#stableInstall')
  const devBtn = document.querySelector('#devInstall')

  stableBtn.innerText = localeObj.gcScriptRunning || 'Running...'
  devBtn.innerText = localeObj.gcScriptRunning || 'Running...'

  // Set btns to disabled
  stableBtn.disabled = true
  stableBtn.classList.add('disabled')

  devBtn.disabled = true
  devBtn.classList.add('disabled')

  debug.log('Set download buttons to loading')
}

async function resetDownloadButtons() {
  const stableBtn = document.querySelector('#stableInstall')
  const devBtn = document.querySelector('#devInstall')

  stableBtn.innerText = localeObj.stableInstall || 'Download'
  devBtn.innerText = localeObj.devInstall || 'Download'

  // Set btns to enabled
  stableBtn.disabled = false
  stableBtn.classList.remove('disabled')

  devBtn.disabled = false
  devBtn.classList.remove('disabled')

  debug.log('Reset download buttons')
}

async function downloadDataFiles(branch) {
  const config = await getCfg()

  if (!branch) {
    debug.warn('Branch not specified')
    branch = config.grasscutterBranch || 'development'
  }

  debug.log('Using branch: ' + branch)

  setDownloadButtonsToLoading()

  // For data files
  const dataFiles = await axios.get(`https://api.github.com/repos/Grasscutters/Grasscutter/contents/data?ref=${branch}`)
  const dataList = dataFiles.data
    .map(file => ({ path: file.path, filename: file.name }))
    .map(o => ({ url: `https://raw.githubusercontent.com/Grasscutters/Grasscutter/${branch}/${o.path}`, filename: o.filename }))

  debug.log('Downloaded data files')

  // For key files
  const keyFiles = await axios.get(`https://api.github.com/repos/Grasscutters/Grasscutter/contents/keys?ref=${branch}`)
  const keyList = keyFiles.data
    .map(file => ({ path: file.path, filename: file.name }))
    .map(o => ({ url: `https://raw.githubusercontent.com/Grasscutters/Grasscutter/${branch}/${o.path}`, filename: o.filename }))

  debug.log('Downloaded key files')

  const serverFolderFixed = config.serverFolder.match(/.*\\|.*\//g, '')[0].replace(/\//g, '\\')

  debug.log('Server folder fixed: ' + serverFolderFixed)
 
  await Neutralino.os.execCommand(`mkdir ${serverFolderFixed}\\data`)
  await Neutralino.os.execCommand(`mkdir ${serverFolderFixed}\\keys`)

  debug.log('Created data and keys folders')
  
  // Download data files
  for (const o of dataList) {
    const folder = 'data'
    const e = await Neutralino.os.execCommand(`powershell Invoke-WebRequest -Uri ${o.url} -OutFile "${serverFolderFixed}\\${folder}\\${o.filename}"`)
    debug.log(e)
  }
  
  // Download key files
  for (const o of keyList) {
    const folder = 'keys'
    const e = await Neutralino.os.execCommand(`powershell Invoke-WebRequest -Uri ${o.url} -OutFile "${serverFolderFixed}\\${folder}\\${o.filename}"`)
    debug.log(e)
  }
  
  // Fix buttons
  resetDownloadButtons()
}

async function downloadGC(branch) {
  const config = await getCfg()

  // Set current installation in config
  config.grasscutterBranch = branch

  debug.log('Branch set to: ' + branch)

  // Set gc path for people with launcher enabled
  config.serverFolder = `${NL_CWD}\\gc-${branch}\\grasscutter.jar`

  debug.log('Server folder automatically set to: ' + config.serverFolder)

  // Enable server launcher
  config.serverLaunchPanel = true

  Neutralino.storage.setData('config', JSON.stringify(config))

  // Download data files
  downloadDataFiles(branch)

  // External service that allows un-authed artifact downloading
  let artiUrl = `https://nightly.link/Grasscutters/Grasscutter/workflows/build/${branch}/Grasscutter.zip`
  
  await axios.get(artiUrl).catch(e => {
    // Fallback link if artifacts are not being uploaded
    debug.warn('Artifacts not available for latest, falling back...')
    artiUrl = 'https://nightly.link/Grasscutters/Grasscutter/actions/runs/2284467925/Grasscutter.zip'
  })

  debug.log('Artifact URL: ' + artiUrl)

  // Keystore for branch (since they can differ)
  const keystoreUrl = `https://github.com/Grasscutters/Grasscutter/raw/${branch}/keystore.p12`

  // Run installer
  createCmdWindow(`.\\scripts\\gc_download.cmd ${artiUrl} ${keystoreUrl} ${branch}`)

  debug.log('Created installer window')

  // Display folder after saving config
  displayServerFolder()
  enableServerButton()
  displayServerLaunchSection()
}

async function downloadResources() {
  const config = await getCfg()
  let serverFolderFixed = config.serverFolder.match(/.*\\|.*\//g, '')[0].replace(/\//g, '\\')

  // Remove trailing slash, it's important here
  serverFolderFixed = serverFolderFixed.endsWith('\\') ? serverFolderFixed.slice(0, -1) : serverFolderFixed

  debug.log('Server folder fixed: ' + serverFolderFixed)

  // Dont bother with data or keys, just want straight resources
  createCmdWindow(`.\\scripts\\resources_download.cmd "${serverFolderFixed}"`)

  debug.log('Created resources window')
}