/**
 * Copyright JS Foundation and other contributors, http://js.foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 **/

var express = require("express");
var os = require("os");
var runtime;
var needsPermission = require("../auth").needsPermission;

function getUsername(userObj) {
    var username = '__default';
    if ( userObj && userObj.name ) {
        username = userObj.name;
    }
    return username;
}

module.exports = {
    init: function(_runtime) {
        runtime = _runtime;
    },
    app: function() {
        var app = express();

        // SSH keys

        // List all SSH keys
        app.get("/", needsPermission("settings.read"), function(req,res) {
            var username = getUsername(req.user);
            runtime.storage.projects.ssh.listSSHKeys(username)
            .then(function(list) {
                res.json({
                    keys: list
                });
            })
            .catch(function(err) {
                // console.log(err.stack);
                if (err.code) {
                    res.status(400).json({error:err.code, message: err.message});
                } else {
                    res.status(400).json({error:"unexpected_error", message:err.toString()});
                }
            });
        });

        // Get SSH key detail
        app.get("/:id", needsPermission("settings.read"), function(req,res) {
            var username = getUsername(req.user);
            // console.log('username:', username);
            runtime.storage.projects.ssh.getSSHKey(username, req.params.id)
            .then(function(data) {
                if (data) {
                    res.json({
                        publickey: data
                    });
                } else {
                    res.status(404).end();
                }
            })
            .catch(function(err) {
                if (err.code) {
                    res.status(400).json({error:err.code, message: err.message});
                } else {
                    res.status(400).json({error:"unexpected_error", message:err.toString()});
                }
            });
        });

        // Generate a SSH key
        app.post("/", needsPermission("settings.write"), function(req,res) {
            var username = getUsername(req.user);
            // console.log('req.body:', req.body);
            if ( req.body && req.body.name && /^[a-zA-Z0-9\-_]+$/.test(req.body.name)) {
                runtime.storage.projects.ssh.generateSSHKey(username, req.body)
                .then(function(name) {
                    // console.log('generate key --- success  name:', name);
                    res.json({
                        name: name
                    });
                })
                .catch(function(err) {
                    if (err.code) {
                        res.status(400).json({error:err.code, message: err.message});
                    } else {
                        res.status(400).json({error:"unexpected_error", message:err.toString()});
                    }
                });
            }
            else {
                res.status(400).json({error:"unexpected_error", message:"You need to have body or body.name"});
            }
        });

        // Delete a SSH key
        app.delete("/:id", needsPermission("settings.write"), function(req,res) {
            var username = getUsername(req.user);
            runtime.storage.projects.ssh.deleteSSHKey(username, req.params.id)
            .then(function() {
                res.status(204).end();
            })
            .catch(function(err) {
                if (err.code) {
                    res.status(400).json({error:err.code, message: err.message});
                } else {
                    res.status(400).json({error:"unexpected_error", message:err.toString()});
                }
            });
        });

        return app;
    }
}