
# Order Queue station is where order are submitted to
# Order can send from tablet | table
# Source of order will determin where it will appear
class OrderQueueStation < ApplicationRecord
  has_many :assigned_order_items
  has_many :order_items
  has_many :order_queue_process_by_zones
  has_many :zones, through: :order_queue_process_by_zones
  belongs_to :employee

  scope :active, -> {where(is_active: true)}

  # validations
  validates_presence_of :station_name, :printer_name

  def process_order(order, table_id, order_source = nil, pdf_status = nil ,change_to=nil, current_user=nil)
    order_items = order.order_items

    if table_id.to_i > 0
      # get dining
      dining = DiningFacility.find(table_id)
      oqs_stations = dining.order_queue_stations
    else
      oqs_stations = OrderQueueStation.active
    end

    assigned_order_items = []
    oqs_order_items_by_zones = []

    # ToDo per item per printer
    oqs_stations.each do |oqs|
      oqs_order_items = order_items.select { |i| JSON.parse(oqs.processing_items).include? i.item_code }
      oqs_order_items_by_zones << { oqs: oqs, oqs_order_items: oqs_order_items }

      print_status = false
      if oqs.auto_print && order_source != "quick_service"
        print_status = true
        if oqs_order_items.length > 0
          if oqs.cut_per_item
            print_slip_item(oqs, order, oqs_order_items, pdf_status, change_to, current_user, table_id)
          else
            print_slip(oqs, order, oqs_order_items, pdf_status, change_to, current_user, table_id)
          end
        end
      end

      oqs_order_items.each { |i| AssignedOrderItem.create({ order: order, item_code: i.item_code, instance_code: i.item_instance_code, order_queue_station: oqs, print_status: print_status, delivery_status: false }) }
    end
  end

  def pay_process_order_queue (order_id, table_id = nil)

    if table_id.to_i > 0
      # get dining
      dining = DiningFacility.find(table_id)
      oqs_stations = dining.order_queue_stations
    else
      oqs_stations = OrderQueueStation.active
    end

    order = Order.find(order_id)
    order_items = order.order_items

    assigned_order_items = []
    oqs_order_items_by_zones = []

    oqs_stations.each do |oqs|
      oqs_order_items = order_items.select { |i| JSON.parse(oqs.processing_items).include? i.item_code }
      oqs_order_items_by_zones << { oqs: oqs, oqs_order_items: oqs_order_items }

      if oqs.auto_print
        if oqs_order_items.length > 0
          if oqs.cut_per_item
            print_slip_item(oqs, order, oqs_order_items)
          else
            print_slip(oqs, order, oqs_order_items)
          end
        end
      end
    end
  end

  private
  #Print order_items in 1 slip
  def print_slip(oqs, order, order_items ,pdf_status=nil,change_to=nil,current_user=nil,table_id=nil)
    if pdf_status.nil?
      if print_settings = PrintSetting.where("unique_code REGEXP ?", "order.*summary.*pdf").first
        order_queue_printer = Printer::OrderQueuePrinter.new(print_settings)
        order_queue_printer.print_order_summary(print_settings, oqs, order.order_id, order_items, print_status="")
      end
    else
      move_print_pdf(change_to,current_user,table_id,order_items,oqs)
    end
  end

  #Print order_item in 1 slip per item
  def print_slip_item(oqs, order, assigned_items,pdf_status=nil,change_to=nil,current_user=nil,table_id=nil)
    if pdf_status.nil?
      # order_item = OrderItem.where("order_id='#{assigned_item.order_id}' AND item_instance_code='#{assigned_item.instance_code}'").first()
      # print when complete click
      if print_settings = PrintSetting.where("unique_code REGEXP ?", "order.*item.*pdf").first
        order_queue_printer = Printer::OrderQueuePrinter.new(print_settings)
        if !assigned_items.nil?
          assigned_items.each do |order_item|
            order_queue_printer.print_order_item(print_settings, oqs,order_item.order_id, order_item.order_items_id, print_status="" )
          end
        end
      end
    else
      move_print_pdf(change_to,current_user,table_id,assigned_items,oqs)
    end
  end

  def move_print_pdf(change_to,current_user,change_from,order_items,oqs)
    # if ENV["SERVER_MODE"] != "cloud" #no print in cloud server
      # get printer info
      @from          = (DiningFacility.find(change_from)).name
      @to            = (DiningFacility.find(change_to)).name
      @type          = (DiningFacility.find(change_to)).type
      @moved_by      = current_user
      @date          = Time.current

      @shop          = Shop.current_shop
      unique_code    = "MoveTablePdf"
      # pdf_no         = PrintSetting.where(:unique_code => unique_code).count
      print_settings = PrintSetting.find_by_unique_code(unique_code)
      # printer_array = []
      # printer_array = PrintSetting.where(:unique_code => unique_code)

      # for i in 0..pdf_no
      #   if i != pdf_no
          # print_settings = printer_array[i]
          printer        = Printer::ReceiptPrinter.new(print_settings)
          printer.print_move_table(print_settings,@to,@from ,@shop,@date,@type,@moved_by,order_items,oqs)
      #   end
      # end
    # end
  end
end
