/*--- IMPORTS ---*/
import express                                  from 'express';
import commonQuerySQL                           from '../common-database/index';
import { parseDataValues, parsePostDataValues } from '../common-defaults/common.defaults.terrenos';
import * as fs                                  from 'fs';
import { v4 as uuid }                           from 'uuid';
/*--- MODULES ---*/
/*--- VARIABLES ---*/
const router = express.Router();
// tslint:disable-next-line:no-var-requires
const R      = require( 'r-script' );
/*--- ROUTER ---*/
router.get( '/terrenos/prepare', async( request, response ) => {
	const dataSetTraingValues = await commonQuerySQL( 'SELECT A.CANTIDAD_TERRENO_USM2 FROM INTUS.VIEW_TERRENO_FORMAT A;', [] ).then( async( arrayReturnResult ) => {
		return arrayReturnResult;
	} );
	const resultData          = await commonQuerySQL( `SELECT
																	A.CANTIDAD_TERRENO_M2,
																	A.INFORMACION_FRENTE,
																	A.INFORMACION_FONDO,
																	A.YEAR_2016,
																	A.YEAR_2017,
																	A.YEAR_2018,
																	A.YEAR_2019,
																	A.YEAR_2020,
																	A.YEAR_2021,
																	A.YEAR_2022,
																	A.YEAR_2023,
																	A.YEAR_2024,
																	A.G2,
																	A.G3,
																	A.G4,
																	A.G5,
																	A.ZONA_01,
																	A.ZONA_02,
																	A.ZONA_03,
																	A.ZONA_04,
																	A.ZONA_05,
																	A.ZONA_06,
																	A.ZONA_07,
																	A.ZONA_08,
																	A.ZONA_09,
																	A.ZONA_10,
																	A.ZONA_11,
																	A.ZONA_12,
																	A.ZONA_13,
																	A.ZONA_14,
																	A.ZONA_15,
																	A.ZONA_16,
																	A.ZONA_17,
																	A.ZONA_18,
																	A.ZONA_19,
																	A.FORMA_IRREGULAR,
																	A.FORMA_ND_FORMA,
																	A.FORMA_REGULAR
																FROM INTUS.VIEW_TERRENO_FORMAT A;`, [] ).then( ( arrayReturnResult: any ) => {
		return arrayReturnResult;
	} );
	const dataSetMatrix: any  = [];
	const dataSetLabels: any  = [];
	Object.entries( dataSetTraingValues[ 'data-rows' ] )
		  .forEach( ( values: any ) => {
			  if( Number( values[ 1 ].cantidad_terreno_usm2 ) !== undefined ) {
				  dataSetLabels.push( [
					  parseFloat( values[ 1 ].cantidad_terreno_usm2 || 0 ),
				  ] );
			  }
		  } );
	Object.entries( resultData[ 'data-rows' ] )
		  .forEach( ( values: any ) => {
			  dataSetMatrix.push( [
				  parseFloat( values[ 1 ].cantidad_terreno_m2 || 0 ),
				  parseFloat( values[ 1 ].informacion_frente || 0 ),
				  parseFloat( values[ 1 ].informacion_fondo || 0 ),
				  values[ 1 ].year_2016, values[ 1 ].year_2017, values[ 1 ].year_2018, values[ 1 ].year_2019, values[ 1 ].year_2020, values[ 1 ].year_2021, values[ 1 ].year_2022, values[ 1 ].year_2023, values[ 1 ].year_2024,
				  values[ 1 ].g2, values[ 1 ].g3, values[ 1 ].g4, values[ 1 ].g5,
				  values[ 1 ].zona_01, values[ 1 ].zona_02, values[ 1 ].zona_03, values[ 1 ].zona_04, values[ 1 ].zona_05, values[ 1 ].zona_06, values[ 1 ].zona_07, values[ 1 ].zona_08, values[ 1 ].zona_09, values[ 1 ].zona_10, values[ 1 ].zona_11, values[ 1 ].zona_12, values[ 1 ].zona_13, values[ 1 ].zona_14, values[ 1 ].zona_15, values[ 1 ].zona_16, values[ 1 ].zona_17, values[ 1 ].zona_18, values[ 1 ].zona_19,
				  values[ 1 ].forma_irregular, values[ 1 ].forma_nd_forma, values[ 1 ].forma_regular,
			  ] );
		  } );
	const fileUniqueID   = uuid();
	const streamFilename = `result-entries-${ fileUniqueID }.txt`;
	const streamFile     = fs.createWriteStream( streamFilename );
	streamFile.on( 'error', ( errorObject => {
		console.log( errorObject );
	} ) );
	dataSetMatrix.forEach( ( value: any ) => {
		streamFile.write( value.join( ', ' ) + '\n' );
	} );
	streamFile.end();
	console.log( 'file-created ' + streamFilename );
	/*--- ORIGINAL-SCRIPT ---*/
	R( './src/common-Rscripts/booster-script-terrenos.R' ).data( { arrayLabel: dataSetLabels, streamFilename: streamFilename } ).call( ( error: any, result: any ) => {
		if( error ) {
			return response.status( 500 ).send( error );
		}
		fs.unlinkSync( streamFilename );
		console.log( 'file-deleted ' + streamFilename );
		return response.status( 200 ).send( result );
	} );
} );
router.get( '/terrenos/predict/:avaluoIndex', async( request, response ) => {
	const avaluoIndex           = request.params.avaluoIndex;
	const datasetAvaluoValue    = await commonQuerySQL( 'SELECT * FROM INTUS.VIEW_TERRENO_FORMAT WHERE INFORMACION_AVALUO =$1::numeric', [ avaluoIndex ] )
	.then( resultObject => resultObject );
	const dataSetCustomerValues = parseDataValues( datasetAvaluoValue );
	/*--- PREDICT ---*/
	try {
		R( './src/common-Rscripts/predict-script-terrenos.R' ).data( { customerValues: dataSetCustomerValues } ).call( ( error: any, result: any ) => {
			if( error ) {
				return response.status( 500 ).send( error );
			}
			return response.status( 200 ).send( result );
		} );
	} catch( e ) {
		return response.status( 500 ).send( e );
	}
} );
router.post( '/terrenos/request/', async( request, response ) => {
	const dataSetCustomerValues = parsePostDataValues( request.body );
	/*--- PREDICT ---*/
	try {
		R( './src/common-Rscripts/predict-script-terrenos.R' ).data( { customerValues: dataSetCustomerValues } ).call( ( error: any, result: any ) => {
			if( error ) {
				return response.status( 500 ).send( error );
			}
			return response.status( 200 ).send( result );
		} );
	} catch( e ) {
		return response.status( 500 ).send( e );
	}
} );
router.post( '/terrenos/request-data', async( request, response, next ) => {
	const request_zona = request.body.request_zona;
	const request_pot  = request.body.request_pot;
	/*--- PREDICT ---*/
	try {
		const datasetRequestClass = await commonQuerySQL( 'SELECT A.ZONA, A.CLASIFICACION_POT, A.CLASIFICACION_ERROR, A.CLASIFICACION FROM INTUS.INTUS_CLASIFICADOR_TERRENO_ZONAPOT A WHERE A.ZONA =$1 AND A.CLASIFICACION_POT =UPPER($2)', [ request_zona, request_pot ] )
		.then( resultObject => resultObject );
		return response.status( 200 ).send( datasetRequestClass );
	} catch( e ) {
		return response.status( 500 ).send( e );
	}
} );
export default router;
