class Admin::Legacy::Service::StudentLogsController < Admin::Legacy::Service::Controller
  include Shared::Legacy::Service::StudentLogsScoped
  include DateRangeHelper

  def index
    data = logs
      .by_date_range(datetime_range(params[:dates]))
      .by_status(params[:status])
      .by_student_ids(params[:student_ids])
    render_success :ok, json: data.map { |l| log_props(l) }
  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.service_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) }
    else
      render_error :unprocessable_entity, errors: multi_errors(batch_logs)
    end
  end

  def batch_update
    data = logs.where(id: params[:ids])
    data.each { |d| d.assign_attributes(log_params) }

    if transactional_save(data)
      render_success :ok, message: "#{data.count} logs updated."
    else
      render_error :unprocessable_entity, multi_errors(data)
    end
  end

  def batch_delete
    data = logs.where(id: params[:ids])
    count = data.count
    if transactional_destroy(data)
      render_success :ok, message: "#{count} logs deleted."
    else
      render_error :unprocessable_entity, multi_errors(data)
    end
  end

  def export
    options = { status: params[:status], dates: datetime_range(params[:dates]) }
    send_data ::Service::StudentLogsCsvService.call(current_school, options)
  end

  private
    def logs
      current_school.service_student_logs
    end

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

    def set_associations
      {}.tap do |prop|
        prop[:author] = current_user
        prop[:opportunity] = opportunity if opportunity
        prop[:skip_actioncable] = true
      end
    end

    def log_params
      params.permit(:hours, :notes, :datetime, :status).merge(set_associations)
    end
end
