# frozen_string_literal: true

# API Controller for resources of type Export
# Export are used to download data tables in offline files
class API::ExportsController < API::ApiController
  before_action :authenticate_user!
  before_action :set_export, only: [:download]

  def download
    authorize @export
    mime_type = if @export.extension == 'xlsx'
                  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                elsif @export.extension == 'csv'
                  'text/csv'
                else
                  'application/octet-stream'
                end

    if FileTest.exist?(@export.file)
      send_file File.join(Rails.root, @export.file),
                type: mime_type,
                disposition: 'attachment'
    else
      render text: I18n.t('errors.messages.export_not_found'), status: :not_found
    end
  end

  def status
    authorize Export

    exports = Export.where(
      category: params[:category],
      export_type: params[:type],
      query: params[:query],
      key: params[:key],
      extension: params[:extension]
    )
    export = retrieve_last_export(exports, params[:category], params[:type])

    if export.nil? || !FileTest.exist?(export.file)
      render json: { exists: false, id: nil }, status: :ok
    else
      render json: { exists: true, id: export.id }, status: :ok
    end
  end

  private

  def retrieve_last_export(export, category, type)
    case category
    when 'users'
      case type
      when 'subscriptions'
        export = export.where('created_at > ?', Subscription.maximum('updated_at'))
      when 'reservations'
        export = export.where('created_at > ?', Reservation.maximum('updated_at'))
      when 'members'
        export = export.where('created_at > ?', User.members.maximum('updated_at'))
      else
        raise ArgumentError, "Unknown export users/#{type}"
      end
    when 'availabilities'
      case type
      when 'index'
        export = export.where('created_at > ?', [Availability.maximum('updated_at'), Reservation.maximum('updated_at')].max)
      else
        raise ArgumentError, "Unknown type availabilities/#{type}"
      end
    when 'accounting'
      case type
      when 'acd'
        export = export.where('created_at > ?', Invoice.maximum('updated_at'))
      else
        raise ArgumentError, "Unknown type accounting/#{type}"
      end
    else
      raise ArgumentError, "Unknown category #{category}"
    end
    export.last
  end

  def set_export
    @export = Export.find(params[:id])
  end
end