/*--- IMPORTS ---*/
import express                                  from 'express';
import commonQuerySQL                           from '../common-database/index';
import { parseDataValues, parsePostDataValues } from '../common-defaults/common.defaults.apartamentos';
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( '/apartamentos/prepare', async( request, response ) => {
	const dataSetMatrix: any  = [];
	const dataSetLabels: any  = [];
	const dataSetTraingValues = await commonQuerySQL( 'SELECT A.CANTIDAD_CONSTRUCCIONES_USM2 FROM INTUS.VIEW_APARTAMENTO_FORMAT A;', [] ).then( async( arrayReturnResult ) => {
		return arrayReturnResult;
	} );
	const resultData          = await commonQuerySQL( `SELECT A.CANTIDAD_CONSTRUCCIONES_M2,
										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 FROM INTUS.VIEW_APARTAMENTO_FORMAT A;`, [] ).then( ( arrayReturnResult: any ) => {
		return arrayReturnResult;
	} );
	Object.entries( dataSetTraingValues[ 'data-rows' ] )
		  .forEach( ( values: any ) => {
			  if( Number( values[ 1 ].cantidad_construcciones_usm2 ) !== undefined ) {
				  dataSetLabels.push( [
					  values[ 1 ].cantidad_construcciones_usm2,
				  ] );
			  }
		  } );
	Object.entries( resultData[ 'data-rows' ] )
		  .forEach( ( values: any ) => {
			  dataSetMatrix.push( [
				  parseFloat( values[ 1 ].cantidad_construcciones_m2 || 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,
			  ] );
		  } );
	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-apartamentos.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( '/apartamentos/predict/:avaluoIndex', async( request, response ) => {
	const avaluoIndex           = request.params.avaluoIndex;
	const datasetAvaluoValue    = await commonQuerySQL( 'SELECT * FROM INTUS.VIEW_APARTAMENTO_FORMAT WHERE INFORMACION_AVALUO =$1::numeric', [ avaluoIndex ] )
	.then( resultObject => resultObject );
	const dataSetCustomerValues = parseDataValues( datasetAvaluoValue );
	/*--- PREDICT ---*/
	try {
		R( './src/common-Rscripts/predict-script-apartamentos.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( '/apartamentos/request', async( request, response ) => {
	const dataSetCustomerValues = parsePostDataValues( request.body );
	/*--- PREDICT ---*/
	try {
		R( './src/common-Rscripts/predict-script-apartamentos.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( '/apartamentos/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, B.PRECIO FROM INTUS.INTUS_CLASIFICADOR_APARTAMENTO_ZONAPOT A LEFT JOIN INTUS.INTUS_PRECIOS_PARQUEOS B ON A.ZONA = B.ZONA 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;
