class Admin::ApprovedFirmwaresController < AdminController
  include CacheExistence
  before_filter :authenticate_user!
  before_action :set_approved_firmware, only: [:show, :edit, :update, :destroy]
  before_filter :dashboard_topbar
  skip_before_filter :check_permission
  load_and_authorize_resource :class => ApprovedFirmware
  skip_load_resource :only => [:new, :create]
  
  def index
    @approved_firmwares = current_user.organisation.approved_firmwares rescue []
    if request.format.json?
      render json: {data: {approved_firmwares: @approved_firmwares.map(&:json_build)}}
    else
      redirect_to new_approved_firmware_path if @approved_firmwares.blank?
    end
  end

  def show
    if request.format.json?
      render json: {data: {approved_firmware: @approved_firmware.json_build}}
    end
  end

  def create
    if params[:upgrade_data_id].present? && params[:hardware_category_name].present?
      upgrade_data = UpgradeData.find_by_id(params[:upgrade_data_id])
      hardware_category = HardwareCategory.where(name: params[:hardware_category_name]).last
      if upgrade_data.present? && hardware_category.present? 
        approved_hardware_models_name = HardwarePart.where(name: params[:approved_hardware_models].split(',')).pluck(:name).join(',')
        if approved_hardware_models_name.blank?
          render json: { msg: "Please provide valid hardware model names"}, status: 422
          return
        else
          @approved_firmware = current_user.organisation.approved_firmwares.new({upgrade_data_id: upgrade_data.id, version: upgrade_data.version, approved_hardware_models: approved_hardware_models_name, organisation_id: upgrade_data.organisation_id, hardware_category_id: hardware_category.id, schedule_time_slot: params[:schedule_time_slot]})
          if @approved_firmware.save
            flash[:success] = "Approved firmware was Successfully created."
            json_data = {data: {version: @approved_firmware.version, hardware_category_name: hardware_category.name, approved_hardware_models: @approved_firmware.approved_hardware_models, schedule_time_slot: @approved_firmware.schedule_time_slot} , status: 200}
          else
            flash[:error] = "Oops! there was some problem in creating Approved Firmware"
            json_data = {message: "Approved Firmware is not created. Please try again." , status: 422}
            Rails.logger.warn "#{@approved_firmware.errors.full_messages}"
          end
          if request.format.json?
            render json: json_data, status: json_data[:status]
          else
            redirect_to  @approved_firmware
          end
        end
      else
        render json: { msg: "Requested upgrade data or hardware category name not found. Please check", error_code: 2003}, status: 404
      end
    else
      render json: { msg: "Please Provide upgarde data id and Hardware category name", error_code: 2004}, status: 422
    end
  end

  def update
    if @approved_firmware.update(approved_firmware_params)
      flash[:success] = "Successfully updated Approved Firmware"
      json_data = {data: @approved_firmware.json_build , status: 200}        
    else
      flash[:error] = "Oops! there was some problem updating Approved Firmware"
      json_data = {message: "Approved Firmware is not updated (Reason: #{@approved_firmware.errors.full_messages}).", status: 422}
    end
    if request.format.json?
      render json: json_data, status: json_data[:status]
    else
      redirect_to @approved_firmware
    end
  end

  def destroy
    if @approved_firmware.destroy
      flash[:success] = "Successfully deleted Approved Firmware"
      json_data = {data: {}, status: 200}
    else
      flash[:error] = "Oops! there was some problem in deleting Approved Firmware"
      json_data = {message: "Approved Firmware is not deleted. Please try again.", status: 422}
      Rails.logger.warn "#{@approved_firmware.errors.full_messages}"
    end
    if request.format.json?
      render json: json_data, status: json_data[:status]
    else
      redirect_to approved_firmwares_url
    end
  end


  private

  def current_ability
    if cache_exist?
      @current_ability ||= Ability::ApprovedFirmwareAbility.new(current_user)
    else
      @current_ability ||= Ability.new(current_user)
    end
  end

  def approved_firmware_params
    params.require(:approved_firmware).permit(:upgrade_data_id, :version, :approved_hardware_models, :organisation_id, :hardware_category_id, :schedule_time_slot)
  end

  def set_approved_firmware
    @approved_firmware = @current_user.organisation.approved_firmwares.where(:id => params[:id]).first
    if @approved_firmware.blank?
      if request.format.json?
        render json: {message: "Requested Approved Firmware is not found", status: 404}, status: 404
      else
        flash[:notice] = "RequestedApproved Firmware not found!"
        redirect_to approved_firmware_path
      end
    end
  end
end