#!/usr/bin/env node

const { cloneDeep } = require('lodash');
const config = require('../lib/config');
const dbconfig = cloneDeep(config.db);
const fs = require('fs');
const { getImageMimeType } = require('../lib/utils');
const Minio = require('minio');
const path = require('path');
const Sequelize = require('sequelize');

if (config.dbURL) {
  sequelize = new Sequelize(config.dbURL, dbconfig)
} else {
  sequelize = new Sequelize(dbconfig.database, dbconfig.username, dbconfig.password, dbconfig)
}

const minioClient = new Minio.Client({
  endPoint: config.minio.endPoint,
  port: config.minio.port,
  useSSL: config.minio.secure,
  accessKey: config.minio.accessKey,
  secretKey: config.minio.secretKey
});

const minioProtocol = config.minio.secure ? 'https' : 'http';
const minioHidePort = [80, 443].includes(config.minio.port);
const minioUrlPort = minioHidePort ? '' : `:${config.minio.port}`;

const minioUrl = `${minioProtocol}://${config.minio.endPoint}${minioUrlPort}/${config.s3bucket}`;

console.log(`Make sure to stop your server before starting the procedure.`);

if (config.db.dialect !== 'postgres') {
  console.log('This procedure was only tested against postgres, aborting...');
  process.exit();
} else if (config.serverURL === '' || minioUrl === '' ) {
  console.log('You need your server URL AND the minio URL to be defined, aborting...');
  process.exit();
} else {
  console.log(`We'll migrate URLs and files from ${config.serverURL} to ${minioUrl}, proceeding with the file upload...`);
  console.log();
}

var key;
var filePath;
var metadata;
fs.readdir(config.uploadsPath, function (err, files) {
  if (err) {
    console.log('Unable to scan directory: ' + err);
    process.exit();
  }
  files.forEach(function (file) {
    key = path.join('uploads', file)
    filePath = path.join(config.uploadsPath, file)
    console.log(`Uploading ${filePath} to ${key}...`);
    metadata = {
      'Content-Type': getImageMimeType(filePath),
    }
    minioClient.fPutObject(config.s3bucket, key, filePath, metadata, function(err) {
      if (err) {
        console.log(err);
        process.exit();
      }
      console.log('File uploaded successfully.');
    });
  });
});

// You can only select to see what it will do
// sequelize.query(`SELECT regexp_replace(content, '${minioUrl}/uploads/', '${config.serverURL}/uploads/', 'g') FROM "Notes"`).then(([results, metadata]) => {
//   console.log(metadata);
// })

sequelize.query(`UPDATE "Notes" SET content = regexp_replace(content, '${config.serverURL}/uploads/', '${minioUrl}/uploads/', 'g')`); // if something goes wrong, then revert '${config.serverURL}', '${minioUrl}' by swapping their place in the query.

const updateStatement = String.raw`UPDATE "Notes" SET content = regexp_replace(content, '\(/uploads/', '(${minioUrl}/uploads/', 'g')`

sequelize.query(updateStatement)
