var express = require('express')
, http = require('http')
, path = require('path')
, url= require('url')
, querystring = require('querystring')
, crypto = require('crypto')
, mysql = require('mysql')
, fs=require('fs')
, formidable= require('formidable')
, app = express()
, port = process.env.PORT || 3000
, server = http.createServer(app)
, io = require('socket.io').listen(server)
, sanitizer = require('sanitizer')
, latitud
, longitud;
var exec = require('child_process').exec;

server.listen(port);
var ficheros=new Array;
var usuarios = [];
/*------ Configuro app-------- */

app.configure(function(){  
	app.set('views', __dirname + '/views');
	app.set('view engine', 'html');
	app.use(express.bodyParser({uploadDir: './views/uploads'}));
	app.use(express.favicon());
	app.use(express.logger('dev'));
	app.use(express.bodyParser());
	app.use(express.methodOverride());
	app.use(express.cookieParser('your secret here'));
	app.use(express.session({secret: 'esto es secreto',cookie: {maxAge: 600000}}));
	//app.use(app.router);
	app.use(express.static(path.join(__dirname, 'views')));
});

console.log('Server running at http://localhost:3000/');

/*-----La base de datos------ */

var connection =mysql.createConnection({
	host:'localhost',
	user:'root',
	password:'pass'
});

  connection.connect();
  connection.query('USE Usuarios'); /* La base de datos y la tabla correspondiente al login */
  connection.query('CREATE TABLE IF NOT EXISTS User' + '(id INT(25) AUTO_INCREMENT,' + 'usuario VARCHAR (255),' + 'password VARCHAR (15),' +'PRIMARY KEY (id))');
  connection.query('CREATE TABLE IF NOT EXISTS Mensaje' + '(id INT(25) AUTO_INCREMENT,' + 'usuario_envia VARCHAR (255),' + 'usuario_receptor VARCHAR (255),' + 'mensaje VARCHAR (455),' + 'PRIMARY KEY (id))');
  
  connection.query('CREATE TABLE IF NOT EXISTS Fotos' + '(id INT(25) AUTO_INCREMENT,' + 'usuario VARCHAR (255),' + 'img VARCHAR (5000000),' + 'nombre VARCHAR (50),' +'texto VARCHAR (455),' +'tipo VARCHAR (15),' +'edad VARCHAR (20),' +'sexo VARCHAR (20),' +'PRIMARY KEY (id))');
  connection.query('CREATE TABLE IF NOT EXISTS Fotos_Subidas' + '(id INT(25) AUTO_INCREMENT,' + 'usuario VARCHAR (255),' + 'img VARCHAR (5000000),' +'PRIMARY KEY (id))');
  connection.query('CREATE TABLE IF NOT EXISTS QR' + '(id INT(25) AUTO_INCREMENT,' + 'usuario VARCHAR (255),' + 'Codigo VARCHAR (4000) ,' +'PRIMARY KEY (id))');
  connection.query('CREATE TABLE IF NOT EXISTS Videos' + '(id INT(25) AUTO_INCREMENT,' + 'usuario VARCHAR (255),' + 'video VARCHAR (5000000),'+ 'nombre VARCHAR (50),' +'texto VARCHAR (455),' +'audio VARCHAR (20),' +'PRIMARY KEY (id))');
  connection.query('CREATE TABLE IF NOT EXISTS Localizacion' + '(id INT(25) AUTO_INCREMENT,' + 'usuario VARCHAR (255),' + 'foto VARCHAR (5000000),' + 'latitud VARCHAR (255),' +'longitud VARCHAR (255),' +'PRIMARY KEY (id))');
 
  
  /*---------------Sesiones---------------*/
  
var usuario;
var user_contest;
function login(req, res, next){  
	console.log("sesionnnnn");
	console.log(req.session.username);
	console.log(req.session.id);
	if(req.session.username){
		next();
		console.log("Existe el usuario!");
		usuario=req.session.username;
	}else{ 
		res.redirect('/login');
		console.log("Usuario inexistente!");
	}
}

function encriptar(cadena){ //encriptamos con md5 la contraseña aportandole seguridad//
	var myString = cadena;
	return crypto.createHash('md5').update(myString).digest("hex");
}
  
/* -----La sección de rutas --- */

app.get('/login',  function(req, res){
	if(req.session.username){
		res.redirect('/menu');
	}else{
		console.log("get");
		res.sendfile(__dirname +'/views/login.html');
	}});
app.get('/usuario', function(req,res){
	res.sendfile(__dirname + '/views/Perfil.html');
})
app.get('/menu',login,function(req, res){
	res.sendfile(__dirname + '/views/menu.html');
}); 
app.get('/video',login, function(req,res){
	res.sendfile(__dirname + '/views/video.html');	
});
app.get('/mos_video',login,function(req,res){
	res.sendfile(__dirname + '/views/Galeria_Video.html');
});
app.get('/index',login,function(req,res){
	res.sendfile(__dirname + '/views/index.html');
});
app.get('/mos_foto',login,function(req,res){
	res.sendfile(__dirname + '/views/mos_foto.html');
});
app.get('/Busqueda',login,function(req,res){
	res.sendfile(__dirname + '/views/Busqueda.html');
});

app.get('/Foto_loc',login,function(req,res){
	res.sendfile(__dirname + '/views/Foto_Loc.html');
});
app.get('/Galeria_Loc',login,function(req,res){
	res.sendfile(__dirname + '/views/GaleriaFotoLoc.html');
});
app.get('/Cod_qr',login,function(req,res){
	res.sendfile(__dirname + '/views/Generar_qr.html');
});
app.get('/Lec_qr',login,function(req,res){
	res.sendfile(__dirname + '/views/Lector_qr.html');
});
app.get('/rescate',login,function(req,res){
	res.sendfile(__dirname + '/views/Distancia.html');
});
app.get('/upload',login,function(req,res){
	res.sendfile(__dirname + '/views/Upload.html');
});
app.get('/mos_up',login,function(req,res){
	res.sendfile(__dirname + '/views/Img_up.html');
});
//Uso simple
app.get('/Adopcion',login,function(req,res){
	res.sendfile(__dirname + '/views/Requisitos.html');
});
app.get('/Socio',login,function(req,res){
	res.sendfile(__dirname + '/views/Socio.html');
});
app.get('/Simpatizante',login,function(req,res){
	res.sendfile(__dirname + '/views/Simpatizante.html');
});
app.get('/Voluntario',login,function(req,res){
	res.sendfile(__dirname + '/views/Voluntario.html');
});
app.get('/Anuncios',login,function(req,res){
	res.sendfile(__dirname + '/views/Anuncios.html');
});
app.get('/Chat',login,function(req,res){
	res.sendfile(__dirname + '/views/Chat.html');
});
app.get('/Mensaje/:user/',login,function(req,res){
	console.log("!!!!!!!!!!!!!!!!!!");
	user_contest=req.params.user;
	//var user_contest2=user_contest[1];
	console.log(user_contest);
	console.log("el usuario al que enviamos el mensaje es");
	console.log(user_contest);
	res.sendfile(__dirname + '/views/Mensajes.html');
});
app.get('/Mensaje/:user/:cosa',login,function(req,res){
	console.log("no haces nada");
	res.sendfile(__dirname + '/views/Mensajes.html');
});
app.get('/logout', function(req, res){
	  console.log("entro");
	  usuarios.splice(usuarios.indexOf(usuario), 1);
      io.sockets.emit('desconectarUsuario', {nick : usuario, listaUsuarios : usuarios});
      console.log('usuario desconectado: ' + usuario);
      delete req.session.username;
	  res.redirect('/login');
});
//Metodo post
var uploadedFile
,tmpPath
,targetPath
,troceado
,longitud;
app.post('/fileUpload', login, function(req, res) {
		   var uploadedFile = req.files.uploadingFile;
		    var tmpPath = uploadedFile.path;
		    var targetPath = './views/uploads/' + uploadedFile.name;
		    var b=tmpPath.split("\\");
		    var l=b.length;
		    console.log(uploadedFile.name);
		    console.log(uploadedFile.originalFilename);
		    var path= './uploads/' + uploadedFile.originalFilename;
		    fs.rename(tmpPath, targetPath, function(err) {
		        if (err) throw err;
		        fs.unlink(tmpPath, function() {
		            if (err) throw err;
		            connection.query('INSERT INTO Fotos_Subidas (usuario, img) values (' 
		            		+ "'" + usuario + "'" +',' + "'" + path + "'" +  ');');  
		            res.send('File Uploaded to ' + targetPath + ' - ' 
		            		+ uploadedFile.size + ' bytes');
		        });
		    });
		});

var usr,
pass,
id,
opcion;
app.post('/login', function(req, res){
	console.log("aqui si");
	console.log(res.cookie);
	console.log('PETICION POST EN PROCESO........');
	usr = req.body.username;	
	pass = req.body.password;
	opcion = req.body.submit;
	console.log(opcion);
	console.log('El usuario que se ha logueado es....', usr);
	connection.query('USE Usuarios');
	connection.query('SELECT * FROM User WHERE usuario LIKE "'+ usr +'"', function(err,rows,fields){
		if (err) throw err;
			if ((opcion=="Register")){
				if (rows.length>0){
					io.sockets.emit('RegIn','ko');
				}else{
					connection.query('INSERT INTO User (usuario, password) values (' + "'" + usr + "'" +',' + "'" + pass + "'" +  ');');
					io.sockets.emit('RegIn','ok');
				}
			}
	});
	connection.query('SELECT * FROM User WHERE usuario LIKE "'+ usr +'"AND password LIKE "'+ pass +'"', function(err,rows,fields){
		if ((opcion=="Login")&&(rows.length>0)){   
			console.log("El usuario esta correctamente logueado");
			req.session.username=usr;
			id= req.session.id;
			console.log(req.session.id);
			
			//usuarios.push(req.session.username);
			 //usuariosOnline[username] = usr;
			if(usuarios.indexOf(usr) >= 0){
	           console.log("nombre ocupado");
	        }else{
	        	usuarios.push(usr);
	            console.log('Usuario conectado: ' + usuario);
	        }
			//Enviamos a todos los usuarios que se ha unido uno nuevo.
            
			res.redirect("/menu");
			}
		if ((opcion=="Login")&&(rows.length===0)){
			console.log("Ese usuario no existe");
			io.sockets.emit('retuLogIn','ko');
		}
	});	
 });
/*----------------VIDEO-----------------------*/
function writeToDisk(dataURL, fileName) {
    var fileExtension = fileName.split('.').pop(),
        fileRootNameWithBase = './views/uploads/' + fileName,
        filePath = fileRootNameWithBase,
        fileID = 2,
        fileBuffer;

    while (fs.existsSync(filePath)) {
        filePath = fileRootNameWithBase + '(' + fileID + ').' + fileExtension;
        fileID += 1;
    }
    
    dataURL = dataURL.split(',').pop();
    fileBuffer = new Buffer(dataURL, 'base64');
    fs.writeFileSync(filePath, fileBuffer);
    console.log("ESTOY EN WRITETODISK!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log('filePath', filePath);
}

function merge(socket, audioName, videoName) {
    // detect the current operating system
    var isWin = !!process.platform.match( /^win/ );

    if (isWin) {
        ifWin(socket, audioName, videoName);
    } else {
        ifMac(socket, audioName, videoName);
    }
    readFfmpeOutput(audioName, socket);
}
var ffmpeg_finished = false;
function ifWin(socket, audioName, videoName) {
    var merger = __dirname + '\\views\\merger.bat';
    var audioFile = __dirname + '\\views\\uploads\\' + audioName;
    var videoFile = __dirname +'\\views\\uploads\\' + videoName;
    console.log(audioFile);
    console.log(videoFile);
    var mergedFile = __dirname + '\\views\\uploads\\' + audioName.split('.')[0] + '-merged.webm';
console.log("no llego a este punto");
    console.log(mergedFile);
    var command = "C:\\ffmepg\\bin\\ffmpeg.exe" + " " + " -i " + videoFile + " " + " -i " + audioFile + "  " + mergedFile + '';
    console.log("El comando esssssssssssssssssssssss");
    console.log(command);
    var cmd = exec(command, function(error) {
        if (error) {
            console.log(error.stack);
            console.log('Error code: ' + error.code);
            console.log('Signal received: ' + error.signal);
        } else {
        	ffmpeg_finished = true;
        	socket.emit('merged', audioName.split('.')[0] + '-merged.webm');
            setTimeout(function() {
            //fs.unlink(mergedFile);
                console.log("33333333333");
            }, 60 * 1000);
        }
    });
}

function readFfmpeOutput(fName, socket) {
	     if (ffmpeg_finished) return;
	     fs.readFile('ffmpeg-output/' + fName.split('.')[0] + '.txt', 'utf8', function (err, content) {
	         if (!err && content.match(/Duration: (.*?), start:/)) {
	             var duration = 0,
	                 time = 0,
	                 progress = 0;
	             var resArr = [];
	             var matches = (content) ? content.match(/Duration: (.*?), start:/) : [];
	             if (matches.length > 0) {
	                 var rawDuration = matches[1];
	                 var ar = rawDuration.split(":").reverse();
	                 duration = parseFloat(ar[0]);
	                 if (ar[1]) duration += parseInt(ar[1]) * 60;
	                 if (ar[2]) duration += parseInt(ar[2]) * 60 * 60;
	                 matches = content.match(/time=(.*?) bitrate/g);
	                 if (content.match(/time=(.*?) bitrate/g) && matches.length > 0) {
	                     var rawTime = matches.pop();
	                     rawTime = rawTime.replace('time=', '').replace(' bitrate', '');
	                     ar = rawTime.split(":").reverse();
	                     time = parseFloat(ar[0]);
	                     if (ar[1]) time += parseInt(ar[1]) * 60;
	                     if (ar[2]) time += parseInt(ar[2]) * 60 * 60;
	                     progress = Math.round((time / duration) * 100);
	                 }
	 
	                 socket.emit('ffmpeg-output', progress);
	             } else if (content.indexOf('Permission denied') > -1) {
	                 socket.emit('ffmpeg-error', 'ffmpeg : Permission denied, either for ffmpeg or upload location ...');
	             }
	 
	             readFfmpeOutput(fName, socket);
	         } else setTimeout(function() {
	             readFfmpeOutput(fName, socket);
	         }, 500);
	     });
	 }



/*-----------------------Socket--------------------------*/

io.sockets.on('connection', function (socket) {
	socket.nick=usuario;
	socket.on('lista',function(data){
		console.log("aqui si");
		socket.emit('nuevoUsuario', {nick : usuario , listaUsuarios : usuarios});
	});
	
	 
	socket.on('login', function(log){
		console.log('logueado'); 
	}) ;
	socket.on('foto',function(img, nombre, texto, tipo, edad, sexo, res){
		connection.query('USE Usuarios');
		console.log(usuario);
		connection.query('INSERT INTO Fotos (usuario, img, nombre, texto, tipo, edad, sexo) values (' + "'" + usuario + "'" +',' + "'" + img + "'" +',' + "'" + nombre + "'"+',' + "'" + texto + "'"+',' + "'" + tipo + "'"+',' + "'" + edad + "'"+',' + "'" + sexo + "'"+  ');');  
		socket.emit('procesado', "process");
	});
	socket.on('mostrar_foto',function(m){
		connection.query('SELECT * FROM Fotos', function(err,rows,fields){
		var numero=rows.length;
		//var img=rows[1];
		
		socket.emit('numero',numero,rows);	
		});
	});
	socket.on('mostrar_foto2',function(m){
		connection.query('SELECT * FROM Fotos', function(err,rows,fields){
		var numero=rows.length;
		var img=rows[1];
		//console.log(rows[0].img);
		socket.emit('numero2',numero,rows);	
		});
	});
	socket.on('imagenes_subidas',function(m){
		connection.query('SELECT * FROM Fotos_Subidas WHERE usuario LIKE "'+ usuario +'"', function(err,rows,fields){
		var numero=rows.length;
		var img=rows[1];
		console.log(rows[0].img);
		socket.emit('Longitud',rows[0].img);
	    
		});
	});
	socket.on('Fotos_usuario',function(){
		connection.query('SELECT * FROM Fotos WHERE usuario LIKE "'+ usuario +'"', function(err,rows,fields){
			socket.emit('Fotos_recibidas',rows);	
			});
	});
	socket.on('Mensajes_usuario',function(){
		console.log(usuario);
		connection.query('SELECT * FROM Mensaje WHERE usuario_envia LIKE "'+ usuario +'"', function(err,rows,fields){
			var numero=rows.length;
			socket.emit('Mensajes_recibidos',rows, numero);	
			});
	});
	socket.on('Cnt_usuario',function(){
		console.log("estoy en cnt usuar");
		console.log(user_contest);
		socket.emit('nameUsuar',user_contest);
	});
	socket.on('Mens',function(name,mens){
		console.log("entro aqui en mensaje");
		connection.query('INSERT INTO Mensaje (usuario_envia, usuario_receptor, mensaje) values (' + "'" + usuario + "'" +',' + "'" + name + "'" +',' + "'" + mens + "'" + ');');
		socket.emit('Mens_recibido');
	});
	socket.on('Visualizacion_up', function(dato){
		connection.query('SELECT * FROM Fotos_Subidas WHERE usuario LIKE "'+ usuario +'"', function(err,rows,fields){
			//fs.readFile(rows[dato].img, function(error, file) {
				//fs.writeFile('image_orig.jpg', file, function(err) {});
			    //var base64Image = file.toString('base64');
			    //console.log(base64Image);
			    //var decodedImage = new Buffer(base64Image, 'base64');
			    //fs.writeFile('image_decoded.jpg', decodedImage, function(err) {});
	           // if(error) {
	            //	console.log("super errorrrrrrrrrrrrrrrrr");
	               socket.emit('subidas',rows[dato].img);
	            //} else {
	            	//socket.emit('subidas',base64Image);

	            //}
	         // });
		});
	});
	socket.on('Guardo_localizacion',function(imagen,latitud,longitud){
		connection.query('USE Usuarios');
		console.log(usuario);
		connection.query('INSERT INTO Localizacion (usuario, foto, latitud, longitud) values (' + "'" + usuario + "'" +',' + "'" + imagen + "'" +',' + "'" + latitud + "'"  +',' + "'" + longitud + "'" + ');');
		socket.emit('Procesado_localizacion', "Localización guardada"); 
	}) ;
	socket.on('Mostrar_Localizaciones',function(m){
		console.log("He entrado en Mostrar Localizaciones");
		connection.query('SELECT * FROM Localizacion ', function(err,rows,fields){
		var numero=rows.length;
		//var img=rows[1];
		//console.log(rows[0].img);
		socket.emit('Salvemoslos',numero,rows);	
		});	
	});
	socket.on('coordenadas',function(lat,lon){
		latitud=lat;
		longitud=lon;
	});
	socket.on('Distancia',function(m){
		console.log(latitud);
		console.log(longitud);
		socket.emit('LatLon',latitud,longitud);
	});
	socket.on('guarda_qr',function(imagen){
		console.log('Codigo qr generado');
		console.log(imagen);
		connection.query('USE Usuarios');
		console.log(usuario);
		connection.query('INSERT INTO QR (usuario, Codigo) values (' + "'" + usuario + "'" +',' + "'" + imagen + "'" +  ');');
		socket.emit('guardado', "Codigo qr guardado"); 
	});
	socket.on('vid',function(video){
		console.log('video recibido');
		console.log(video);
		connection.query('USE Usuarios');
		console.log(usuario);
		//var json = querystring.stringify(video);
		console.log("SERIALIZOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO");
		//console.log(json);
		//var src=video.split("/");
		//var vid=src[3];
		//console.log(vid);
		console.log(video);
		console.log("la image es ")
		console.log(video.image);
		var pvideos='./views/uploads/'+ video.image;
		//console.log(video.frames[0]);
		connection.query('INSERT INTO Videos (usuario, video, nombre, texto, tipo, edad, sexo) values (' + "'" + usuario + "'" +',' + "'" + videos +"'" +',' + "'" + nombre + "'"+',' + "'" + texto + "'"+',' + "'" + tipo + "'"+',' + "'" + edad + "'"+',' + "'" + sexo + "'" +  ');');
		console.log("aqui zi");
		socket.emit('video_guard', "video guardado"); 
	});
	socket.on('video_env',function(m){
		connection.query('SELECT * FROM Videos ', function(err,rows,fields){
			socket.emit('video_rec',rows);
		});	
	});
	socket.on('mostrar_video',function(m){
		console.log("aqui si");
		console.log(m);
			//connection.query('SELECT * FROM QR WHERE usuario LIKE "'+ usuario +'"', function(err,rows,fields){
		connection.query('SELECT * FROM Videos WHERE usuario LIKE "'+ usuario +'"', function(err,rows,fields){
				//var img=rows[1];
		console.log("entro");
		console.log(videos[0]);
		console.log(rows[0].video);
		var v=rows[0].video
		console.log("DESERIALIZOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO");
		console.log(videos[0]);
		var instance2 = querystring.parse(rows[0].video);
		console.log(instance2);
		socket.emit('mostrar_vid',instance2);	
		});
	});
	socket.on('busqueda',function(nombre,  tipo, edad, sexo){
		connection.query('SELECT * FROM Fotos WHERE (nombre, tipo, edad, sexo) LIKE "'+ nombre + "'" +',' + "'"+ tipo +"'" +',' + "'"+ edad + "'" +',' + "'"+ sexo +"'" , function(err,rows,fields){
			//var img=rows[1];
			console.log("entro");
			console.log(rows);
			socket.emit('procesado_busqueda',rows);
				
			});
		});
	//Chat!!!!!!!!!!!!!!
	socket.on("ListadoUsuarios",function(){
		console.log("si");
		connection.query('SELECT * FROM User', function(err,rows,fields){
			var num=rows.length;
			socket.emit("LosUsuarios",rows,num);
		});
	});
	
	socket.on('msg', function (data) {
		console.log("1111111111111111111111111111111111");
		
        //data.msg = sanitizer.escape(data.msg);
        io.sockets.emit('msg', {nick:socket.nick,msg:data});
    });
	socket.on('disconnect', function(){

        if( socket.nick ){
            usuarios.splice(usuarios.indexOf(socket.nick), 1);
            io.sockets.emit('desconectarUsuario', {nick : socket.nick, listaUsuarios : usuarios});
            console.log('usuario desconectado: ' + socket.nick);
        }

    });
	socket.on('most_fotos_up',function(){
		connection.query('SELECT * FROM Fotos_Subidas ', function(err,rows,fields){
			var n=rows.length;
			console.log(n);
			var i;
			
			socket.emit("ficheros",rows);
		});
	});
	socket.on('message', function(data,nombre, historia) {
		ffmpeg_finished = false;
        console.log('writing to disk');
        console.log(data.video.name);
        console.log(data.video.dataURL);
        connection.query('INSERT INTO Videos (usuario, video, nombre, texto, audio) values (' + "'" + usuario + "'" +',' + "'" + data.video.name +"'" +',' + "'" + nombre + "'"+',' + "'" + historia + "'"+',' + "'" + data.video.audio + "'" +  ');');
    	
        writeToDisk(data.audio.dataURL, data.audio.name);
        if(data.video) {
        	             writeToDisk(data.video.dataURL, data.video.name);
        	             merge(socket, data.audio.name, data.video.name);
        	         }
        	         
        	         // if it is firefox or if user is recording only audio
        	         else socket.emit('merged', data.audio.name);
    });
	socket.on("newMessage", function(data){
		socket.emit("sendEvent", data);
	});
});


