#!/usr/bin/env coffee
# vim:ft=coffee ts=2 sw=2 et :
# -*- mode:coffee -*-

Fs       = require 'fs'
Path     = require 'path'
{Task, Story} = require("../src/version-one")
_s = require('underscore.string')
program = require('commander')
Yaml = require('js-yaml') # parse the yaml config and members

config_yaml = process.env['HOME'] + "/.v1_config.yaml"

program
  .command('setup')
  .description('setup envs to get tasks')
  .action (option) ->
    config = {
      where: ""
      username: ""
      password: ""
      api_host: ""
    }
    console.log "Tell me your version one username? ".blue
    program.prompt 'Username: ', (username)->
      config.username = username
      program.password 'Password: ', (password)->
        config.password = password
        console.log "What's the full name of current sprint? ".blue
        program.prompt 'Current sprint name(full name): ', (sprint)->
          config.where = "Timebox.Name='#{sprint}'"
          console.log "Almost there, tell me the api host? ".blue
          console.log "(for example, the API Host should be red part of your version one address is: https://" + "www14.v1host.com/company1".red + "/Default.aspx?menu=TaskBoardPage)"
          program.prompt 'API Host: ', (api_host)->
            config.api_host = api_host
            # write to config
            Fs.writeFileSync config_yaml, Yaml.dump(config)
            console.log "setup complete!"
            process.stdin.destroy()



# get all members
program
  .command('members')
  .description('get version one members')
  .option('-r, --reload [false]', 'reload members',false)
  .action (options) ->
    Task.members (options.reload),(members)->
      console.log members


# tasks
program
  .command('tasks')
  .description('get tasks available in this sprint')
  .option("-o, --owner [owner name]", "Owner of this task")
  .option("-s, --status [status]", "Task status, using '~' at the first if you just want to exclude some tasks with that status")
  .option("-w, --where [where]", "the where clause to filter the task")
  .action (options) ->
    owner = options.owner || ""
    status = options.status || ""
    number = options.number || ""
    whereClause = options.where || ""
    # check owners function
    check_owners = (t, owners)->
      check_result = true
      for o in owners.split(",")
        check_result = _s.include(t.member.toLowerCase(),o.toLowerCase())
        return check_result if check_result
      check_result
    # task filter
    filter = (t)->
      if status.slice(0,1) == "~"
        check_owners(t, owner) and !_s.include(t.status.toLowerCase(),status.slice(1).trim().toLowerCase())
      else
        check_owners(t, owner) and _s.include(t.status.toLowerCase(),status.toLowerCase())
    Task.all whereClause, (tasks)->
      grouped_tasks = {}
      tasks.filter(filter).map (a)->
        grouped_tasks[a.parent_id] ||= []
        grouped_tasks[a.parent_id].push a
      # load stories
      for sid,ts of grouped_tasks
        Story.find sid,(ps)->
          result = ""
          result += ps.toString()
          if ps.id
            for s in grouped_tasks[ps.id.split(":")[1]]
              result += s.toString()
          console.log result


program
  .command('task')
  .description('get one task with number -n specify')
  .option("-n, --number [task number]", "Task number")
  .action (options) ->
    Task.find options.number, (t)->
      console.log t.toString()


program
  .command('stories')
  .description('get all stories')
  .option('-r, --reload [false]', 'reload members',false)
  .action (options) ->
    Story.all (stories)->
      for story in stories
        console.log story.toString()



program
  .command('story')
  .description('get story with number')
  .option('-n, --number [number]', 'get story by number')
  .action (options) ->
    Story.find options.number, (story)->
      console.log story.toString()


program
  .command('update [asset]')
  .description("update story or task")
  .option('-n --number [task_number]', 'task number')
  .action (asset, options) ->
    # get the task
    Task.find options.number, (task)->
      console.log "Are you going to update this task:"
      console.log task.toString()
      attributes_list = ['ToDo', 'Description','Status']
      console.log "Choose which attribute you want to update: "
      program.choose attributes_list, (i)->
        console.log "You choose update #{attributes_list[i]}"
        program.prompt "Update to: ", (value)->
          program.confirm "Sure about update #{attributes_list[i].yellow} to #{value.red}? ",(ok)->
            if ok
              console.log "Updating ..................."
              if attributes_list[i] == 'Status'
                # update relation
                Task.updateRelation options.number, attributes_list[i],Task.statusId(value), (result)->
                  console.log result
              else
                Task.updateAttribute options.number, attributes_list[i], value, (result)->
                  console.log result
            else
              console.log "abort updating..."
            process.stdin.destroy()

program.parse(process.argv)


