#coding=utf-8

class ProjectsService

  include ApplicationHelper
  include ApiHelper
  include ActionView::Helpers::DateHelper
  include ProjectsHelper

  #获取指定用户的项目列表
  def user_projects(user)
    projects = user.projects.not_deleted.select("projects.*,(SELECT MAX(updated_at)  FROM `forge_activities` WHERE forge_activities.project_id = projects.id) AS updated_at ").order("updated_at desc")
    projects
  end

  #显示项目
  def show_project(params,current_user)
    project = Project.find(params[:id])
    project.generate_invite_code
    project.generate_qrcode

    project
  end

  def send_wechat_create_project_notice user,project
    count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Project' and shield_id=#{project.id}").count
    Rails.logger.info "!!!!!!!!!!!!!!!!!!!!!!#{project}"
    if count == 0
      ws = WechatService.new
      title = "恭喜您创建项目成功。"
      ws.create_project_notice user.id, "create_project_notice", project.id,title, project.name, format_time(project.created_on),"点击查看项目详情。"
    end
  end


  def createNewProject params,user
    status = -1
    issue_custom_fields = IssueCustomField.sorted.all
    trackers = Tracker.sorted.all
    project = Project.new

    project[:name] = params[:name]
    project[:description] = ''
    project[:is_public] = '0'  #公开
    project[:project_type] = 0
    project[:project_new_type] = 1
    project[:identifier] = Project.next_identifier if Setting.sequential_project_identifiers?

    project.organization_id = params[:organization_id]
    project.user_id = user.id

    # if validate_parent_id && @project.save
    if project.save
      p = Project.find("#{project.id}")
      send_wechat_create_project_notice user,p
      r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
      m = Member.new(:user => user, :roles => [r])
      # project's score
      if ProjectScore.where("project_id=?", project.id).first.nil?
        ProjectScore.create(:project_id => project.id, :score => false)
      end
      # end
      project_info = ProjectInfo.new(:user_id => user.id, :project_id => project.id)
      user_grades =  UserGrade.create(:user_id => user.id, :project_id => project.id)
      project_status = ProjectStatus.create(:project_id => project.id, :watchers_count => 0, :changesets_count => 0, :project_type => project.project_type,:grade => 0)
      project.members << m
      project.project_infos << project_info
      status = 0
    end
    status
  end

  #修改项目成员角色
  def modify_user_project_role params
    status = -1

    project = Project.find("#{params[:id]}")

    member = project.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first

    if member
      member.member_roles[0].role_id = params[:role_id]


      role = Role.find(params[:role_id])
      if role.allowed_to?(:is_manager)
        projectInfo = ProjectInfo.new(:user_id => member.user_id, :project_id => project.id)
        projectInfo.save
      else
        user_admin = ProjectInfo.where("user_id = ? and project_id = ?", member.user_id, project.id)
        if user_admin.size > 0
          user_admin.each do |user|
            user.destroy
          end
        end
      end

      if member.member_roles[0].save
        status = 0
      end
    end
    status
  end

  class JoinProjectError < Errors
    define_error [
                     0, '您已成功加入项目',
                     1, '您的邀请码不正确',
                     2, '您还未登录',
                     3, '您已经是该项目的管理人员',
                     4, '您已经是该项目的开发人员',
                     5, '您已经是该项目的报告人员',
                     6, '该项目不存在或已被删除啦',
                     7, '您的申请已提交，请等待管理员审批',
                     8, '您已经发送过申请了，请耐心等待',
                     '未知错误，请稍后再试'
                 ]
  end

  #加入项目结果
  def send_wechat_join_project_notice user,project,role_id,result
    count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Project' and shield_id=#{project.id}").count
    if count == 0
      result_name = result == 0 ? "已同意" : "已拒绝"
      if result == 0
        title = "恭喜您加入项目成功。"
        remark = "点击查看项目详情。"
        uid = 0
        type = "project"
      else
        title = "很遗憾您未能成功加入项目。"
        remark = "点击查看申请详情。"
        uid = user.id
        type = "review_project_member"
      end
      ws = WechatService.new
      ws.join_project_notice user.id, "project", project.id,title, project.name,result_name, remark,uid
    end
  end

  def join_project params,current_user
    status = -1
    project = Project.find_by_invite_code(params[:invite_code]) if params[:invite_code]

    if project
      if project[:is_delete] == 1
        status = 6
      else
        if current_user.member_of?(project) #如果已经是成员
          member = project.member_principals.includes(:roles, :principal).where("user_id=?",current_user.id).first
          status = member.member_roles[0].role_id

          #将之前的申请都改为已拒绝
          applied_messages = AppliedMessage.where(:project_id => project.id, :status => true, :applied_user_id=>current_user.id,:applied_type => "AppliedProject")
          applied_messages.update_all(:status=>5)
        else
          if params[:invite_code].present?

            if params[:role] == 5
              members = []
              user_grades = []
              project_info = []

              user_grades << UserGrade.new(:user_id => current_user.id, :project_id => project.id)
              project.user_grades << user_grades unless user_grades.first.user_id.nil?

              members << Member.new(:role_ids => ["5"], :user_id => current_user.id)
              project.members << members

              project_info << ProjectInfo.new(:user_id => current_user.id, :project_id => project.id)
              project.project_infos << project_info

              status = 0
              send_wechat_join_project_notice current_user,project,5,0

              #将之前的申请都改为已拒绝
              applied_messages = AppliedMessage.where(:project_id => project.id, :status => true, :applied_user_id=>current_user.id,:applied_type => "AppliedProject")
              applied_messages.update_all(:status=>5)
            else
              if !AppliedProject.where(:project_id => project.id, :user_id => current_user.id).first.nil?
                status = 8
              else
                AppliedProject.create(:user_id => current_user.id, :project_id => project.id, :role => params[:role])

                status = 7
              end
            end
          else
            status = 4
          end
        end
      end
    else
      status = 1
    end
    status
  end

  def get_project_review_members(project,role_id,current_user)
    review_members = []

    if role_id == 3 || role_id == 4

      #AppliedMessage.where(:applied_id => @applied_message.applied_id, :project_id => @applied_message.project_id, :status => 1,
      #:applied_type => "AppliedProject")


      apply_messages = AppliedMessage.where(:user_id => current_user.id, :project_id => project.id, :status => 1, :role=>role_id)

      apply_messages.each do |m|
        user = User.find(m.applied_user_id)

        if user
          img_url = "/images/"+url_to_avatar(user)
          gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender
          work_unit = get_user_work_unit user
          location = get_user_location user
          review_members << {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender,
                        :work_unit => work_unit, :mail => user.mail, :location => location,
                        role_name: "",
                        name: user.show_name,
                        roles_id: role_id,
                        :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname,:real_name=>user.realname}
        end
      end
    end

    review_members
  end

  def get_reviewer_info params,current_user
    status = -1
    info = nil
    project = Project.find(params[:project_id])
    if project
      # messages = AppliedProject.where(:project_id=> project.id, :user_id=>params[:user_id]).first
      #status  1未处理 5拒绝 7同意
      applied_message = AppliedMessage.where(:user_id => current_user.id, :project_id => project.id, :applied_user_id=>params[:user_id],:applied_type => "AppliedProject").last
      if applied_message
        status = applied_message.status
        user = User.find(params[:user_id])
        if user
          img_url = "/images/"+url_to_avatar(user)
          gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender
          work_unit = get_user_work_unit user
          location = get_user_location user
          info =  {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender,
                   :work_unit => work_unit, :mail => user.mail, :location => location,
                   role_name: "",
                   name: user.show_name,
                   roles_id: applied_message.role,
                   :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname}
        end
      end
    end

    {status:status,reviewer:info}
  end

  def deal_join_apply params,current_user
    status = -1
    message = ""

    project = Project.find(params[:project_id])
    user =  User.find(params[:user_id])
    if project
        applied_messages = AppliedMessage.where(:user_id => current_user.id, :project_id => project.id, :status => 1, :applied_user_id=>user.id,:applied_type => "AppliedProject")
        apply_message = applied_messages.first
        if apply_message
          if user.member_of?(project)
            message = "已经是该项目的成员了"
            u_member = project.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first
            if u_member.member_roles[0].role_id == 5
              applied_messages.update_all(:status=>5)
            else
              applied_messages.update_all(:status=>7)
            end
          else
            applied_project = apply_message.applied
            ap_role = applied_project.try(:role)
            if ap_role
              rolename = ap_role == 3 ? "管理人员" : "开发人员"
              if params[:type] == 0
                #同意
                members = []
                user_grades = []
                project_info = []
                members << Member.new(:role_ids => ["#{ap_role}"], :user_id => user.id)
                user_grades << UserGrade.new(:user_id => user.id, :project_id => project.id)
                role = Role.find(ap_role)
                project_info << ProjectInfo.new(:project_id => project.id, :user_id => user.id) if role.allowed_to?(:is_manager)
                project.members << members
                project.project_infos << project_info
                project.user_grades << user_grades unless user_grades.first.user_id.nil?

                # 添加成功后所有管理员收到的消息状态都要更新
                applied_messages.update_all(:status => 7, :viewed => true)
                # 添加成功后，申请人收到消息
                AppliedMessage.create(:user_id => user.id, :applied_type => "AppliedProject", :applied_id => applied_project.id ,
                                      :status => 6, :viewed => false, :applied_user_id => current_user.id, :role => applied_project.role, :project_id => applied_project.project_id)

                message = "您已同意"+rolename+user.show_name+"，加入项目"

                send_wechat_join_project_notice user,project,ap_role,0

              else
                #拒绝
                AppliedMessage.create(:user_id => user.id, :applied_type => "AppliedProject", :applied_id => applied_project.id ,:status => 4,
                                      :viewed => false, :applied_user_id => current_user.id, :role => applied_project.role, :project_id => applied_project.project_id)

                applied_messages.update_all(:status => 5, :viewed => true)
                applied_project.delete

                message = "您已拒绝"+rolename+user.show_name+"，加入项目"

                send_wechat_join_project_notice user,project,ap_role,1
              end

              status = 0
            else
              message = "该申请不存在或已被处理"
            end
          end
        else
          message = "该申请不存在或已被处理"
        end
    else
      message = "该项目不存在或已被删除"
    end

    {:status => status,:message => message}
  end

  def send_wechat_project_issue_notice user,project,issue_id,issue_title,priority_id
    count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Project' and shield_id=#{project.id}").count
    if count == 0
      title = "您有新的issue需要解决。"
      remark = "点击详情查看issue。"

      case priority_id
        when "1"
          priority = "低"
        when "2"
          priority = "正常"
        when "3"
          priority = "高"
        when "4"
          priority = "紧急"
        when "5"
          priority = "立刻"
      end

      ws = WechatService.new
      ws.project_issue_notice user.id, "issues", issue_id,title, issue_title,priority, remark
    end
  end

  #删除项目成员
  def project_delete_member project,user_id,current_user
    if current_user.nil?
      state = -1
      return state
    end

    member = project.members.where("user_id=?",user_id).first

    if member != nil
      member.destroy
      # end
      user_admin = ProjectInfo.where("user_id = ? and project_id = ?", member.user_id, project.id)
      if user_admin.size > 0
        user_admin.each do |user|
          user.destroy
        end
      end
      user_grade = UserGrade.where("user_id = ? and project_id = ?", member.user_id, project.id)
      if user_grade.size > 0
        user_grade.each do |grade|
          grade.destroy
        end
      end
      # 移出的时候删除申请消息,不需要删除消息，所以不必要关联删除
      applied_projects = AppliedProject.where(:project_id => project.id, :user_id => member.user_id).first
      unless applied_projects.nil?
        applied_projects.delete
      end
      #移出项目发送消息
      ForgeMessage.create(:user_id => member.user_id, :project_id => project.id, :forge_message_type => "RemoveFromProject", :viewed => false, :forge_message_id => current_user.id)
      return 0
    else
      return 1
    end
  end

  def exit_project project,user
    if user.nil?
      state = -1
      return state
    end

    if project.user_id == user.id
      state = -2
      return state
    end

    members = Member.where(:user_id => user.id, :project_id=>project.id).first
    if members != nil
      members.destroy
      # 移出的时候删除申请消息,不需要删除消息，所以不必要关联删除
      applied_projects = AppliedProject.where(:project_id => project.id, :user_id => members.user_id).first
      unless applied_projects.nil?
        applied_projects.delete
      end
      state = 0
    else
      state = -3
    end
    return state
  end

end
