module Suppliers
  class ListsController < Suppliers::ApplicationController
    # GET /lists
    # GET /lists.json
    def index
      if params[:state] == 'active'
        @lists = List.active_for_supplier(current_supplier, page: params[:page], per_page: params[:per_page] || 25)
      elsif params[:date].present?
        @date = params[:date].present? ? (Date.parse(params[:date]) rescue Date.today) : Date.today
        @time = @date.to_time(:utc)
        @start_time = @time.beginning_of_day
        @end_time = @time.end_of_day
        if current_supplier.night_offset.present?
          @start_time += current_supplier.night_offset.to_f.hours
          @end_time += current_supplier.night_offset.to_f.hours
        end
        @lists  = List.for_supplier_created_at current_supplier, @start_time..@end_time
        #@lists.include_relation(:table) # for number
      else
        @lists = List.for_supplier(current_supplier, page: params[:page], per_page: params[:per_page] || 25)
      end
      @lists.include_relation(:table, :users, orders: {user: nil, product_orders: :product})

      render json: @lists, include: %w[
        orders
        orders.user
        orders.product_orders
        users
      ]
    end


    def active
      @lists = List.active_for_supplier(current_supplier)
      @lists.include_relation(:table) # for number

      respond_to do |format|
        format.html # index.html.erb
        format.json { render json: @lists }
      end
    end

    def at_date
      @date = params[:date].present? ? (Date.parse(params[:date]) rescue Date.today) : Date.today
      @time = @date.to_time(:utc)
      @start_time = @time.beginning_of_day
      @end_time = @time.end_of_day
      if current_supplier.night_offset.present?
        @start_time += current_supplier.night_offset.to_f.hours
        @end_time += current_supplier.night_offset.to_f.hours
      end
      @lists  = List.for_supplier_created_at current_supplier, @start_time..@end_time
      @lists.include_relation(:table) # for number

      render json: @lists, include: %w[table]
    end

    # GET /lists/1
    # GET /lists/1.json
    def show
      @list = List.find_by_supplier_id_and_id!(current_supplier.id, params[:id])
      render json: @list
    end

    # GET /lists/1/extra_info
    # GET /lists/1/extra_info.json
    def extra_info
      @list = List.find_by_supplier_id_and_id!(current_supplier.id, params[:id])
      render layout: false
    end

    # GET /lists/new
    # GET /lists/new.json
    def new
      @list = List.new
      @list.section_id = params[:section_id].presence
      @tables = current_supplier.active_tables

      render json: @list
    end

    # POST /lists
    # POST /lists.json
    def create
      @list = List.new(list_params)
      @list.supplier = current_supplier

      if @list.save
        render json: @list
      else
        render json: {errors: @list.errors}, status: :unprocessable_entity
      end
    end

    # GET /lists/1/edit
    def edit
      @list = List.find_by_supplier_id_and_id!(current_supplier.id, params[:id])
      @tables = current_supplier.active_tables
    end

    # PUT /lists/1
    # PUT /lists/1.json
    def update
      @list = List.find_by_supplier_id_and_id!(current_supplier.id, params[:id])

      if @list.update_attributes(list_params)
        render json: @list
      else
        render json: {errors: @list.errors}, status: :unprocessable_entity
      end
    end

    # DELETE /lists/1
    # DELETE /lists/1.json
    def destroy
      @list = List.find_by_supplier_id_and_id!(current_supplier.id, params[:id])
      @list.destroy
      head :no_content
    end
    # POST /supplier/lists/1/close
    def close
      @list = List.find_by_supplier_id_and_id(current_supplier.id, params[:id])
      @list.close!
      head :no_content
    end

    # POST /supplier/lists/1/mark_helped
    def mark_helped
      @list = List.find_by_supplier_id_and_id(current_supplier.id, params[:id])
      @list.mark_helped!
      head :no_content
    end

    def remove_needs_payment
      @list = List.find_by_supplier_id_and_id(current_supplier.id, params[:id])
      @list.remove_needs_payment!
      head :no_content
    end

    # POST /list/:id/change_table?to_table=:table_id
    def change_table
      res = {}
      status = 200
      @list = List.find_by_supplier_id_and_id!(current_supplier.id, params[:id])
      @table = Table.find(params[:table_id])
      res[:table_is_from_other_supplier] = true unless @table.supplier_id == @list.supplier_id
      res[:table_occupied] = true if @table.occupied?
      unless res[:table_is_from_other_supplier] or res[:table_occupied]
        res[:ok] = true
        @list.move_to_table! @table
      else
        res[:ok] = false
      end
      render json: res
    end

    private

    def list_params
      params.require(:list).permit(:state, :needs_help, :needs_payment, :closed_at, :join_requests, :price, :is_paid, :paid_at, :table_id, :section_id)
    end
  end
end
