import { google } from "googleapis";

import { set_fs, readFile, utils } from 'xlsx';
import * as fs from 'fs';
set_fs(fs);

/* Change this import statement to point to the credentials JSON file */
import creds from './sheetjs-test-726272627262.json' assert { type: "json" };

/* Change this to the spreadsheet ID */
const id = "SOME-SPREADSHEETJS-ID";

/* connect to google services */
const jwt = new google.auth.JWT({
  email: creds.client_email,
  key: creds.private_key,
  scopes: [
    'https://www.googleapis.com/auth/spreadsheets',
    'https://www.googleapis.com/auth/drive.file',
  ]
});

const sheets = google.sheets({ version: "v4", auth: jwt });

/* get existing sheets */
const wsheet = await sheets.spreadsheets.get({spreadsheetId: id});

/* remove all sheets after the first */
if(wsheet.data.sheets.length > 1) await sheets.spreadsheets.batchUpdate({
  spreadsheetId: id,
  requestBody: { requests:
    wsheet.data.sheets.slice(1).map(s => ({
      deleteSheet: {
        sheetId: s.properties.sheetId
      }
    }))
  }
});

/* read file */
const wb = readFile("pres.numbers");

/* rename first worksheet to avoid collisions */
const props0 = wsheet.data.sheets[0].properties;
if(wb.SheetNames.map(n => n.toLowerCase()).includes(props0.title.toLowerCase())) {
  await sheets.spreadsheets.batchUpdate({
    spreadsheetId: id,
    requestBody: { requests: [{
      updateSheetProperties: {
        fields: "title",
        properties: {
          sheetId: props0.sheetId,
          title: "thistitleisatleast33characterslong"
        }
      }
    }]}
  });
  console.log(`renamed "${props0.title}" to "thistitleisatleast33characterslong"`);
}

/* add sheets from file */
for(let name of wb.SheetNames) {
  const aoa = utils.sheet_to_json(wb.Sheets[name], {header:1});
  await sheets.spreadsheets.batchUpdate({
    spreadsheetId: id,
    requestBody: { requests: [
      /* add new sheet */
      { addSheet: { properties: { title: name } } },
    ] }
  });
  await sheets.spreadsheets.values.update({
    spreadsheetId: id,
    range: `'${name}'!A1`,
    valueInputOption: "USER_ENTERED",
    resource: { values: aoa }
  });
  console.log(`Created Google Worksheet "${name}"`);
}

/* remove first sheet */
const res = await sheets.spreadsheets.batchUpdate({
  spreadsheetId: id,
  requestBody: { requests: [
    /* remove old first sheet */
    { deleteSheet: { sheetId: wsheet.data.sheets[0].properties.sheetId } }
  ] }
});