'use strict';

const BaseController = require('../base');
const os = require('os');
const fs = require('fs');
const path = require('path');

class ExampleController extends BaseController {

  /**
   * test electron api
   */
  async testElectronApi() {
    const { ctx, service } = this;
    const body = ctx.request.body;
    const id = body.id;
    const data = {};

    await service.example.testElectronApi(id);

    this.sendSuccess(data);
  }

  async openLocalDir() {
    const self = this;
    const { ctx, service } = this;
    const body = ctx.request.body;
    const id = body.id;
    const data = {};
    let dir = '';
    switch (id) {
      case 'download' :
        dir = os.userInfo().homedir + '/Downloads';
        break;
      case 'picture' :
        dir = os.userInfo().homedir + '/Pictures';
        break;
      case 'doc' :
        dir = os.userInfo().homedir + '/Documents';
        break;
      case 'music' :
        dir = os.userInfo().homedir + '/Music';
        break;
    }

    await service.example.openLocalDir(dir);

    self.sendSuccess(data);
  }

  async executeJS() {
    const self = this;
    const { ctx, service } = this;
    const body = ctx.request.body;
    const str = body.str;
    let data = await service.example.executeJS(str);
    self.sendSuccess(data);
  }

  async uploadFile() {
    const self = this;
    const { ctx, service } = this;
    let tmpDir = service.storage.getStorageDir();
    const file = ctx.request.files[0];

    try {
      let tmpFile = fs.readFileSync(file.filepath)
      fs.writeFileSync(path.join(tmpDir, file.filename), tmpFile)
    } finally {
      await fs.unlink(file.filepath, function(){});
    }
    const fileStream = fs.createReadStream(path.join(tmpDir, file.filename))
    const uploadRes = await service.example.uploadFileToSMMS(fileStream);

    self.sendData(uploadRes);
  }

  async uploadExtension() {
    const self = this;
    const { ctx, service } = this;
    const data = {};
    let tmpDir = service.storage.getStorageDir();

    const file = ctx.request.files[0];
    this.app.logger.info('file:', file);

    try {
      let tmpFile = fs.readFileSync(file.filepath)
      fs.writeFileSync(path.join(tmpDir, file.filename), tmpFile)
    } finally {
      await fs.unlink(file.filepath, function(){});
    }
    
    const filePath = path.join(tmpDir, file.filename);
    await service.example.loadExtension(filePath);

    self.sendData(data);
  }

  async setShortcut() {
    const self = this;
    const { ctx, service } = this;
    const shortcutObj = ctx.request.body;
    const data = {};

    if (!shortcutObj['id'] || !shortcutObj['name'] || !shortcutObj['cmd']) {
      self.sendFail({}, 'param error', 100);
      return;
    }

    await service.example.setShortcut(shortcutObj);

    self.sendSuccess(data);
  }

  async getWsUrl() {
    const self = this;
    const { service } = this;
    const data = {};

    const addr = await service.socket.getWsUrl();
    data.url = addr;

    self.sendSuccess(data);
  }

  async dbOperation() {
    const self = this;
    const { ctx, service } = this;
    const paramsObj = ctx.request.body;
    const data = {
      action: paramsObj.action,
      result: null,
      all_list: []
    };
    
    switch (paramsObj.action) {
      case 'add' :
        data.result = await service.storage.addTestData(paramsObj.info);;
        break;
      case 'del' :
        data.result = await service.storage.delTestData(paramsObj.delete_name);;
        break;
      case 'update' :
        data.result = await service.storage.updateTestData(paramsObj.update_name, paramsObj.update_age);
        break;
      case 'get' :
        data.result = await service.storage.getTestData(paramsObj.search_age);
        break;
    }

    data.all_list = await service.storage.getAllTestData();

    self.sendSuccess(data);
  }

  async addTestData() {
    const self = this;
    const { service } = this;
    const data = {};

    const userInfo = {
      name: 'jame',
      age: 18,
      gender: 'man'
    }
    await service.storage.addTestData(userInfo);

    self.sendSuccess(data);
  }

  async delTestData() {
    const self = this;
    const { service } = this;
    const data = {};
    const name = 'jame';
    await service.storage.delTestData(name);

    self.sendSuccess(data);
  }

  async updateTestData() {
    const self = this;
    const { service } = this;
    const data = {};
    const name = 'jame';
    const age = 20;
    await service.storage.updateTestData(name, age);

    self.sendSuccess(data);
  }

  async getTestData() {
    const self = this;
    const { service } = this;
    const data = {};
    const name = 'jame';
    const user = await service.storage.getTestData(name);
    data.user = user;

    self.sendSuccess(data);
  }

  async autoLaunchEnable() {
    const { service } = this;

    await service.example.autoLaunchEnable();
    const data = {
      isEnabled: true
    };

    this.sendSuccess(data);
  }
  
  async autoLaunchDisable() {
    const { service } = this;
    
    await service.example.autoLaunchDisable();
    const data = {
      isEnabled: false
    };

    this.sendSuccess(data);
  }

  async autoLaunchIsEnabled() {
    const { service } = this;

    const data = {
      isEnabled: null
    };

    const isEnabled = await service.example.autoLaunchIsEnabled();
    data.isEnabled = isEnabled;

    this.sendSuccess(data);
  }

  /**
   * 调用其它程序
   */
  async openSoftware() {
    const { service } = this;
    const data = {};
    const openResult = await service.example.openSoftware('powershell.exe');
    if (!openResult) {
      this.sendFail({}, '程序不存在', 100);
      return;
    }
    this.sendSuccess(data);
  }

  /**
   * 选择文件夹目录
   */
  async selectFileDir() {
    const { service } = this;

    const data = {
      dir: ''
    };
    const dir = await service.example.selectDir();
    data.dir = dir;

    this.sendSuccess(data);
  }

  /**
   * 显示消息对话框
   */
  async messageShow() {
    const { service } = this;
    const data = {};
    await service.example.messageShow();

    this.sendSuccess(data);
  }

  /**
   * 显示消息对话框和确认
   */
  async messageShowConfirm() {
    const { service } = this;
    const data = {};
    await service.example.messageShowConfirm();

    this.sendSuccess(data);
  }
}

module.exports = ExampleController;
