'use strict';

/**
 * 前端(html)调用electron功能时，建议使用该模块
 * 
 * 定义的function 接收三个参数 
 * @param event ipcMain事件对象
 * @param channel 频道
 * @param arg 接收到的消息
 */

const {app, dialog, BrowserWindow, BrowserView, Notification, powerMonitor, screen, nativeTheme} = require('electron');
const path = require('path');
const _ = require('lodash');

let myTimer = null;
let browserViewObj = null;
let notificationObj = null;

exports.hello = function (event, channel, msg) {
  let newMsg = msg + " +1"
  let reply = ''
  reply = '收到：' + msg + '，返回：' + newMsg
  return reply
}

exports.messageShow = function (event, channel, arg) {
  dialog.showMessageBoxSync({
    type: 'info', // "none", "info", "error", "question" 或者 "warning"
    title: '自定义标题-message',
    message: '自定义消息内容',
    detail: '其它的额外信息'
  })

  return '打开了消息框';
}

exports.messageShowConfirm = function (event, channel, arg) {
  const res = dialog.showMessageBoxSync({
    type: 'info',
    title: '自定义标题-message',
    message: '自定义消息内容',
    detail: '其它的额外信息',
    cancelId: 1, // 用于取消对话框的按钮的索引
    defaultId: 0, // 设置默认选中的按钮
    buttons: ['确认', '取消'], // 按钮及索引
  })
  let data = (res === 0) ? '点击确认按钮' : '点击取消按钮';
  console.log('[electron] [ipc] [example] [messageShowConfirm] 结果:', res);

  return data;
}

/**
 * 长消息 - 开始
 */
exports.socketMessageStart = function (event, channel, arg) {
  // 每隔1秒，向前端页面发送消息
  // 用定时器模拟
  myTimer = setInterval(function(e, c, msg) {
    let timeNow = Date.now();
    let data = msg + ':' + timeNow;
    e.reply(`${c}`, data)
  }, 1000, event, channel, arg)

  return '开始了'
}

/**
 * 长消息 - 停止
 */
exports.socketMessageStop = function () {
  clearInterval(myTimer);
  return '停止了'
}

/**
 * 加载视图内容
 */
exports.loadViewContent = function (event, channel, arg) {
  let content = null;
  if (arg.type == 'html') {
    content = path.join('file://', app.getAppPath(), arg.content)
  } else {
    content = arg.content;
  }

  browserViewObj = new BrowserView();
  MAIN_WINDOW.setBrowserView(browserViewObj)
  browserViewObj.setBounds({
    x: 300,
    y: 170,
    width: 650,
    height: 400
  });
  browserViewObj.webContents.loadURL(content);
  return true
}

/**
 * 移除视图内容
 */
exports.removeViewContent = function () {
  MAIN_WINDOW.removeBrowserView(browserViewObj);
  return true
}

/**
 * 打开新窗口
 */
exports.createWindow = function (event, channel, arg) {
  let content = null;
  if (arg.type == 'html') {
    content = path.join('file://', app.getAppPath(), arg.content)
  } else {
    content = arg.content;
  }

  let winObj = new BrowserWindow({
    x: 10,
    y: 10,
    width: 980, 
    height: 650 
  })
  winObj.loadURL(content);

  return winObj.id
}

/**
 * 创建系统通知
 */
exports.sendNotification = function (event, channel, arg) {
  if (!Notification.isSupported()) {
    return '当前系统不支持通知';
  }

  let options = {};
  if (!_.isEmpty(arg.title)) {
    options.title = arg.title;
  }
  if (!_.isEmpty(arg.subtitle)) {
    options.subtitle = arg.subtitle;
  }
  if (!_.isEmpty(arg.body)) {
    options.body = arg.body;
  }
  if (!_.isEmpty(arg.silent)) {
    options.silent = arg.silent;
  }

  notificationObj = new Notification(options);

  if (arg.clickEvent) {
    notificationObj.on('click', (e) => {
      let data = {
        type: 'click',
        msg: '您点击了通知消息'
      }
      event.reply(`${channel}`, data)
    });
  }

  if (arg.closeEvent) {
    notificationObj.on('close', (e) => {
      let data = {
        type: 'close',
        msg: '您关闭了通知消息'
      }
      event.reply(`${channel}`, data)
    });
  }

  notificationObj.show();

  return true
}

/**
 * 电源监控
 */
exports.initPowerMonitor = function (event, channel, arg) {
  powerMonitor.on('on-ac', (e) => {
    let data = {
      type: 'on-ac',
      msg: '接入了电源'
    }
    event.reply(`${channel}`, data)
  });

  powerMonitor.on('on-battery', (e) => {
    let data = {
      type: 'on-battery',
      msg: '使用电池中'
    }
    event.reply(`${channel}`, data)
  });

  powerMonitor.on('lock-screen', (e) => {
    let data = {
      type: 'lock-screen',
      msg: '锁屏了'
    }
    event.reply(`${channel}`, data)
  });

  powerMonitor.on('unlock-screen', (e) => {
    let data = {
      type: 'unlock-screen',
      msg: '解锁了'
    }
    event.reply(`${channel}`, data)
  });

  return true
}

/**
 * 获取屏幕信息
 */
exports.getScreen = function (event, channel, arg) {

  let data = [];
  let res = {};
  if (arg == 0) {
    let res = screen.getCursorScreenPoint();
    data = [
      {
        title: '横坐标',
        desc: res.x
      },
      {
        title: '纵坐标',
        desc: res.y
      },
    ]
    
    return data;
  }
  if (arg == 1) {
    res = screen.getPrimaryDisplay();
  }
  if (arg == 2) {
    let resArr = screen.getAllDisplays();
    // 数组，只取一个吧
    res = resArr[0];
  }
  // console.log('[electron] [ipc] [example] [getScreen] res:', res);
  data = [
    {
      title: '分辨率',
      desc: res.bounds.width + ' x ' + res.bounds.height
    },
    {
      title: '单色显示器',
      desc: res.monochrome ? '是' : '否'
    },
    {
      title: '色深',
      desc: res. colorDepth
    },
    {
      title: '色域',
      desc: res.colorSpace
    },
    {
      title: 'scaleFactor',
      desc: res.scaleFactor
    },
    {
      title: '加速器',
      desc: res.accelerometerSupport
    },
    {
      title: '触控',
      desc: res.touchSupport == 'unknown' ? '不支持' : '支持'
    },
  ]

  return data;
}

/**
 * 获取系统主题
 */
exports.getTheme = function (event, channel, arg) {
  let theme = 'system';
  if (nativeTheme.shouldUseHighContrastColors) {
    theme = 'light';
  } else if (nativeTheme.shouldUseInvertedColorScheme) {
    theme = 'dark';
  }

  return theme;
}

/**
 * 设置系统主题
 */
exports.setTheme = function (event, channel, arg) {

  // TODO 好像没有什么明显效果
  nativeTheme.themeSource = arg;

  return arg;
}