class Api::Pm::SprintIssuesController < Api::Pm::BaseController

  before_action :require_login, except: [:index]

  def index
    @issues = Api::Pm::SprintIssues::ListService.call(query_params, current_user)
    @issues = kaminari_paginate(@issues)
    render 'api/v1/issues/index'
  end

  def burndown_charts
    return tip_exception '参数错误' if params[:pm_sprint_id].blank? || params[:start_time].blank? || params[:end_time].blank?
    @issues = Issue.where(pm_sprint_id: params[:pm_sprint_id])
    start_time = Date.parse params[:start_time]
    end_time = Date.parse params[:end_time]
    time_count = (end_time - start_time).to_i + 1 # 计算间隔时间 加上最后一天
    data = []
    curren_issues = @issues.group(:status_id, :due_date).count
    total_count = @issues.count
    cardinality = (total_count.zero? || time_count.zero?) ? 0 : total_count.to_f / time_count.to_f
    # cardinality = BigDecimal.new(total_count) / BigDecimal.new(time_count)
    time_count.times do |x|
      e_time = start_time + x
      completed = curren_issues[[5, e_time]].to_i + curren_issues[[3, e_time]].to_i - @issues.where(pm_issue_type: 3, status_id: 3).size
      total_count = total_count - completed
      data << { time: e_time, undone: total_count, completed: completed, base_number: (cardinality * (time_count - x - 1)).to_f.round(2) }
    end
    render_ok(data: data)
  end

  def statistics
    pm_sprint_ids = params[:pm_sprint_ids].split(",") rescue []
    return tip_exception '参数错误' if pm_sprint_ids.blank?
    @issues = Issue.where(pm_sprint_id: pm_sprint_ids)
    data = {}
    # requirement 1 task 2 bug 3
    @issues_count = @issues.group(:pm_sprint_id).count
    @issues_type_count = @issues.group(:pm_sprint_id, :status_id).count
    @issues_pm_type_count = @issues.group(:pm_sprint_id, :pm_issue_type).count
    @issues_hour_count = @issues.group(:pm_sprint_id).sum(:time_scale)
    @issues_hour_type_count = @issues.group(:pm_sprint_id, :status_id).sum(:time_scale)
    @issues_hour_pm_type_count = @issues.group(:pm_sprint_id, :pm_issue_type).sum(:time_scale)
    @issues_status_pm_type_count = @issues.group(:pm_sprint_id, :pm_issue_type, :status_id).count
    pm_sprint_ids.map(&:to_i).map do |sprint_id|
      # count_closed 工作项已完成/已关闭数量，需排除已修复的缺陷数量
      count_closed = @issues_type_count[[sprint_id, 5]].to_i + @issues_type_count[[sprint_id, 3]].to_i - @issues.where(pm_sprint_id: sprint_id, pm_issue_type: 3, status_id: 3).size
      # hour_closed 已完成/已关闭 预估工时之和，需排除已修复的缺陷预估工时
      hour_closed = @issues_hour_type_count[[sprint_id, 5]].to_f + @issues_hour_type_count[[sprint_id, 3]].to_f - @issues.where(pm_sprint_id: sprint_id, pm_issue_type: 3, status_id: 3).sum(:time_scale).to_f
      data[sprint_id] = {
        count_total: @issues_count[sprint_id] || 0,
        count_closed: count_closed || 0,
        hour_total: @issues_hour_count[sprint_id].to_f || 0,
        hour_closed: hour_closed || 0,
        requirement: @issues_pm_type_count[[sprint_id, 1]] || 0,
        task: @issues_pm_type_count[[sprint_id, 2]] || 0,
        bug: @issues_pm_type_count[[sprint_id, 3]] || 0,
        requirement_hour: @issues_hour_pm_type_count[[sprint_id, 1]].to_i || 0,
        task_hour: @issues_hour_pm_type_count[[sprint_id, 2]].to_i || 0,
        bug_hour: @issues_hour_pm_type_count[[sprint_id, 3]].to_i || 0,
        requirement_open: (@issues_status_pm_type_count[[sprint_id, 1, 1]].to_i + @issues_status_pm_type_count[[sprint_id, 1, 2]].to_i) || 0,
        task_open: @issues_status_pm_type_count[[sprint_id, 2, 1]].to_i + @issues_status_pm_type_count[[sprint_id, 2, 2]].to_i || 0,
        bug_open: @issues_status_pm_type_count[[sprint_id, 3, 1]].to_i + @issues_status_pm_type_count[[sprint_id, 3, 2]].to_i || 0
      }
    end
    render_ok(data: data)
  end

  before_action :load_uncomplete_issues, only: [:complete]

  def complete
    begin
      case complete_params[:complete_type].to_i
      when 1
        @issues.update_all(status_id: 5, due_date: Time.now)
      when 2
        @issues.update_all(pm_sprint_id: 0)
      when 3
        @issues.update_all(pm_sprint_id: complete_params[:target_pm_project_sprint_id])
      end
      render_ok
    rescue => e
      render_error(e.message)
    end
  end

  private

  def load_uncomplete_issues
    @issues = Issue.where(pm_sprint_id: complete_params[:pm_project_sprint_id]).where.not(status_id: 5)
  end

  def complete_params
    params.permit(:pm_project_sprint_id, :complete_type, :target_pm_project_sprint_id)
  end

  def query_params
    params.permit(
      :category,
      :pm_project_id,
      :pm_issue_type, # 需求1  任务2 缺陷3
      :assigner_id,
      :priority_id,
      :status_id,
      :keyword, :status_ids, :pm_issue_types,
      :sort_by, :sort_direction
    )
  end

end