class Support::Sites::Schools::EdFiController < Support::Sites::Controller
  def index
    render_success :ok, json: credentials.map { |c| ed_fi_props(c) }
  end

  def create
    if ed_fi_token
      @credential = EdFi::Credential.new(credential_params.merge(school: school))

      if @credential.save
        render_success :created, message: 'Ed-Fi Ed-Fi Connection', json: ed_fi_props(@credential)
      else
        render_error :unprocessable_entity, errors: @credential
      end
    else
      render_error :unprocessable_entity, message: 'Ed-Fi Connection Failed'
    end
  end

  def show
    render_success :ok, json: ed_fi_props(credential)
  end

  def update
    if ed_fi_token
      if credential.update(credential_params)
        render_success :ok, message: 'Successful Ed-Fi Connection'
      else
        render_error :unprocessable_entity, errors: credential
      end
    else
      render_error :unprocessable_entity, message: 'Ed-Fi Connection Failed'
    end
  end

  def destroy
    if credential.destroy
      render_success :ok, message: 'Ed-Fi Credentials removed'
    else
      render_error :unprocessable_entity, errors: credential
    end
  end

  def test_connection
    if ed_fi_token
      render_success :ok, message: 'Successful Ed-Fi Connection'
    else
      render_error :unprocessable_entity, message: 'Ed-Fi Connection Failed'
    end
  end

  private
    def school
      @school ||= School.find_by(id: params[:school_id])
    end

    def start_academic_year
      @start_academic_year ||= EdFi::Descriptor.find_by(descriptor: 'startAcademicYear').code
    end

    def credential
      @credential ||= if params[:id].present?
          EdFi::Credential.find_by(id: params[:id])
        else
          EdFi::Credential.find_or_initialize_by(school: school)
        end
    end

    def credentials
      if school.ed_fi_system == 'wisconsin'
        EdFi::Credential
          .where(school_id: school.id)
          .from_academic_year(start_academic_year)
          .order(academic_year: :desc)
          .limit(3)
      else
        EdFi::Credential.where(school_id: school.id)
      end
    end

    def ed_fi_environment
      school.find_or_build_ed_fi_indiana_environment
    end

    def ed_fi_token
      case school.ed_fi_system
      when 'indiana'
        dir = "#{ed_fi_environment.environment_service}::ApplicationService"
        dir.constantize
          .new(school.current_year.id)
          .valid_token?(credential_params)
      when 'wisconsin'
        EdFi::Wisconsin::ApplicationService
          .new(school.current_year.id)
          .valid_token?(credential_params)
      else
        true
      end
    end

    def credential_params
      if action_name == 'test_connection'
        credential.slice(:key, :secret, :academic_year)
      else
        params.permit(:key, :secret, :academic_year)
      end
    end

    def ed_fi_props(credential)
      {
        id: credential.id,
        edfi_enabled: school.ed_fi_system?,
        key: credential.key,
        secret: credential.secret,
        state: school.ed_fi_system.titleize,
        academic_year: credential.academic_year
      }
    end
end
