/**
 *
 *    Copyright (c) 2020 Silicon Labs
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

import { Dark } from 'quasar'
import { wsCategory } from '../../src-shared/db-enum.js'
const _ = require('lodash')

const observable = require('../util/observable.js')
const restApi = require('../../src-shared/rest-api.js')
const rendApi = require('../../src-shared/rend-api.js')
const storage = require('../util/storage.js')

// This file provide glue logic to enable function calls & HTML attribute data change listener logic
// between front-end containers (jxBrowser, Electron, etc) and the node.js
//
// If a callback applies (e.g. when a function returns a value),
// the javascript code will invoke the Java function name "${id}Callback"
// e.g. for function "open", "openCallback" is invoked.

/**
 * Each declared 'function' entry offers such features:
 * - ability to invoke front-end functions within container via function 'id' with callback.
 * - ability to observe specific HTML target (a DOM Node) for data change.
 *
 * Per entry, 'type' is 'observer', it is dedicated as a data cahgne listener. The
 * e.g. The 'open' function is invoked by the container when opening a new configuration.
 * The front-end is informed and proceed to init UI elements.
 */
export function renderer_api_info() {
  return {
    prefix: 'zap',
    description: 'Zap Renderer API',
    functions: rendApi.renderer_api_info
  }
}

/**
 * Save file.
 * @param {*} zap_file
 */
function fnSave(zap_file) {
  let data = {}
  if (zap_file != null) data.path = zap_file
  window
    .serverPost(`${restApi.ide.save}`, data)
    .catch((err) => console.log(err))
}

/**
 * Check if state of file is dirty based on unsaved changes.
 * @returns
 */
function fnIsDirty() {
  return window
    .serverGet(`${restApi.ide.isDirty}`)
    .then((res) => {
      return res?.data?.DIRTY
    })
    .catch((err) => console.log(err))
}

/**
 * Execute the renderer api based on id.
 * @param {*} id
 * @param  {...any} args
 * @returns ret
 */
export function renderer_api_execute(id, ...args) {
  let ret = null
  switch (id) {
    case rendApi.id.save:
      ret = fnSave.apply(null, args)
      break
    case rendApi.id.progressStart:
      observable.setObservableAttribute(
        rendApi.observable.progress_attribute,
        args[0]
      )
      break
    case rendApi.id.progressEnd:
      observable.setObservableAttribute(
        rendApi.observable.progress_attribute,
        ''
      )
      break
    case rendApi.id.reportFiles:
      observable.setObservableAttribute(
        rendApi.observable.reported_files,
        JSON.parse(args[0])
      )
      break
    case rendApi.id.debugNavBarOn:
      observable.setObservableAttribute(rendApi.observable.debugNavBar, true)
      break
    case rendApi.id.debugNavBarOff:
      observable.setObservableAttribute(rendApi.observable.debugNavBar, false)
      break
    case rendApi.id.setDarkTheme:
      {
        const useDarkTheme =
          typeof args[0] === 'string' ? args[0] === 'true' : !!args[0]
        if (_.isBoolean(useDarkTheme)) {
          Dark.set(useDarkTheme)
          storage.setItem(rendApi.storageKey.isDarkThemeActive, useDarkTheme)
          if (window.electronAPI) {
            // light theme value
            let titleBarOverlay = {
              color: '#F4F4F4',
              symbolColor: '#67696D'
            }
            if (useDarkTheme) {
              titleBarOverlay = {
                color: '#1B1B1B',
                symbolColor: '#67696D'
              }
            }
            window.electronAPI.setTitleBarOverlay(titleBarOverlay)
          }
          renderer_api_notify(rendApi.id.setDarkTheme, useDarkTheme)
        }
      }
      break

    case rendApi.id.isDirty:
      ret = fnIsDirty.apply(null)
      break
  }
  return ret
}

/**
 * Default implementation of the notification function simply
 * prints the notification to the console log. In case of electron
 * renderer container, this is all that's needed.
 *
 * In addition, this function also sends a postMessage to the parent, which
 * is a protocol used by at least one supported IDE.
 *
 * Any other IDE can implement this function and override the default from
 * outside of the browser context.
 *
 * @param {*} key
 * @param {*} value
 */
export function renderer_api_notify(key, value) {
  console.log(
    `${rendApi.jsonPrefix}${JSON.stringify({ key: key, value: value })}`
  )

  // Here we also send postMessage to the parent window if we're in a frame...
  // We also perform a conversion, since the postMessage() protocol of the IDE
  // is different than the base ZAP renderer API.
  let sentKey = key
  let sentValue = value

  // For some inexplicable reason, the IDE's dirty flag protocol is using
  // key "dirty" and value { isDirty: true/false } instead of the
  // key "dirtyFlag" and value true/false as it's done by zap internally.
  // So we transform the sent values....
  if (key == wsCategory.dirtyFlag) {
    sentKey = 'dirty'
    sentValue = {
      isDirty: value
    }
  }
  window?.parent?.postMessage(
    {
      eventId: sentKey,
      eventData: sentValue
    },
    '*'
  )
}
