class Family::Legacy::ParentTeacherMeetingsController < Family::Controller
  def index
    render_success :ok, json: family_students.map { |s| student_props(s) }
  end

  def create
    meeting_time = params[:time]
      .to_time
      .change(day: 1, month: 1, year: 2000) # legacy uses a datetime with no date
    date = params[:date].to_date
    meeting = current_user.family.parent_teacher_meetings.new(
      school: current_school,
      student: student,
      user: teacher,
      date: date,
      time: meeting_time
    )

    if time_available?(date, meeting_time) && meeting.save
      render_success :created, json: new_meeting_props(meeting)
    else
      render_error :unprocessable_entity, json: meeting.errors.full_messages
    end
  end

  private
    def family_students
      @family_students ||= students.join_school_year_student(current_school_year.id, :current)
    end

    def student
      @student ||= family_students.find_by(id: params[:student])
    end

    def teacher
      @teacher ||= current_school.parent_teacher_users.find_by(user_id: params[:teacher_id])&.user
    end

    def parent_teacher_dates
      @parent_teacher_dates ||= current_school.parent_teacher_dates
        .where('date >= ?', Time.zone.today)
        .where(active: [1, 2, 3]) # excluding closed dates
    end

    def parent_teacher_families
      @parent_teacher_families ||= current_family.parent_teacher_families.pluck(:date_id)
    end

    def parent_teacher_meetings
      @parent_teacher_meetings ||= current_family.parent_teacher_meetings
        .includes(:user)
        .where(date: parent_teacher_dates.pluck(:date))
        .group_by(&:student_id)
    end

    def time_available?(date, meeting_time)
      meetings = current_school.parent_teacher_meetings
        .where(date: date, time: meeting_time, user_id: teacher.id)
      pt_date = parent_teacher_dates.detect { |d| d.date == date }
      meetings.empty? &&
        pt_date&.open? || pt_date&.select_families? && parent_teacher_families.include?(pt_date.id)
    end

    def student_props(student)
      {
        id: student.id,
        first_name: student.first_name,
        last_name: student.last_name,
        meetings: parent_teacher_meetings[student.id]&.map { |m| meeting_props(m) }
      }
    end

    def meeting_props(meeting)
      {
        date: meeting.date,
        time: I18n.l(Time.zone.local_to_utc(meeting.time), format: :time),
        teacher: meeting.user.full_name
      }
    end

    def new_meeting_props(meeting)
      {
        teacher_id: meeting.user.id,
        student_id: meeting.student_id,
        time: I18n.l(Time.zone.local_to_utc(meeting.time), format: :time)
      }
    end
end
