class Admin::Legacy::Discipline::LogsController < Admin::Legacy::Discipline::Controller
  def index
    data = logs
      .by_student_ids(params[:student_ids])
      .by_victim_ids(params[:victim_ids])
      .by_classroom(params[:classroom_ids])
      .decorate
    render_success :ok, json: data.map { |l| log_props(l) }
  end

  def update
    if log.update(log_params)
      render_success :ok, json: log_props(log.decorate)
    else
      render_error :unprocessable_entity, errors: log
    end
  end

  def destroy
    if log.destroy
      render_success :ok
    else
      render_error :unprocessable_entity, errors: log
    end
  end

  def batch_create
    if students.empty?
      return render_error :unprocessable_entity,
        errors: { students: 'Must select at least one student' }
    end

    batch_logs = students.map { |s| s.discipline_logs.build(log_params) }
    if transactional_save(batch_logs)
      render_success :ok, message: "#{batch_logs.count} logs created.",
        json: batch_logs.map { |l| log_props(l.decorate) }
    else
      render_error :unprocessable_entity, errors: multi_errors(batch_logs)
    end
  end

  private
    def logs
      current_school.discipline_student_logs.includes(:student, :author, :violation)
    end

    def log
      @log ||= logs.find_by(id: params[:id])
    end

    def students
      @students ||= current_school.students.where(id: params[:student_ids])
    end

    def log_params
      params.permit(
        :victim_id,
        :datetime,
        :quarter,
        :author_id,
        :violation_id,
        :points,
        :description,
        :resolution
      )
    end

    def log_props(log)
      {
        id: log.id,
        student_id: log.student_id,
        full_name: log.student_full_name(:reverse),
        grade: log.student_grade,
        grade_label: grade_levels[log.student_grade],
        violation_id: log.violation_id,
        violation_name: log.violation_name,
        author_id: log.author_id,
        author_name: log.author_full_name(:reverse),
        points: log.points,
        datetime: log.datetime,
        victim_id: log.victim_id? ? log.victim_id : nil,
        victim_name: log.victim_full_name(:reverse),
        description: log.description,
        resolution: log.resolution
      }
    end
end
