class StockByPointsaleDatatable
  delegate :params, :image_tag, :is_a, :number_to_currency, :available_products_path, :stock_by_pointsale_path, to: :@view

  def initialize(view, user, selected)
    @view = view
    @current_user = user
    @selected = selected
  end

  def as_json(_options = {})
    total = WarehouseStock.activos.where('stock > 0').count + AvailableProduct.activos.where('stock > 0').count
    {
      sEcho: params[:sEcho].to_i,
      iTotalRecords: total,
      iTotalDisplayRecords: (params[:length].to_i != -1 ? stock.total_entries : stock.size),
      aaData: data
    }
  end

  private

  def data
    stock.map do |available|
      img = available.product.img_product? ? available.product.img_product.url(:small) : "/images/small/missing.png"
      category = available.categories[0]

      if @current_user.usertype == 'C'
        [
          (image_tag img),
          get_display_name(available.product),
          (category.parent_id.zero? ? category.category : category.parent.category),
          (category.parent_id != 0 ? category.category : ' '),
          available.stock.round,
          "<h3> $#{get_price_sale(available.product)} </h3>"
        ].compact
      else
        arr = [
          (image_tag img),
          get_display_name(available.product),
          (category.parent_id.zero? ? category.category : category.parent.category),
          (category.parent_id != 0 ? category.category : ' '),
          available.stock_min.round,
          available.stock_max.round,
          available.stock.round
        ]
        arr << get_price_sale(available.product) unless @current_user.usertype == "S"
        arr.compact
      end
    end
  end

  def get_display_name(product)
    name = "<label style='margin-bottom:0px'><strong>#{product.name}</strong></label> <br>"
    name += "#{product.display_attributes} <br>" if product.display_attributes.present?
    name += "SKU: #{product.sku}"
    name += "<br> <i class='fa fa-barcode'></i>: #{product.barcode}" if product.barcode.present?
    name
  end

  def get_price_sale(product)
    location_id = params[:location][2, params[:location].length] unless params[:location].blank?
    "<h3> $#{product.get_price_sale(location_id)} </h3>"
  end

  def stock
    @stock ||= fetch_stock
  end

  def fetch_stock
    location = params[:location]
    category = params[:category]
    sub_category = params[:sub_category]

    location_id = params[:location][2, params[:location].length] unless location.blank?

    if (@current_user.usertype == 'S' && location.blank?) || (!location.blank? && location.first == 'W')
      stock = WarehouseStock.activos.includes(:categories, :warehouse).where(warehouse_id: (location_id.blank? ? @current_user.warehouse_id : location_id)).where('stock > 0')
    elsif (@current_user.usertype != 'S' && location.blank?) || (!location.blank? && location.first == 'P')
      stock = AvailableProduct.activos.includes(:categories, :pointsale).where(pointsale_id: (location_id.blank? ? @current_user.pointsale_id : location_id)).where('stock > 0')
    end

    if sub_category.present?
      stock = stock.joins(:categories).where('categories.id = ?', sub_category)
    elsif category.present?
      subs_ids = Category.activos.where(parent_id: category).pluck(:id)
      stock = stock.joins(:categories).where('categories.id IN (?)', subs_ids)
    end

    if params[:length].to_i != -1
      stock = stock.page(page).per_page(per_page)
    end

    unless params[:busqueda].blank?
      stock = stock.where("products.sku ilike :search or products.name ilike :search", search: "%#{params[:busqueda]}%")
    end

    stock
  end

  def page
    params[:start].to_i / per_page + 1
  end

  def per_page
    params[:length].to_i > 0 ? params[:length].to_i : 20
  end

  def sort_column
    columns = %w[name]
    columns[params[:iSortCol_0].to_i]
  end

  def sort_direction
    params[:sSortDir_0] == "desc" ? "desc" : "asc"
  end
end
