class Api::V1::NetworkSsidsController < Api::V1::ApiController
  protect_from_forgery with: :null_session
  before_action :user_authentication_for_api
  before_action :set_current_network, only: [:create, :update, :destroy]
  check_policy_for :create, :update, :destroy, with: NetworkSsid, id_param: :id
  api :GET, "/v1/list_network_ssids", "List Network SSIDs"
  param :access_token, String, :desc => "User Access Token"#, :required => true
  param :network_name, String, :desc => "Network Name"

  def index
    list_ssids
  end

  def list_network_ssids
    list_ssids
  end

  def list_ssids
    params_network_name = params[:network_name]
    params_network_id = params[:network_id]
    @all_ssids = @user.organisation.location_networks.map{|s| s.network_ssids.map{|n| n.json_build}}.flatten.uniq
    if params_network_name
      @current_ssids = @user.organisation.location_networks.where(:network_name => params_network_name).first
    else
      @current_ssids = @user.organisation.location_networks.where(:id => params_network_id).first
    end
    if params_network_name.present? || params_network_id.present?
      if @current_ssids.present?
        @network_ssid = @current_ssids.network_ssids
        render json: { data: { network_ssids: @network_ssid.map{|n| n.json_build} } }
      else
        render json: { msg: "Requested Network not found. Please check your Network", error_code: 1001}, status: 404
      end
    else
      render json: { data: { network_ssids: @all_ssids} }
    end
  end

  def show
    ssid = @user.network_ssids.where(id: params[:id]).last
    if ssid.present?
      render json: { data: { network_ssid: ssid.json_build } }
    else
      render json: { msg: "Requested SSID not found. Please check your Network SSID ID", error_code: 1021}, status: 404
    end
  end

  #api :PUT, "/v1/update_network_ssid", "Update SSID"  
  #param :access_token, String, :desc => "User Access Token"#, :required => true
  #param :network_ssid, Hash, :desc => "Param description for all fields" do
  #  param :ip_address, String, :desc => "IP Address", :required => true
  #  param :subnet_mask, String, :desc => "Netmask", :required => true
  #  param :dhcp_ranges, Array, :desc => "Ranges", :required => true
  #  param :dhcp_mappings, Array, :desc => "Mappings", :required => true
  #  param :ssid_mode, String, :desc => "Mode of ssid", :required => true
  #  param :dhcp_relay_server, String, :desc => "DHCP relay server", :required => true
  #  param :id, Integer, :desc => "ID", :required => true
  #end

  def update_network_ssid
    update_ssid
  end

  def update
    ssid_id = params[:id] || network_ssid_params[:id]
    lns = @user.organisation.location_networks.pluck :id
    @network_ssid = NetworkSsid.where("id = ? && location_network_id in (?)", ssid_id, lns).first

    if @network_ssid.present?
      if @network_ssid.update_attributes(network_ssid_params)
        render json: { msg: "Successfully updated Network SSID", data: @network_ssid.slice("id", "ssid_name") }
      else
        render json: { msg: "Oops! there was some problem in updating Network SSID", errors: "#{@network_ssid.errors.full_messages.join(",")}", error_code: 1022}, status: 422
      end
    else
      render json: { msg: "Requested Network SSID not found. Please check your SSID", error_code: 1021}, status: 404
    end
  end

  def update_ssid
    ssid_id = params[:id] || network_ssid_params[:id]
    ssid_mode = network_ssid_params[:ssid_mode]
    dhcp_relay_server = network_ssid_params[:dhcp_relay_server]
    lns = @user.organisation.location_networks.pluck :id
    @network_ssid = NetworkSsid.where("id = ? && location_network_id in (?)", ssid_id, lns).first
    network_ssid_mode = NetworkSsid.where("ssid_mode = ? && location_network_id in (?)", ssid_mode, lns).first
    network_relay_server = NetworkSsid.where("dhcp_relay_server = ? && location_network_id in (?)", dhcp_relay_server, lns).first

    if @network_ssid.present?
      if network_ssid_mode.ssid_mode == "1" && network_relay_server.dhcp_relay_server == "2"
        if @network_ssid.update_attributes(network_ssid_params)
          render json: { msg: "Successfully updated Network SSID", data: @network_ssid.slice("id", "ssid_name") }
        else
          render json: { msg: "Oops! there was some problem in updating Network SSID", errors: "#{@network_ssid.errors.full_messages.join(",")}", error_code: 1022}, status: 422
        end
      else
        render json: { msg: "You have not selected Router mode or DHCP Server not Enabled", error_code: 1023}, status: 422
      end
    else
      render json: { msg: "Requested Network SSID not found. Please check your SSID", error_code: 1021}, status: 404
    end
  end

  def create
    if @location_network.present?
      ssid = @location_network.network_ssids.new(network_ssid_params)
      if ssid.save#@location_network.network_ssids.create(netork_ssid_params)
        render json: {msg: "Successfully created a Network SSID", data: {id: ssid.id, ssid_name: ssid.ssid_name}}
      else
        render json: {msg: "Oops! there was some problem in creating Network SSID", errors: "#{ssid.errors.full_messages.join(",")}",error_code: 1024}, status: 422
      end
    else
      render json: { msg: "Requested Location Network ID not found. Please check your Location Network ID.", error_code: 1001}, status: 404
    end
  end

  def set_current_network
    @location_network = LocationNetwork.find_by(id: params[:network_id]) || 
                        LocationNetwork.joins(:network_ssids).find_by('network_ssids.id' => params[:id])

    @current_network = @location_network
  end

=begin
  def destroy
    location_network = LocationNetwork.where(id: params[:network_id]).last
    if location_network.present? && location_network.network_ssids.count > 1
      a = location_network.network_ssids.find_by_id(params[:id])
      unless a.blank?
        if a.destroy
          msg = "Successfully deleted Network SSID ( #{a.ssid_name} )"
          data = {id: a.id, ssid_name: a.ssid_name}
        else
          msg = "Oops! Requested  Network SSID is not found"
          Rails.logger.warn "#{a.errors.full_messages}"
        end
      else
        msg = "Requested Network SSID is not found on this network!"
      end
    else
      msg = "Location network is not found"
    end
    
    render json: {msg: msg, data: data} 
  end
=end

  def destroy
      data = nil
      a = NetworkSsid.where(location_network_id: @user.networks_with_full_access.pluck(:id)).find_by_id(params[:id])
      unless a.blank?
        if a.destroy
          render json: { msg: "Successfully deleted Network SSID ( #{a.ssid_name} )", data: {id: a.id, ssid_name: a.ssid_name}}
        else
          Rails.logger.warn "#{a.errors.full_messages}"
          render json: { msg: "Oops! Requested  Network SSID is not able to delete", error_code: 1025}, status: 422
        end
      else
        render json: { msg: "Requested Network SSID is not found on this network!", error_code: 1021}, status: 404
      end    
  end

  def network_ssid_params
    params.require(:network_ssid).permit(:id,:ssid_name,:is_enabled,:ssid_mode,:nat,:wna,:is_hidden,:is_isolate,:security_mode,:wpa_algorithm,:wpa_key,:psk_type,:auth_radius_id,:acc_radius_enabled,:acc_radius_id,:acl_mac,:mac_filter_policy,:acl_mac_list,:captive_portal,:splash_url,:wallgarden,:walled_garden_range,:overwrite_success_url,:success_url,:dhcp_range_start,:dhcp_range_end,:dhcp_relay_server,:dhcp_lease_time,:ip_address,:subnet_mask, :per_user_qos, :enable_ssid_qos, :ssid_qos, :radio_band, :wds_enabled,:max_association, :dns_mode, :dns_primary, :dns_secondary , :default_idle_timeout, :default_interim_time, :uplink_priority, :associated_aps_and_tags => [], :dhcp_mappings => [:IPADDR,:MAC],:dhcp_ranges => [:START,:END],:v_lan_attributes => [:name,:enable_dhcp_on_v_lan,:v_lan_id, :id])
  end
end
