/**
* @license Apache-2.0
*
* Copyright (c) 2020 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

'use strict';

// MODULES //

var resolve = require( 'path' ).resolve;
var logger = require( 'debug' );
var readDir = require( '@stdlib/fs/read-dir' ).sync;
var exists = require( '@stdlib/fs/exists' ).sync;
var writeFile = require( '@stdlib/fs/write-file' ).sync;
var isPRNGLike = require( '@stdlib/assert/is-prng-like' );
var licenseHeader = require( '@stdlib/_tools/licenses/header' );


// VARIABLES //

var debug = logger( 'reviver:build' );
var OPTS = {
	'encoding': 'utf8'
};
var SPDX = 'Apache-2.0';
var YEAR = (new Date()).getFullYear();
var COPYRIGHT = 'The Stdlib Authors';


// FUNCTIONS //

/**
* Main execution sequence.
*
* @private
*/
function main() {
	var dpath;
	var fpath;
	var opath;
	var tmp1;
	var tmp2;
	var prng;
	var dirs;
	var pkgs;
	var str;
	var err;
	var pkg;
	var p;
	var i;

	dpath = resolve( __dirname, '..', '..' );

	debug( 'Reading namespace directory contents: %s', dpath );
	dirs = readDir( dpath );
	if ( dirs instanceof Error ) {
		debug( 'Encountered an error when attempting to read namespace directory contents: %s', err.message );
		return;
	}

	debug( 'Finding packages...' );
	pkgs = [];
	for ( i = 0; i < dirs.length; i++ ) {
		p = resolve( dpath, dirs[ i ] );
		fpath = resolve( p, 'package.json' );
		if ( exists( fpath ) ) {
			prng = require( p ); // eslint-disable-line stdlib/no-dynamic-require
			if ( isPRNGLike( prng ) ) {
				pkg = require( fpath ); // eslint-disable-line stdlib/no-dynamic-require
				pkgs.push( [ pkg.name, prng.NAME ] );
			}
		}
	}
	debug( 'Found %d packages.', pkgs.length );

	debug( 'Generating script...' );
	str = '';
	str += licenseHeader( SPDX, 'js', {
		'year': YEAR,
		'copyright': COPYRIGHT
	});
	str += '\n';

	str += '// This file is generated using `scripts/build.js`.\n\n';
	str += '\'use strict\';\n';
	str += '\n';
	str += '// MODULES //\n';
	str += '\n';
	tmp1 = [];
	tmp2 = [];
	for ( i = 0; i < pkgs.length; i++ ) {
		pkg = pkgs[ i ];
		tmp1.push( 'var prng'+i+' = require( \''+pkg[ 0 ]+'\' );' );
		tmp2.push( 'prngs[ \''+pkg[ 1 ]+'\' ] = prng'+i+'.factory;' );
	}
	str += tmp1.join( '\n' );
	str += '\n';
	str += '\n';
	str += '\n';
	str += '// MAIN //\n';
	str += '\n';
	str += 'var prngs = {};\n';
	str += tmp2.join( '\n' );
	str += '\n';
	str += '\n';
	str += '\n';
	str += '// EXPORTS //\n';
	str += '\n';
	str += 'module.exports = prngs;\n';

	opath = resolve( __dirname, '..', 'lib', 'prngs.js' );
	debug( 'Writing script to file: %s', opath );
	err = writeFile( opath, str, OPTS );
	if ( err ) {
		debug( 'Encountered an error when attempting to write script to file: %s', err.message );
		return;
	}
	debug( 'Successfully wrote script to file.' );
}


// MAIN //

main();