BaseModel = require '../BaseModel'
Utils = require '../Utils'

class Projects extends BaseModel
  init: =>
    @members = @load 'ProjectMembers'
    @hooks =   @load 'ProjectHooks'
    @issues =  @load 'ProjectIssues'
    @labels =  @load 'ProjectLabels'
    @repository = @load 'ProjectRepository'
    @milestones = @load 'ProjectMilestones'
    @deploy_keys = @load 'ProjectDeployKeys'
    @merge_requests = @load 'ProjectMergeRequests'
    @services = @load 'ProjectServices'

  all: (params={}, fn=null) =>
    if 'function' is typeof params
      fn = params
      params={}
    @debug "Projects::all()"

    params.page ?= 1
    params.per_page ?= 100

    data = []
    cb = (err, retData) =>
      if err
        return fn(retData || data) if fn
      else if retData.length == params.per_page
        @debug "Recurse Projects::all()"
        data = data.concat(retData)
        params.page++
        return @get "projects", params, cb
      else
        data = data.concat(retData)
        return fn data if fn

    @get "projects", params, cb

  allAdmin: (params={}, fn=null) =>
    if 'function' is typeof params
      fn = params
      params={}
    @debug "Projects::allAdmin()"

    params.page ?= 1
    params.per_page ?= 100

    data = []
    cb = (err, retData) =>
      if err
        return fn(retData || data) if fn
      else if retData.length == params.per_page
        @debug "Recurse Projects::allAdmin()"
        data = data.concat(retData)
        params.page++
        return @get "projects/all", params, cb
      else
        data = data.concat(retData)
        return fn data if fn

    @get "projects/all", params, cb

  show: (projectId, fn=null) =>
    @debug "Projects::show()"
    @get "projects/#{Utils.parseProjectId projectId}", (data) => fn data if fn

  create: (params={}, fn=null) =>
    @debug "Projects::create()"
    @post "projects", params, (data) -> fn data if fn

  create_for_user: (params={}, fn=null) =>
    @debug "Projects::create_for_user()"
    @post "projects/user/#{params.user_id}", params, (data) -> fn data if fn

  edit: (projectId, params={}, fn=null) =>
    @debug "Projects::edit()"
    @put "projects/#{Utils.parseProjectId projectId}", params, (data) -> fn data if fn

  addMember: (params={}, fn=null) =>
    @debug "Projects::addMember()"
    @post "projects/#{params.id}/members", params, (data) -> fn data if fn

  editMember: (params={}, fn=null) =>
    @debug "Projects::editMember()"
    @put "projects/#{params.id}/members/#{params.user_id}", params, (data) -> fn data if fn

  listMembers: (params={}, fn=null) =>
    @debug "Projects::listMembers()"
    @get "projects/#{params.id}/members", (data) -> fn data if fn

  listCommits: (params={}, fn=null) =>
    @debug "Projects::listCommits()"
    @get "projects/#{params.id}/repository/commits", params, (data) => fn data if fn

  listTags: (params={}, fn=null) =>
    @debug "Projects::listTags()"
    @get "projects/#{params.id}/repository/tags", (data) => fn data if fn

  remove: (projectId, fn = null) =>
    @debug "Projects::remove()"
    @delete "projects/#{Utils.parseProjectId projectId}", (data) => fn data if fn

  fork: (params={}, fn=null) =>
    @debug "Projects::fork()"
    @post "projects/fork/#{params.id}", params, (data) -> fn data if fn

  search: (projectName, params={}, fn=null) =>
    if 'function' is typeof params
      fn = params
      params={}

    @debug "Projects::search()"
    @get "projects/search/#{projectName}", params, (data) => fn data if fn

module.exports = (client) -> new Projects client
