/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */
/* eslint-disable consistent-return */
const gulp = require('gulp');
const fs = require('node-fs');
const chmod = require('gulp-chmod');

const pkg = require('../package.json');
const { config } = require('./config');
const { copy, zip, del } = require('./common');

const rainloopCopy = () => {
	const versionFull = pkg.version,
		dist = config.releasesPath + '/webmail/' + versionFull + '/src/';
	fs.mkdirSync(dist, '0777', true);
	fs.mkdirSync(dist + 'data');
	fs.mkdirSync(dist + 'rainloop/v/' + versionFull, '0777', true);

	return gulp
		.src('rainloop/v/' + config.devVersion + '/**/*', { base: 'rainloop/v/' + config.devVersion })
		.pipe(chmod(0o644, 0o755))
		.pipe(gulp.dest(dist + 'rainloop/v/' + versionFull));
};

const rainloopSetup = (done) => {
	const versionFull = pkg.version,
		dist = config.releasesPath + '/webmail/' + versionFull + '/src/';
	fs.writeFileSync(dist + 'data/VERSION', versionFull);
	fs.writeFileSync(dist + 'data/EMPTY', versionFull);

	fs.writeFileSync(
		dist + 'index.php',
		fs
			.readFileSync('index.php', 'utf8')
			.replace("'APP_VERSION', '0.0.0'", "'APP_VERSION', '" + versionFull + "'")
			.replace(
				"'APP_VERSION_TYPE', 'source'",
				"'APP_VERSION_TYPE', '" + (config.community ? 'community' : 'standard') + "'"
			)
	);

	fs.writeFileSync(dist + 'rainloop/v/' + versionFull + '/index.php.root', fs.readFileSync(dist + 'index.php'));

	if (config.community) {
		require('rimraf').sync(dist + 'rainloop/v/' + versionFull + '/app/libraries/RainLoop/Providers/Prem.php');
	}

	config.destPath = config.releasesPath + '/webmail/' + versionFull + '/';
	config.cleanPath = dist;
	config.zipSrcPath = dist;
	config.zipFile = 'rainloop-' + (config.community ? 'community-' : '') + versionFull + '.zip';
	config.zipFileShort = 'rainloop-' + (config.community ? 'community-' : '') + 'latest.zip';

	config.rainloopBuilded = true;

	done();
};

const rainloopZip = (done) => {
	if (config.destPath && config.zipSrcPath && config.zipFile) {
		return zip(config.zipSrcPath, config.destPath, config.zipFile);
	}

	done();
};

const rainloopClean = (done) => {
	if (config.cleanPath) {
		return del(config.cleanPath);
	}

	done();
};

const rainloopShortName = (done) => copy(config.destPath + config.zipFile, config.destPath + config.zipFileShort, done);

exports.rainloopBuild = gulp.series(rainloopCopy, rainloopSetup);

exports.rainloop = gulp.series(exports.rainloopBuild, rainloopZip, rainloopClean, rainloopShortName);
