class Admin::Legacy::Service::FamilyLogsController < Admin::Legacy::Service::Controller
  include DateRangeHelper

  def index
    data = logs
      .by_date_range(datetime_range(params[:dates]))
      .by_status(params[:status])
      .by_family_ids(params[:family_ids])
    render_success :ok, json: data.map { |l| log_props(l) }
  end

  def show
    render_success :ok, json: log_props(log)
  end

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

    batch_logs = families.map { |f| f.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

  private
    def logs
      current_school.service_family_logs.includes(:family, :opportunity)
    end

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

    def families
      @families ||= current_school.families.where(id: params[:family_ids])
    end

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

    def opportunity
      @opportunity ||= current_school.service_opportunities
        .find_by(id: params[:opportunity_id])
    end

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

    def log_props(log)
      {
        id: log.id,
        datetime: log.datetime,
        opportunity_id: log.opportunity_id,
        opportunity_name: log.opportunity.name,
        notes: log.notes,
        hours: log.hours,
        status: log.status,
        family_name: log.family.name,
        family_id: log.family_id,
        created_at: log.created_at_or_created_dt,
        school_year_id: log.school_year_id
      }
    end
end
