class Admin::Administration::SchoolYears::SchoolDaysController < Admin::Administration::Controller
  def index
    data = days
      .includes(school: :school_config)
      .by_quarter(params[:quarter])
      .by_half_day(params[:half_day]&.to_bool)
      .by_cycle_day(params[:cycle_day])
      .ordered

    render_success :ok, json: data.decorate.map { |d| day_props(d) }
  end

  def show
    render_success :ok, json: day_props(day.decorate)
  end

  def create
    day = days.build(day_params)
    if day.save
      render_success :ok, json: day_props(day.decorate)
    else
      render_error :unprocessable_entity, errors: day
    end
  end

  def update
    if day.update(day_params)
      render_success :ok, json: day_props(day.decorate)
    else
      render_error :unprocessable_entity, errors: day
    end
  end

  def destroy
    if day.destroy
      render_success :ok
    else
      render_error :unprocessable_entity
    end
  end

  def batch_update
    data = days.where(id: params[:ids]).each { |d| d.assign_attributes(day_params) }
    if transactional_save(data)
      render_success :ok, message: 'School days updated.'
    else
      render_error :unprocessable_entity
    end
  end

  private
    def school_year
      @school_year ||= current_school.school_years.find_by(id: params[:school_year_id])
    end

    def days
      school_year.school_days
    end

    def day
      @day ||= days.find_by(id: params[:id])
    end

    def day_params
      params.permit(:date, :quarter, :half_day, :hours, :cycle_day)
    end

    def day_props(day)
      {
        id: day.id,
        date: day.date,
        formatted_date: day.formatted_date,
        quarter: day.quarter,
        term: day.term,
        half_day: day.half_day?,
        hours: day.hours,
        cycle_day: day.cycle_day,
        cycle_label: day.cycle_label
      }
    end
end
