//
// Copy plugins from original scimgateway package to current installation folder
//

import fs from 'node:fs'

function fsExistsSync(f: string) {
  try {
    fs.statSync(f)
    return true
  } catch (e) {
    return false
  }
}

if (process.env.SCIMGATEWAY_POSTINSTALL_SKIP) {
  console.info('The configuration `scimgateway_postinstall_skip` was set to true, `postinstall` activities are skipped!')
  process.exit(0)
}

if (fsExistsSync('./node_modules')) process.exit(0) // global package - quit - no postinstall

if (!fsExistsSync('../../config')) fs.mkdirSync('../../config')
if (!fsExistsSync('../../config/certs')) fs.mkdirSync('../../config/certs')
if (!fsExistsSync('../../config/wsdls')) fs.mkdirSync('../../config/wsdls')
if (!fsExistsSync('../../config/docker')) fs.mkdirSync('../../config/docker')
if (!fsExistsSync('../../lib')) fs.mkdirSync('../../lib')

if (!fsExistsSync('../../config/plugin-loki.json')) fs.writeFileSync('../../config/plugin-loki.json', fs.readFileSync('./config/plugin-loki.json'))
if (!fsExistsSync('../../config/plugin-generic.json')) fs.writeFileSync('../../config/plugin-generic.json', fs.readFileSync('./config/plugin-generic.json'))
if (!fsExistsSync('../../config/plugin-soap.json')) fs.writeFileSync('../../config/plugin-soap.json', fs.readFileSync('./config/plugin-soap.json'))
if (!fsExistsSync('../../config/plugin-mssql.json')) fs.writeFileSync('../../config/plugin-mssql.json', fs.readFileSync('./config/plugin-mssql.json'))
if (!fsExistsSync('../../config/plugin-saphana.json')) fs.writeFileSync('../../config/plugin-saphana.json', fs.readFileSync('./config/plugin-saphana.json'))
if (!fsExistsSync('../../config/plugin-api.json')) fs.writeFileSync('../../config/plugin-api.json', fs.readFileSync('./config/plugin-api.json'))
if (!fsExistsSync('../../config/plugin-entra-id.json')) fs.writeFileSync('../../config/plugin-entra-id.json', fs.readFileSync('./config/plugin-entra-id.json')) // keep existing
if (!fsExistsSync('../../config/plugin-ldap.json')) fs.writeFileSync('../../config/plugin-ldap.json', fs.readFileSync('./config/plugin-ldap.json'))
if (!fsExistsSync('../../config/plugin-mongodb.json')) fs.writeFileSync('../../config/plugin-mongodb.json', fs.readFileSync('./config/plugin-mongodb.json'))

fs.writeFileSync('../../lib/plugin-loki.ts', fs.readFileSync('./lib/plugin-loki.ts'))
fs.writeFileSync('../../lib/plugin-generic.ts', fs.readFileSync('./lib/plugin-generic.ts'))
fs.writeFileSync('../../lib/plugin-soap.ts', fs.readFileSync('./lib/plugin-soap.ts'))
fs.writeFileSync('../../lib/plugin-mssql.ts', fs.readFileSync('./lib/plugin-mssql.ts'))
fs.writeFileSync('../../lib/plugin-saphana.ts', fs.readFileSync('./lib/plugin-saphana.ts'))
fs.writeFileSync('../../lib/plugin-api.ts', fs.readFileSync('./lib/plugin-api.ts'))
fs.writeFileSync('../../lib/plugin-entra-id.ts', fs.readFileSync('./lib/plugin-entra-id.ts'))
fs.writeFileSync('../../lib/plugin-ldap.ts', fs.readFileSync('./lib/plugin-ldap.ts'))
fs.writeFileSync('../../lib/plugin-mongodb.ts', fs.readFileSync('./lib/plugin-mongodb.ts'))

if (!fsExistsSync('../../config/wsdls/GroupService.wsdl')) {
  fs.writeFileSync('../../config/wsdls/GroupService.wsdl', fs.readFileSync('./config/wsdls/GroupService.wsdl'))
}
if (!fsExistsSync('../../config/wsdls/UserService.wsdl')) {
  fs.writeFileSync('../../config/wsdls/UserService.wsdl', fs.readFileSync('./config/wsdls/UserService.wsdl'))
}

fs.writeFileSync('../../config/docker/.dockerignore', fs.readFileSync('./config/docker/.dockerignore'))
fs.writeFileSync('../../config/docker/DataDockerfile', fs.readFileSync('./config/docker/DataDockerfile'))
fs.writeFileSync('../../config/docker/docker-compose-debug.yml', fs.readFileSync('./config/docker/docker-compose-debug.yml'))
fs.writeFileSync('../../config/docker/docker-compose-mssql.yml', fs.readFileSync('./config/docker/docker-compose-mssql.yml'))
fs.writeFileSync('../../config/docker/docker-compose.yml', fs.readFileSync('./config/docker/docker-compose.yml'))
fs.writeFileSync('../../config/docker/Dockerfile', fs.readFileSync('./config/docker/Dockerfile'))

fs.writeFileSync('../../LICENSE', fs.readFileSync('./LICENSE'))
if (!fsExistsSync('../../index.ts')) fs.writeFileSync('../../index.ts', fs.readFileSync('./index.ts'))
else {
  const buf = fs.readFileSync('../../index.ts', 'utf-8')
  if (buf.toString().startsWith('console.log')) { // default bun index.ts
    fs.writeFileSync('../../index.ts', fs.readFileSync('./index.ts'))
  }
}

try {
  const packageJsonPath = '../../package.json'
  if (fsExistsSync(packageJsonPath)) {
    const packageJsonString = fs.readFileSync(packageJsonPath, 'utf-8')
    const packageJson = JSON.parse(packageJsonString)
    if (packageJson.type !== 'module') { // "npm init -y" instead of "bun init -y"
      packageJson.type = 'module'
      fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n')
      console.log('Updated package.json with "type": "module" to ensure ES module support for scimgateway.')
    }
  }
} catch (err) {}
