const methods = require('./methods')
const async = require('async')
const helpers = require('./helpers')

const pictSizeLimit = 1000000 // 1 MB

module.exports = function (app) {
 
  // ======== APP ROUTES - PROJECT ====================
  var lang = 'DE'

  app.get('/mailinglists', function (req, res) {
    async.waterfall([
        function(done) {
            methods.getAllMailinglists(function(mailinglistOverview, err) {
                if (!err) {
                    done(err, mailinglistOverview)
                }
            })
        },
        // create JSON object of mailinglists for front-end
        function(mailinglistOverview, done) {
            var allMailingLists = []  // JSON object
            for (let i = 0; i < mailinglistOverview.length; i++) {
                // add data to JSON object
                allMailingLists.push({
                    id: mailinglistOverview[i].id,
                    name: mailinglistOverview[i].name,
                    src: mailinglistOverview[i].src,
                    projectstatus: mailinglistOverview[i].projectstatus,
                    project_title: mailinglistOverview[i].project_title,
                    keywords: mailinglistOverview[i].keywords
                });
            }

            res.render(lang+'/project/mailinglists', {
                isUserAuthenticated: req.isAuthenticated(),
                user: req.user,
                mailinglists: allMailingLists
            });
        }
    ])
  });

  app.get('/project_', function (req, res) {
    async.waterfall([
      // get all projects from projectdb
      function(done) {
        methods.getAllProjects(function(projectsOverview, err) {
          if (!err) {
            done(err, projectsOverview)
          }
        })
      },
      // create JSON object for front-end
      function(projectsOverview, done) {
        var activeProjects = []
        var nonActiveProjects = []

        for (var i = 0; i < projectsOverview.length; i++) {
          var project = {
            id: projectsOverview[i].id,
            logo: projectsOverview[i].logo,
            akronym: projectsOverview[i].pname,
            title: projectsOverview[i].title,
            summary: projectsOverview[i].onelinesummary,
            category: projectsOverview[i].category,
            cp: projectsOverview[i].contact_email,
            gitlab: projectsOverview[i].gitlab
          }
          if (projectsOverview[i].projectstatus == 0) {
            nonActiveProjects.push(project)
          }
          else if (projectsOverview[i].projectstatus == 1) {
            activeProjects.push(project)
          }
        }

        // render the page
        if (req.isAuthenticated()) {
          res.render(lang+'/project/projects', {
            isUserAuthenticated: true,
            nonActive: nonActiveProjects,
            active: activeProjects
          });
        }
        else {
          res.render(lang+'/project/projects', {
            isUserAuthenticated: false,
            nonActive: nonActiveProjects,
            active: activeProjects
          });
        }
      }
    ])
  })

  app.get('/project', function (req, res) {
    res.render(lang+'/project/project-simplified', {
       isUserAuthenticated: req.isAuthenticated(),
       user: req.user
    });
  })

  app.get('/addprojectoverview', function (req, res) {
    if (req.isAuthenticated()) {
      res.render(lang+'/project/addProjectOverview')
    }
    else {
      res.redirect('/login')
    }
  })
  
  app.post('/addprojectoverview__', function (req, res) {
    if (req.isAuthenticated()) {
      var wiki = 0
      if (req.body.wiki)
        wiki = 1

      var projectTerm = req.body.termForm + " - " + req.body.termTo
      var projectOverviewData = {
        pname: req.body.pname,
        title: req.body.title,
        onelinesummary: req.body.summary,
        category: req.body.category,
        logo: req.body.logo,
        gitlab: req.body.gitlabURL,
        wiki: wiki,
        overview: req.body.overview,
        question: req.body.question,
        approach: req.body.approach,
        result: req.body.result,
        keywords: req.body.keywords,
        announcement: req.body.announcement,
        term: projectTerm,
        further_details: req.body.furtherDetails,
        website: req.body.website,
        src: req.body.src,
        caption: req.body.caption,
        contact_lastname: req.body.contactName,
        contact_email: req.body.contactEmail,
        leader_lastname: req.body.leaderName,
        leader_email: req.body.leaderEmail
      }
      
      methods.addProjectOverview(projectOverviewData, function(err){
        if (err) {
          //req.flash('error', "Failed")
          req.flash('error', "Fehlgeschlagen")
          res.redirect('/addProjectOverview');
        }
        else {
          req.flash('success', 'Your project has been created.')
          res.redirect('/project');
        }
      })
    }
  })

  app.post('/addprojectoverview', function (req, res) {
    if (req.isAuthenticated()) {
      var wiki = 0
      if (req.body.wiki)
        wiki = 1

      var projectLogo = req.files.logo
      var projectPicture = req.files.src
      var projectLogoPath, projectPicturePath
      
      if (projectLogo) {
        // raise error if size limit is exceeded
        if (projectLogo.size === pictSizeLimit) {
          req.flash('error', 'Projektlogo exceeds 1 MB');
          res.redirect('/addprojectoverview');
        }
        else {
          // TEST PATH FOR DEVELOPMENT (LOCALHOST)
          projectLogoPath = './folder-in-server-to-save-projektlogo/'+req.body.pname+'/'+projectLogo.name
          // PATH FOR TEST/LIVE SERVER
          // var projectLogoPath = to-be-defined
        }
      }
      if (projectPicture) {
        // raise error if size limit is exceeded
        if (projectPicture.size === pictSizeLimit) {
          req.flash('error', 'Projektbild exceeds 1 MB');
          res.redirect('/addprojectoverview');
        }
        else {
          // TEST PATH FOR DEVELOPMENT (LOCALHOST)
          projectPicturePath = './folder-in-server-to-save-projektbild/'+req.body.pname+'/'+projectPicture.name
          // PATH FOR TEST/LIVE SERVER
          // var projectPicturePath = to-be-defined
        }
        
      }
      
      var projectTerm = req.body.termForm + " - " + req.body.termTo
      var projectOverviewData = {
        pname: req.body.pname,
        title: req.body.title,
        onelinesummary: req.body.summary,
        category: req.body.category,
        logo: projectLogoPath,
        gitlab: req.body.gitlabURL,
        wiki: wiki,
        overview: req.body.overview,
        question: req.body.question,
        approach: req.body.approach,
        result: req.body.result,
        keywords: req.body.keywords,
        announcement: req.body.announcement,
        term: projectTerm,
        further_details: req.body.furtherDetails,
        website: req.body.website,
        src: projectPicturePath,
        caption: req.body.caption,
        contact_lastname: req.body.contactName,
        contact_email: req.body.contactEmail,
        leader_lastname: req.body.leaderName,
        leader_email: req.body.leaderEmail
      }
      
      // save pictures
      if (projectLogo) {
        projectLogo.mv(projectLogoPath, function(err) {
          if (err) {
            console.error(err)
            res.status(500).render(lang+'/500', {
              error: err
            })
          }
        });
      }
      if (projectPicture) {
        projectPicture.mv(projectPicturePath, function(err) {
          if (err) {
            console.error(err)
            res.status(500).render(lang+'/500', {
              error: err
            })
          }
        });
      }

      /* RS: Temporary solution while Project DB is still in early phase.
              When User DB and Project DB are integrated and quite stabil, this operation should be done in 1 transaction.
      */
      var userId // todo: make this global variable?
      async.waterfall([
        // get userId by email from userdb
        function(done) {
          methods.getUserIdByEmail(req.user.email, function(id, err) {
            if (!err) {
              userId = id
              done(err)
            }
          })
        },
        // add project overview
        function(done) {
          methods.addProjectOverview(projectOverviewData, function(data, err){
            if (err) {
              res.status(500).render(lang+'/500', {
                error: err
              })
            }
            else {
              done(err, data.insertId)
            }
          })
        },
        // assign the created overview to logged-in user
        function(projectOverviewId, done) {
          var userProjectRoleData = {
            project_id: projectOverviewId,
            user_id: userId,
            role_id: 3 // OVERVIEW_CREATOR
          }
          methods.addUserProjectRole(userProjectRoleData, function(userProjects, err) {
            if (err) {
              //req.flash('error', "Failed")
              req.flash('error', "Fehlgeschlagen")
              res.redirect('/addProjectOverview');
            }
            else {
              req.flash('success', 'Your project has been created.')
              res.redirect('/project');
            }
          })
        }
      ])
    }
  })

  app.get('/updateprojectoverview', function (req, res) {
    // only their own project
  })

  app.post('/updateprojectoverview', function (req, res) {
    // only their own project
  })

  app.get('/projectoverview', function(req, res){
    async.waterfall([
            function(done) {
                methods.getProjectOverviewById(req.query.projectID, function(projectOverview, err) {
                    if (!err) {
                        done(err, projectOverview)
                    }
                })
            },
            function(projectOverview,done){
                methods.getProjectImagesById(req.query.projectID, function(projectImages, err) {
                    if (!err) {
                        done(err, projectImages, projectOverview)
                    }
                })
            },
            // render projectOverview page
            function(projectImages, projectOverview, done) {

                console.log(projectImages);
                partnerWebsites = helpers.stringToArray(projectOverview[0].partner_website);
                partnerNames = helpers.stringToArray(projectOverview[0].partner_name);
                awardSites = helpers.stringToArray(projectOverview[0].award_website);
                awardNames = helpers.stringToArray(projectOverview[0].award_name);
                sponsorWebsites = helpers.stringToArray(projectOverview[0].sponsor_website);
                sponsorImgs = helpers.stringToArray(projectOverview[0].sponsor_img);
                sponsorNames = helpers.stringToArray(projectOverview[0].sponsor_name);

                res.render(lang+'/project/projectOverview', {
                    isUserAuthenticated: req.isAuthenticated(),
                    user: req.user,
                    projectOV: projectOverview,
                    projectImgs: projectImages,
                    partnerWS: partnerWebsites,
                    partnerN: partnerNames,
                    awardWS: awardSites,
                    awardN: awardNames,
                    sponsorWS: sponsorWebsites,
                    sponsorIMG: sponsorImgs,
                    sponsorN: sponsorNames
                });
            }
        ])
  })

  app.get('/videoconferences', function(req, res){
      res.render(lang+'/project/videoconferences', {
              isUserAuthenticated: req.isAuthenticated(),
              user: req.user,
      });
  })

  app.get('/landingpage', function(req, res){
        res.render(lang+'/project/landingpage', {
                isUserAuthenticated: req.isAuthenticated(),
                user: req.user,
        });
    })
};