class Admin::UpgradeDatasController < AdminController
  before_action :authenticate_user!
  before_action :dashboard_topbar
  before_action :check_permission
  require 'fileutils'
  require 'tempfile'

  def index
    @upgrade_datas = UpgradeData.where(organisation_id: [nil, current_user.organisation_id]).where('version IS NOT NULL')
    @upgrade_data = UpgradeData.new
  end

  def create
    uploaded_io =upgrade_data_params['firmware_file']
    fname = uploaded_io.original_filename
    @version = fname.split('-')[2]
    @hw_part = fname.split('-')[1]
    @hw_parts = HardwarePart.all.pluck(:part_number)
    if  @hw_parts.include?@hw_part.to_s
      @u_data = UpgradeData.where(version: @version).first
        @url = {@hw_part => request.base_url.to_s + "/fw/#{@version}/#{uploaded_io.original_filename}"}
        @time = {@hw_part => Time.now.utc.to_s}
        if @u_data.blank? and @version.to_i > 0
          create_new(uploaded_io)
        elsif !@u_data.blank?
          @u_data.url.each{|a| @u_file = a[1].to_s if a[0].to_i == @hw_part.to_i}
          f_path = @u_file.split('fw') unless @u_file.blank?
          if !@u_file.blank? and !f_path[1].blank? and File.exist?(Rails.root.join("public/fw#{f_path[1]}"))
            if File.delete(Rails.root.join("public/fw#{f_path[1]}"))
              temp_url = {}
              temp_time= {}
              @u_data.url.zip(@u_data.upload_time).each do |url,time|
                if url[0].to_i != @hw_part.to_i
                  temp_url[url[0]] = url[1]
                end
                if time[0].to_i != @hw_part.to_i
                  temp_time[time[0]] = time[1]
                end
              end
              @u_data.update_attributes(:url => temp_url, :upload_time => temp_time)
              create_new(uploaded_io)
            end
          else
            create_new(uploaded_io)
          end
        else
          flash[:notice] = "Name of the file uploaded is not in proper format! Please try again"
        end
    else
        flash[:notice] = "Hardware number in the file name is not between 1 to #{@hw_parts.sort.max}! Please try again"
    end
    redirect_to admin_upgrade_datas_path
  end

  def change_release_state
    params
    render :json=> {:status=>false,:reload => false}.to_json and return if params[:id].blank?
    @upgrade_data =  UpgradeData.where(id: params[:id]).last
    if @upgrade_data.present?
      if params[:is_released] == "true"
        state = true 
      else 
       state = false
      end   
      @upgrade_data.update_attributes({is_released: state})
      if @upgrade_data.save!
        render :json=> {:status=>'success',:msg=>'Successfully updated version released status',:reload => true}.to_json and return
      else
        render :json=> {:status=>'error',:msg=>'Oops! Problem updating status Please try after some time',:reload => false}.to_json and return
      end
    else  
    end  
  end

  private
    def upgrade_data_params
      params.require(:upgrade_data).permit(:firmware_file)
    end

    def create_new uploaded_io
       f_path =  Rails.root.join("public/fw/#{@version}/#{uploaded_io.original_filename}")
      Dir.mkdir(Rails.root.join("public/fw/#{@version}")) unless Dir.exist?(Rails.root.join("public/fw/#{@version}"))
      temp_file = Tempfile.new("temp_file")
      File.open(temp_file.path, 'wb') do |file|
          file.write(uploaded_io.read)
      end
      temp_file.rewind
      if @u_data.blank? and File.exist?(temp_file.path)
        FileUtils.cp(temp_file.path, f_path)
        FileUtils.chmod 0755, "#{f_path}"
        UpgradeData.create!(:version => @version,:url => @url,:upload_time => @time)
        flash[:success] = "New Firmware uploaded Successfully!"
      elsif !@u_data.blank? and File.exist?(temp_file.path)
        @u_data.url.zip(@u_data.upload_time).each do |url,time|
            @url[url[0]] = url[1]
            @time[time[0]] = time[1]
        end
        FileUtils.cp(temp_file.path, f_path)
        FileUtils.chmod 0755, "#{f_path}"
        @u_data.update_attributes(:url => @url, :upload_time => @time)
        flash[:success] = "Updated the firmware Successfully!"
      else
        flash[:error] = "Oops! there was a problem uploading the firmware ,Please try again"
      end
      temp_file.unlink rescue nil
    end
end
