const fs = require('fs');
const path = require('path');
const Config = require('ssb-config/inject');
const minimist = require('minimist');

const configPath = path.resolve(__dirname, '../configs', 'server-config.json');
const configData = JSON.parse(fs.readFileSync(configPath, 'utf8'));

const argv = process.argv.slice(2);
const i = argv.indexOf('--');
const conf = argv.slice(i + 1);
const cliArgs = ~i ? argv.slice(0, i) : argv;

// Nombre de la cuenta: define donde vive todo (~/.<cuenta>) y de ahi cuelgan el
// secret, la base de datos, los blobs y el socket. Sin la variable se usa 'ssb',
// que es lo de siempre, asi que las instalaciones existentes no notan nada.
//
// Se valida a proposito: este nombre acaba en rutas de fichero y hay operaciones
// destructivas (el modo panico borra el directorio de la cuenta) que no deben poder
// apuntar fuera de sitio.
//
// Manda la variable de entorno; si no esta, la cuenta que dejo anotada el selector
// de identidades de los ajustes; y si tampoco, 'ssb'.
const ACCOUNT_RE = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,31}$/;
let annotated = null;
try {
  const f = path.resolve(__dirname, '../configs', 'active-account');
  annotated = fs.readFileSync(f, 'utf8').trim() || null;
} catch (_) {}
const rawAccount = process.env.OASIS_ACCOUNT || annotated || 'ssb';
const account = ACCOUNT_RE.test(rawAccount) ? rawAccount : 'ssb';
if (account !== rawAccount) {
  console.error(`[oasis] cuenta no valida (${rawAccount}); se usa 'ssb'`);
}

let config = Config(account, minimist(conf));
config = { ...config, ...configData };

const debug = process.argv.includes('--debug') || process.env.OASIS_DEBUG === '1' || process.env.OASIS_DEBUG === 'true';
if (debug) {
  config.logging = { ...(config.logging || {}), level: 'debug' };
}

const megabyte = Math.pow(2, 20);
config.blobs = config.blobs || {};
config.blobs.max = 50 * megabyte;

config.account = account;

config.statePath = (name) => {
  // El directorio externo se separa por cuenta: sin esto dos identidades
  // compartirian estado, que es justo lo que hay que evitar.
  if (process.env.OASIS_STATE_DIR) return path.join(process.env.OASIS_STATE_DIR, account, name);
  return config.path ? path.join(config.path, name) : null;
};

module.exports = config;
