class Api::V1::ApMetadataController < Api::V1::ApiController
  def create
    ap_data_params = permitted_params
    router_inventory = RouterInventory.where(mac_id: ap_data_params[:mac]).first
    unless router_inventory.blank?
      begin
        router_inventory.latitude = ap_data_params[:latitude] unless ap_data_params[:latitude].blank?
        router_inventory.longitude = ap_data_params[:longitude] unless ap_data_params[:longitude].blank?
        router_inventory.notes = ap_data_params[:notes] unless ap_data_params[:notes].blank?

        #Save AP metadata and image/video file into paperclip model
        ap_metadata = router_inventory.ap_metadatas.build(project_name: ap_data_params[:project_name], location_name: ap_data_params[:location_name], notes: ap_data_params[:notes], latitude: ap_data_params[:latitude], longitude: ap_data_params[:longitude], scanned_data: params[:scanned_data])
        medias = (ap_data_params[:pictures] || []) + (ap_data_params[:videos] || [])

        temp_files = []
        size_exceed = false
        medias.each do |encoded_string|
          temp = Tempfile.new(router_inventory.id.to_s)
          File.open(temp, "wb") do |file|
            file.write(Base64.decode64(encoded_string))
          end

          if temp.present?
            ap_metadata.medias.build(:media => temp)
            temp_files << temp
            #If total size of all media exceeds 10MB then exit
            if temp_files.map(&:size).sum > 10 * 1024 * 1024
              size_exceed = true
              break
            end
          end
        end

        if !size_exceed && ap_metadata.valid? && router_inventory.valid?
          ap_metadata.save
          router_inventory.save
          render :json => {status: 200, message: "Successfully updated"}
        else
          message = size_exceed ? "Total size of all media files should not exceed 10MB" : "Validation failed!" 
          render :json => {status: 202, message: "Problem in adding AP metadata", error: message }
        end
      ensure
        temp_files.each {|t| t.unlink }      
      end
    else
      render :json => {status: 404, message: "Requested AP is not found."} 
    end
  end

  private
    
    def permitted_params
      params.permit(:project_name, :location_name, :mac, :notes, :latitude, :longitude, :pictures => [], :videos => [])
    end
end
