
/* <%- tplJsOrTs('eslint no-console: 0', 'tslint:disable:no-console') %> */
<%- tplImports('{ join }', 'path') %>
<%- tplImports('{ readJsonFileSync }', '@feathers-plus/test-utils') %>
<%- tplTsOnly(`import { App } from './app.interface'${sc}`) %>
<%- insertFragment('imports') %>

// Determine if command line argument exists for seeding data
let ifSeedServices = ['--seed', '-s'].some(str => process.argv.slice(2).includes(str))<%- sc %>

// Determine if environment allows test to mutate existing DB data.
function areDbChangesAllowed(testConfig<%- tplTsOnly(': { environmentsAllowingSeedData: string[] }') -%>) {
  let { environmentsAllowingSeedData = [] } = testConfig<%- sc %>
  if (process.env.NODE_ENV) {
    return environmentsAllowingSeedData.includes(process.env.NODE_ENV)<%- sc %>
  }
  return false<%- sc %>
}

// Get generated fake data
let fakeData = readJsonFileSync(join(__dirname, '../seeds/fake-data.json')) || {}<%- sc %>

// Get generated services
let services = (readJsonFileSync(join(__dirname, '../feathers-gen-specs.json')) || {}).services<%- sc %>
<%- insertFragment('init') %>

<%- tplExport('async function (app) {', 'async function (app: App) {') %>
  const ifDbChangesAllowed = areDbChangesAllowed(app.get('tests'))<%- sc %>
  <%- insertFragment('func_init') %>
  if (!ifSeedServices) return<%- sc %>
  if (!ifDbChangesAllowed) return<%- sc %>

  if (!Object.keys(fakeData).length) {
    console.log('Cannot seed services as seed/fake-data.json doesn\'t have seed data.')<%- sc %>
    return<%- sc %>
  }
  if (!services || !Object.keys(services).length) {
    console.log('Cannot seed services as feathers-gen-specs.json has no services.')<%- sc %>
    return<%- sc %>
  }

  for (const serviceName in services) {
    if (services.hasOwnProperty(serviceName)) {
      const { name, adapter, path } = services[serviceName]<%- sc %>
      <%- insertFragment('seed_select', [
        `      const doSeed = adapter !== 'generic'${sc}`
      ]) %>

      if (doSeed) {
        if (fakeData[name] && fakeData[name].length) {
          try {
            const service = app.service(path)<%- sc %>

            <%- insertFragment('seed_try', [
              `            const deleted = await service.remove(null)${sc}`,
              `            const result = await service.create(fakeData[name])${sc}`,
              '            console.log(`Seeded service ${name} on path ${path} deleting ${deleted.length} records, adding ${result.length}.`)' + sc,
            ]) %>
          } catch (err) {
            console.log(`Error on seeding service ${name} on path ${path}`, err.message)<%- sc %>
          }
        } else {
          console.log(`Not seeding service ${name} on path ${path}. No seed data.`)<%- sc %>
        }
      } else {
        console.log(`Not seeding generic service ${name} on path ${path}.`)<%- sc %>
      }
    }
  }
  <%- insertFragment('func_return') %>
}<%- tplJsOnly(sc) %>

<%- insertFragment('funcs') %>
<%- insertFragment('end') %>
