class SchoolConfig < Base::SchoolConfig
  enum school_year_type: { sessions: -1, semester: 1, semesters: 2, trimesters: 3 }
  enum family_directory: [:disabled, :family_access, :family_student_access], _prefix: true
  enum ed_fi_type: { disabled: 0, choice: 1, all_types: 2 }
  enum google_sso: { disabled: 0, student: 1, employee: 2, both: 3 }, _prefix: true

  associations_for legacy: true do |a|
    a.belongs_to :school, inverse_of: :school_config
  end

  has_many :school_years, through: :school
  has_many :school_year_sessions, through: :school_years

  validate :tep_successfully_activated, if: :tep_integration_changed?

  def quarters
    if sessions?
      current_year_sessions.pluck(:sequence, :name).to_h
    elsif trimesters?
      Array.new(3) { |i| [i + 1, "Trimester #{i + 1}"] }.to_h
    else
      number_of_quarters = SchoolConfig.school_year_types[school_year_type] * 2
      Array.new(number_of_quarters) { |i| [i + 1, "Quarter #{i + 1}"] }.to_h
    end
  end

  def semesters
    if sessions?
      current_year_sessions.pluck(:sequence, :name).to_h
    else
      Array.new(SchoolConfig.school_year_types[school_year_type]) do |index|
        label = "#{school_year_type.humanize.singularize} #{index + 1}"
        [index + 1, label]
      end.to_h
    end
  end

  def current_year_sessions
    school_year_sessions.where(school_year: school_years.current).order(:sequence)
  end

  def term_label
    return 'Session' if sessions?
    return 'Trimester' if trimesters?

    'Quarter'
  end

  def directory_permissions(role)
    case role
    when :family
      {
        employee: {
          directory: bitwise_permission?(employee_directory, 1),
          phone: bitwise_permission?(employee_directory, 2),
          email: bitwise_permission?(employee_directory, 4)
        },
        family: family_directory_family_access? || family_directory_family_student_access?
      }
    when :student
      {
        employee: {
          directory: bitwise_permission?(employee_directory, 1, 8),
          phone: bitwise_permission?(employee_directory, 16),
          email: bitwise_permission?(employee_directory, 32)
        },
        family: family_directory_family_student_access?
      }
    end
  end

  def menu_permissions
    @menu_permissions ||= {
      news: bitwise_permission?(school_menu, 1),
      calendar: bitwise_permission?(school_menu, 2),
      documents: bitwise_permission?(school_menu, 4)
    }
  end

  private
    def bitwise_permission?(attribute, *args)
      args.each do |bitwise|
        return false if (attribute & bitwise).zero?
      end
      true
    end

    def tep_successfully_activated
      return unless tep_integration?
      return if Tep::SchoolService.call(school)

      errors.add(:tep_integration, 'TEP link was unsuccessful')
    end
end
