class Pdf::Admissions::SubmittedApplicationService < Pdf::NewApplicationService
  def initialize(applicant)
    @applicant = applicant
    @school = applicant.school
  end

  private
    def header
      content = ActionController::Base.new.render_to_string(
        partial: 'pdf/headers/school_info.html.haml',
        locals: {
          school: @school,
          side_content_partial: 'pdf/admissions/submitted_application_header.html.haml',
          side_content: { applicant: @applicant, date: Time.zone.today, submitted_date: @applicant.submitted_at }
        }
      )
      { content: content, spacing: 25 }
    end

    def body
      ActionController::Base.new.render_to_string(
        partial: 'pdf/admissions/submitted_application.html.haml',
        locals: {
          school: @school,
          applicant: @applicant,
          profile_fields: application.profile_fields,
          additional_values: additional_values,
          medical: @applicant.find_or_build_applicant_medical,
          applicant_agreements: @applicant.applicant_agreements.includes(:agreement),
          applicant_essays: @applicant.applicant_essays.includes(:essay),
          applicant_documents: @applicant.applicant_documents.includes(:document),
          family_revision: family_revision,
          family_revision_fields: @school.admission_family_revision_fields.by_display_fields,
          family_additional_values: family_additional_values_condition,
          family_medical: family_medical,
          medical_revision_fields: @school.admission_medical_revision_fields.with_display,
          contact_revisions: contact_revisions,
          contact_families: contact_families,
          student_classes: student_class_selection? ? student_classes : []
        }
      )
    end

    def application
      @application ||= @applicant.application
    end

    def family
      @family ||= @applicant.family
    end

    def school_year
      @school_year ||= @applicant.application.school_year
    end

    def additional_values
      @applicant.additional_values
        .join_application_fields(application)
        .includes(:student_additional_field)
    end

    def family_revision
      family.admission_family_revisions
        .includes(:country, :country_2)
        .find_or_initialize_by(school_year: school_year).decorate
    end

    def family_additional_values
      @family_additional_values ||= @applicant.family.admission_family_additional_values
        .by_school_year(school_year)
        .join_displayable_additional_fields
        .includes(:family_additional_field)
    end

    def family_additional_values_legacy
      @applicant.family.family_additional_values
        .joins(:family_additional_field)
        .where('FamilyStatistics.Admissions = 1')
        .merge(FamilyAdditionalField.join_application_fields)
    end

    def family_additional_values_condition
      if family_additional_values.count.positive?
        family_additional_values
      else
        family_additional_values_legacy
      end
    end

    def family_medical
      family.admission_medical_revisions.find_or_initialize_by(school_year: school_year)
    end

    def contact_revisions
      family.admission_contact_revisions
        .includes(:country, :title)
        .by_school_year(school_year)
    end

    def contact_families
      family.contact_families.not_in_contact_revisions.includes(contact: [:country, :title])
    end

    def student_class_selection?
      config = @school.find_or_build_enrollment_config
      config.manual? && config.classes? && @applicant.student
    end

    def student_classes
      @applicant.student.class_student_enrollments
        .includes(:classroom)
        .where(school_year: school_year)
    end
end
