var express = require('express');
var router = express.Router();
var speakeasy = require('speakeasy');
var qrcode = require('qrcode-npm');

var funkcije = require('./funkcije')

var options = require('./dbconfig');

//
// Postresql
//

var Pool = require('pg').Pool;
var config = {
  user: 'matjaz',
  password: 'mesnjak',
  database: 'supervizor',
  host: 'server.dev',
  port: 5432,
  max: 10,
  idleTimeoutMillis: 30000,
};
var pool = new Pool(config);

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('OK');
});

router.get('/registracija', function(req, res, next) {
  var secret = speakeasy.generateSecret();
  var qr = qrcode.qrcode(5, 'M');
  qr.addData(secret.otpauth_url);
  qr.make();
  var imgTag = qr.createImgTag(4);
  res.render('user/registracija', {title:"Registracija", tempSecret: secret.base32, imgtag: imgTag});
});

router.post('/registracija', function(req, res, next) {
  console.log(req.body.uporabniskoime + ' ' + req.body.secret + ' ' + req.body.tempsecret);
  var uporabnik = req.body.uporabniskoime;
  var userToken = req.body.secret;
  var base32secret = req.body.tempsecret;
  var verified = speakeasy.totp.verify({secret: base32secret, encoding: 'base32', token: userToken});
  
  if(verified) {
    pool.query('INSERT INTO uporabniki (ime, secret) values($1, $2)', [uporabnik, base32secret], function(err) {
        if(err) {
        res.render('user/registracija', {title: "Ime je že zasedeno", tempSecret: err, imgtag: ""})
        } else {
        res.render('user/prijava', {title: "Registracija uspela. Lahko se prijavite"})
        }
    });
  } else {
    res.render('user/registracija', {title: "Napačno geslo", tempSecret: "", imgtag: ""})
  }
})

router.get('/prijava', function(req, res, next) {
  res.render('user/prijava', {title: "Prijava"});
})

router.post('/prijava', function(req, res, next) {
  var uporabnik = req.body.uporabniskoime;
  var userToken = req.body.secret;
  var naprava = req.headers['user-agent'];
  pool.query('SELECT secret, id FROM uporabniki where ime = $1', [uporabnik], function(err, result) {
    if(err) {
      res.render('user/prijava', {title: "Napaka pri povezavi na bazo"});
      console.log('Napaka pri povezavi na bazo: '+ err);
    } else {
      if(!result.rows[0]) {
        res.redirect('/user/prijava');
      } else {
        var base32secret = result.rows[0].secret;
        var userid = result.rows[0].id;
        var verified = speakeasy.totp.verify({secret: base32secret, encoding: 'base32', token: userToken})
        if(verified) {
          var randomNumber=Math.random().toString();
          randomNumber=randomNumber.substring(2,randomNumber.length);
          pool.query('INSERT INTO seja VALUES ($1, $2, now()+ interval \'30 days\', $3)', [userid, randomNumber, naprava], function(err) {
            if(err) {
              res.render('user/prijava', {title: "Prijava ni uspela"});
            } else {
              res.cookie('uplink',randomNumber, { maxAge: 30 * 24 * 60 * 60 * 1000, httpOnly: true });
              console.log('cookie created successfully');
              res.redirect('/user/profil');
            }
          })
        } else {
          res.render('user/prijava', {title: "Prijava ni uspela"});
        }
      }
    }
  })
})

router.get('/profil', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jePrijavljen(sessionid, function(err, result) {
    if(err) {
      res.redirect('/user/prijava');
    }
    else {
      res.render('user/profil', {title: 'Profil uporabnika ' + result.ime, uporabnik: result})
    }
  })
})

router.get('/api/vseseje', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jePrijavljen(sessionid, function(err, result) {
    if(err) {
      res.send({napaka: err});
    }
    else {
      pool.query('SELECT * FROM seja WHERE userid = $1', [result.id], function(err, result) {
        if(err) {
          res.send({napaka: err});
        }
        else {
          var seje = {}
          seje.data = result.rows
          res.send(seje)
        }
      })
    }
  })
})

router.get('/api/zbrisisejo/:sid', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jePrijavljen(sessionid, function(err, result) {
    if(err) {
      res.send({napaka: err});
    }
    else {
      pool.query('DELETE FROM seja WHERE userid = $1 AND sid = $2', [result.id, req.params.sid], function(err) {
        if(err) {
          res.send({napaka: err});
        }
        else {
          console.log('Brišem sejo ...')
          res.send('OK')
        }
      })
    }
  })
})

router.get('/odjava', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jePrijavljen(sessionid, function(err, result) {
    if(err) {
      res.redirect('/')
    }
    else {
      pool.query('DELETE FROM seja WHERE userid = $1 AND sid = $2', [result.id, sessionid], function(err) {
        if(err) {
          res.redirect('/')
        }
        else {
          console.log('Brišem sejo ... odjava')
          res.clearCookie('uplink')
          res.redirect('/')
        }
      })
    }
  })
})

router.post('/api/shrani', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  var setIme = req.body.setIme;
  var setJS = req.body.setJS;
  var setZS = req.body.setZS;
  funkcije.jePrijavljen(sessionid, function(err, result) {
    if(err) {
      res.send({napaka: err});
    }
    else {
      pool.query('INSERT INTO seti (userid, ime, set_js, set_zs) VALUES ($1, $2, $3, $4)', [result.id, setIme, setJS, setZS], function(err) {
        if(err) {
          res.send({napaka: err});
        }
        else {
          res.send('OK')
        }
      })
    }
  })
})

router.get('/api/vsiseti', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jePrijavljen(sessionid, function(err, result) {
    if(err) {
      res.send({napaka: err});
    }
    else {
      pool.query('SELECT * FROM seti WHERE userid = $1', [result.id], function(err, result) {
        if(err) {
          res.send({napaka: err});
        }
        else {
          var seti = {}
          seti.data = result.rows
          res.send(seti)
        }
      })
    }
  })
})

router.get('/api/zbrisiset/:id', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jePrijavljen(sessionid, function(err, result) {
    if(err) {
      res.send({napaka: err});
    }
    else {
      pool.query('DELETE FROM seti WHERE userid = $1 AND id = $2', [result.id, req.params.id], function(err) {
        if(err) {
          res.send({napaka: err});
        }
        else {
          res.send('OK')
        }
      })
    }
  })
})

router.get('/api/getset/:id', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jePrijavljen(sessionid, function(err, result) {
    if(err) {
      res.send({napaka: err});
    }
    else {
      pool.query('SELECT * FROM seti WHERE userid = $1 AND id=$2', [result.id, req.params.id], function(err, result) {
        if(err) {
          console.log('Napaka 3 ' + err)
          res.send({napaka: err});
        }
        else {
          res.send(result.rows[0])
        }
      })
    }
  })
})

router.get('/api/zbrisiuporabnika/:id', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jeAdmin(sessionid, function(err, result) {
    if(err) {
      res.send({napaka: err});
    }
    else {
      var napaka;
      pool.query('DELETE FROM uporabniki WHERE id = $1', [req.params.id], function(err) {
        if(err) {
          console.log('Napaka 3 ' + err)
          napaka += err + '\n';
        }
      })
      pool.query('DELETE FROM seja WHERE userid = $1', [req.params.id], function(err) {
        if(err) {
          console.log('Napaka 3 ' + err)
          napaka += err + '\n';
        }
      })
      if(napaka) {
        res.send({napaka: napaka})
      }
      else {
        res.send('OK')
      }
    }
  })
})

router.get('/api/vsiuporabniki', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jeAdmin(sessionid, function(err, result) {
    if(err) {
      res.send({err: "Niste prijavljeni"})
    }
    else {
      pool.query('SELECT * FROM uporabniki', [], function(err, result) {
        if(err) {
          res.send({napaka: err});
        }
        else {
          var seti = {}
          seti.data = result.rows
          res.send(seti)
        }
      })
    }
  })
})

router.get('/admin', function(req, res, next) {
  var sessionid = req.cookies.uplink;
  funkcije.jeAdmin(sessionid, function(err, result) {
    if(err) {
      res.redirect('/user/prijava');
    }
    else {
      res.render('user/admin', {uporabnik: result, title: 'Administracija uporabnikov'})
    }
  })
})

module.exports = router;