import path from "path";
import { app, BrowserWindow, ipcMain } from "electron";

import axios from "axios";
import os from "os";
import fs from "fs";
import { exec } from "child_process";

let win;
app.whenReady().then(() => {
  win = new BrowserWindow({
    title: "银收客",
    width: 1024,
    height: 768,
    fullscreenable: true,
    fullscreen: process.env.VITE_DEV_SERVER_URL ? false : true,
    simpleFullscreen: true,
    frame: process.env.VITE_DEV_SERVER_URL ? true : false,
    webPreferences: {
      // 集成网页和 Node.js，也就是在渲染进程中，可以调用 Node.js 方法
      nodeIntegration: true,
      contextIsolation: false,
    },
  });

  // You can use `process.env.VITE_DEV_SERVER_URL` when the vite command is called `serve`
  if (process.env.VITE_DEV_SERVER_URL) {
    win.loadURL(process.env.VITE_DEV_SERVER_URL);
    // 使用vite开发服务的url路径访问应用
    // win.webContents.openDevTools();
  } else {
    win.loadFile(path.resolve(__dirname, "../dist/index.html")); // 打包后使用文件路径访问应用
  }

  // 安装最新版本的exe文件
  const installExe = async (exePath) => {
    return new Promise((resolve, reject) => {
      exec(`${exePath}`, (error, stdout, stderr) => {
        if (error) {
          reject(error);
        } else {
          resolve(stdout);
        }
      });
    });
  };

  ipcMain.on("downloadFile", async (event, arg) => {
    let _parmas = JSON.parse(arg);
    axios({
      url: _parmas.url,
      method: "get",
      responseType: "arraybuffer",
      onDownloadProgress: (propessEvent) => {
        // 更新进度条
        const propress = Math.round(
          (propessEvent.loaded / propessEvent.total) * 100
        );
        win.webContents.send("updateProgress", propress);
      },
    })
      .then(async (response) => {
        try {
          const tempFilePath = path.join(
            app.getPath("temp"),
            "temp-exe-file.exe"
          );
          fs.writeFileSync(tempFilePath, response.data);
          setTimeout(() => {
            win = null;
            app.exit();
          }, 1500);
          const installResult = await installExe(tempFilePath);
          console.log(`安装结果：${installResult}`);
        } catch (error) {
          console.log("error", error);
        }
      })
      .catch((err) => {
        console.log("下载失败", JSON.stringify(err));
      });
  });

  app.on("activate", () => {
    // 在 macOS 系统内, 如果没有已开启的应用窗口
    // 点击托盘图标时通常会重新创建一个新窗口
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow();
    }
  });

  ipcMain.on("quitHandler", (_, msg) => {
    win = null;
    app.exit();
  });

  // 给渲染进程返回打印机列表
  ipcMain.on("getPrintList", () => {
    win.webContents.getPrintersAsync().then((res) => {
      // console.log("打印机列表", res);
      win.webContents.send("printList", res);
    });
  });

  // 获取本机mac
  ipcMain.on("getOSmacSync", () => {
    let mac = "";
    if (os.networkInterfaces().WLAN) {
      mac = os.networkInterfaces().WLAN[0].mac;
      console.log("wlan.mac===", mac);
    } else {
      mac = os.networkInterfaces()["以太网"][0].mac;
      console.log("以太网.mac===", mac);
    }
    win.webContents.send("getOSmacRes", mac);
  });

  // 创建打印小票子窗口
  // const printWin = new BrowserWindow({
  //   show: false,
  //   width: 464,
  //   height: 1726,
  //   webPreferences: {
  //     // 集成网页和 Node.js，也就是在渲染进程中，可以调用 Node.js 方法
  //     nodeIntegration: true,
  //     contextIsolation: false,
  //   },
  // });

  // if (process.env.VITE_DEV_SERVER_URL) {
  //   // 加载打印的html文件
  //   printWin.loadFile(path.join(__dirname, "../public/print.html"));
  // } else {
  //   printWin.loadFile(path.resolve(__dirname, "../dist/print.html")); // 打包后使用文件路径访问应用
  // }

  // // 接收订单页面发过来的参数发送给打印页
  // ipcMain.on("printerInfoSync", (event, arg) => {
  //   printWin.webContents.send("getParams", arg);
  // });

  // // 执行打印操作
  // ipcMain.on("printStart", (event, arg) => {
  //   console.log(arg);
  //   const _parmas = JSON.parse(arg);
  //   // console.log(_parmas)
  //   let name = _parmas.deviceName;
  //   printWin.webContents.print({
  //     silent: true,
  //     deviceName: name,
  //     pageSize: {
  //       width: 58000,
  //       height: 216000,
  //     },
  //     scaleFactor: 80,
  //     landscape: false,
  //     margins: {
  //       marginType: "none",
  //       top: 0,
  //       bottom: 0,
  //       left: 0,
  //       right: 0,
  //     },
  //     dpi: {
  //       horizontal: 203,
  //       vertical: 203,
  //     },
  //   });
  // });

  // // 交班小票的窗口
  // const workPrintWin = new BrowserWindow({
  //   show: false,
  //   width: 464,
  //   height: 1726,
  //   webPreferences: {
  //     nodeIntegration: true,
  //     contextIsolation: false,
  //   },
  // });

  // if (process.env.VITE_DEV_SERVER_URL) {
  //   // 加载打印的html文件
  //   workPrintWin.loadFile(path.join(__dirname, "../public/work_print.html"));
  // } else {
  //   workPrintWin.loadFile(path.resolve(__dirname, "../dist/work_print.html")); // 打包后使用文件路径访问应用
  // }

  // // 接收渲染进程发送的数据
  // ipcMain.on("printerWorkSync", (event, arg) => {
  //   workPrintWin.webContents.send("getParams", arg);
  // });

  // // 执行交班小票的打印操作
  // ipcMain.on("printWorkStart", (event, arg) => {
  //   // console.log(arg);
  //   const _parmas = JSON.parse(arg);
  //   // console.log(_parmas)
  //   let name = _parmas.deviceName;
  //   workPrintWin.webContents.print({
  //     silent: true,
  //     deviceName: name,
  //     pageSize: {
  //       width: 58000,
  //       height: 216000,
  //     },
  //     scaleFactor: 80,
  //     landscape: false,
  //     margins: {
  //       marginType: "none",
  //       top: 0,
  //       bottom: 0,
  //       left: 0,
  //       right: 0,
  //     },
  //     dpi: {
  //       horizontal: 203,
  //       vertical: 203,
  //     },
  //   });
  // });

  // 标签小票的窗口
  const tagPrintWin = new BrowserWindow({
    show: false,
    width: 360,
    height: 240,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false,
    },
  });

  if (process.env.VITE_DEV_SERVER_URL) {
    // 加载打印的html文件
    tagPrintWin.loadFile(path.join(__dirname, "../public/tag_print.html"));
  } else {
    tagPrintWin.loadFile(path.resolve(__dirname, "../dist/tag_print.html")); // 打包后使用文件路径访问应用
  }

  // 接收渲染进程发送的数据
  ipcMain.on("printerTagSync", (event, arg) => {
    console.log(arg);
    tagPrintWin.webContents.send("getParams", arg);
  });

  // 执行标签小票的打印操作
  ipcMain.on("printTagStart", (event, arg) => {
    // console.log(arg);
    const _parmas = JSON.parse(arg);
    // console.log(_parmas)
    let name = _parmas.deviceName;
    tagPrintWin.webContents.print({
      silent: true,
      deviceName: name,
      pageSize: {
        width: 45000,
        height: 30000,
      },
      scaleFactor: 80,
      landscape: false,
      margins: {
        marginType: "none",
        top: 0,
        bottom: 0,
        left: 0,
        right: 0,
      },
      dpi: {
        horizontal: 203,
        vertical: 203,
      },
    });
  });

  const gotTheLock = app.requestSingleInstanceLock();
  if (!gotTheLock) {
    app.quit();
  } else {
    app.on("second-instance", (event, commandLine, workingDirectory) => {
      // 当运行第二个实例时,将会聚焦到mainWindow这个窗口
      if (win) {
        if (win.isMinimized()) win.restore();
        win.focus();
        win.show();
      }
    });
  }

  // 阻止默认关闭
  win.on("close", (e) => {
    e.preventDefault();
    win.webContents.send("showCloseDialog");
  });
});
app.on("window-all-closed", () => {
  if (process.platform !== "darwin") app.quit();
});
