fs = require 'fs-extra'
path = require 'path'
os = require 'os'
child_process = require 'child_process'
argv = require('optimist').argv
remoteRun = require('./remoteRun')
schema = require('./initSchema')

inputCache = {}
env = null

parseInput = (input) ->

module.exports = () ->

    if argv['e']
        env = argv['e']
    else
        env = getEnvironment()

    if argv['config']
        initserverByConfig()
    else
        if argv['w'] or argv['s']
            initserverByArgv()
        else
            # 初始化输入监听
            initInputHanlder()
            command('getAppFolder')

initserverByConfig = () ->
    schema = schema.getSchema()
    remoteRun.initServer(schema)

initserverByArgv = () ->
    if !argv['w'] or !argv['s']
        console.log '用法: jne-cli iniserver -w webapp目录 -s 服务名'
        process.exit()

    inputCache['appFolder'] = argv['w']
    inputCache['serviceName'] = argv['s']
    createServer()

command = (cmd, options) ->
    commandMethod = commandMap[cmd]
    if commandMethod
        commandMethod(options)

getAppFolder = () ->
    parseInput = (input) ->
        if input is ''
            console.log '目录名不能为空，请重新输入：'
            return
        inputCache['appFolder'] = input
        command('getServiceName')

    process.stdout.write('请输入要创建的webapp目录(通常为域名，如:m.jiulvxing.com):')

getServiceName = () ->
    parseInput = (input) ->
        if input is ''
            console.log '服务名名不能为空，请重新输入：'
            return
        inputCache['serviceName'] = input
        command('createServer')

    process.stdout.write('请输入要创建服务名(该服务用于项目的启动，停止和重启，不用输入jlx_，会自动添加):')

inputHandler = (input) ->
    parseInput(input.trim())

initInputHanlder = () ->
    process.stdin.setEncoding('utf8')
    process.stdin.on('readable', () ->
        input = process.stdin.read()
        if input isnt null
            inputHandler(input)
    )

createServer = () ->
    appFolder = inputCache.appFolder

    # 创建web目录
    webappFolder = path.join('/home/q/www', appFolder, '/webapp')
    logFolder = path.join('/home/q/www', appFolder, '/logs')
    cachesFolder = path.join('/home/q/www', appFolder, '/caches')

    if fs.existsSync(webappFolder) or fs.existsSync(logFolder)
        console.log "#{webappFolder} 或 #{logFolder} 已经存在，请检查输入或删除后重新执行"
        process.exit()

    fs.mkdirsSync(webappFolder, '755')
    fs.mkdirsSync(logFolder, '755')
    fs.mkdirsSync(cachesFolder, '755')

    # 设置chown

    exec = child_process.exec
    chownCommand = 'chown tomcat:tomcat ' + logFolder + ' ' + cachesFolder
    exec(chownCommand, (error, stdout, stderr) ->
        if error isnt null
            console.log('exec error: ' + error)
        else
            console.log "创建目录完成，webapp: #{webappFolder}, 日志目录：#{logFolder}"
            # 创建服务
            createService(webappFolder, logFolder, () ->
                # 安装forever
                checkForever(() ->
                    installForever()
                )
            )
    )

checkForever = (callback) ->
    exec = child_process.exec
    exec('forever --version', (error, stdout, stderr)->
        if !error
            process.exit()
        else
            callback()
    )

installForever = () ->
    spawn = child_process.spawn

    console.log '开始安装forever，如果失败，请手工执行sudo npm install forever -g'
    forever = spawn('npm', ['install', 'forever', '-g'])

    forever.stdout.on('data', (data) ->
        console.log(data.toString())
    )

    forever.stderr.on('data', (data) ->
        console.log(data.toString())
    )

    forever.on('close', (code) ->
        if code isnt 0
            console.log('grep process exited with code ' + code)
        else
            console.log 'forever安装完成'
            process.exit()
    )

getEnvironment = () ->
    e = 'production'
    hostname = os.hostname()
    arr = hostname.split('.')

    if arr.indexOf('.dev.') > -1
        e ='dev'

    if arr.indexOf('.beta.') > -1
        e = 'beta'

    return e;


createService = (webappFolder, logFolder, next) ->

    service = 'jlx_' + inputCache.serviceName
    servicePath = path.join('/etc/init.d/', service)

    console.log "开始创建服务#{service}"

    if fs.existsSync(servicePath)
        console.log "#{servicePath} 已经存在，请检查输入或删除后重新执行"
        process.exit()

    content = """
        #!/bin/bash

        USER="tomcat"
        export PATH=/home/q/node/bin:$PATH
        export PATH=/usr/local/bin:$PATH
        prog=$(which forever)

        start() {
        echo -n $"Starting $prog: "
        exec /bin/su $USER -c "NODE_ENV=#{env} $prog start -a -l #{logFolder}/forever.log #{webappFolder}/bin/start -l #{logFolder}"

        if [[ $? -eq 0 ]]; then
        return 0
        else
        return 1
        fi
        }

        stop() {
        echo -n $"Stopping $prog: "
        huixian=$(ps aux|grep '#{webappFolder}/bin/start' | grep -v grep)
        if [ -n "$huixian" ]; then
        sleep 10
        exec /bin/su $USER -c "$prog stop #{webappFolder}/bin/start"
        fi

        if [[ $? -eq 0 ]]; then
        return 0
        else
        return 1
        fi
        }

        restart() {
        echo -n $"restart forever daemon: '#{webappFolder}/bin/start'"
        huixian=$(ps aux|grep '#{webappFolder}/bin/start' | grep -v grep)
        if [ -n "$huixian" ]; then
        sleep 3
        echo "restart with forever"
        exec /bin/su $USER -c "$prog restart #{webappFolder}/bin/start"
        else
        echo -n $"forever daemon didn't #{webappFolder}/bin/start running"
        fi

        if [[ $? -eq 0 ]]; then
        return 0
        else
        return 1
        fi
        }

        debug() {
        cd #{webappFolder}
        startDebuggingPort=5858
        output=$(netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".'$startDebuggingPort'"')

        while [ -n "$output" ]
        do
            ((startDebuggingPort++))
            output=$(netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".'$startDebuggingPort'"')
        done

        cmd="qxf dev --debug=$startDebuggingPort"
        echo $cmd
        eval $cmd
        }

        case "$1" in
        start)
        start && exit 0
        ;;
        stop)
        stop || exit 0
        ;;
        restart)
        restart || exit 0
        ;;
        debug)
        debug || exit 0
        ;;
        *)
        echo $"Usage: $0 {start|stop|restart|debug}"
        exit 2
        esac
        exit $?
        """

    fs.writeFileSync(service, content)
    fs.move(service, servicePath, (err) ->
        if err
            console.error(err)
            process.exit()
            return

        fs.chmodSync(servicePath, '755')
        result = """
                    创建服务#{service}成功，使用命令:
                    启动：sudo service #{service} start
                    停止：sudo service #{service} stop
                    重启：sudo service #{service} stop && sudo service #{service} start
                """
        console.log result
        next()
    )

commandMap =
    "getAppFolder": getAppFolder
    "getServiceName": getServiceName
    "createServer": createServer
