class Customer < ApplicationRecord

  #self.primary_key = :customer_id

  before_create :generate_custom_id
  has_many :orders
  has_many :sales

  validates_presence_of :name, :contact_no, :email,:card_no
  validates :contact_no, uniqueness: true, numericality: true
  validates :email, uniqueness: true,format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }
  validates :card_no, uniqueness: true
  # validates :paypar_account_no, uniqueness: true

  paginates_per 50

  def self.get_member_account(customer)
    membership      = MembershipSetting.find_by_membership_type("paypar_url")
    memberaction    = MembershipAction.find_by_membership_type("get_all_member_account")
    merchant_uid    = memberaction.merchant_account_id.to_s
    auth_token      = memberaction.auth_token.to_s
    url             = membership.gateway_url.to_s + memberaction.gateway_url.to_s
# urltest =self.url_exist?(url)

    begin
      response      = HTTParty.get(url, :body => { 
                          membership_id: customer.membership_id,
                          merchant_uid:merchant_uid,
                          type: "summary",
                          auth_token:auth_token
                        }.to_json,
                            :headers => {
                              'Content-Type' => 'application/json',
                              'Accept'       => 'application/json; version=2'
                            },
                          :timeout => 10)
    rescue HTTParty::Error
      response = {status: false, message: "Server Error"}
      
    rescue Net::OpenTimeout
      response = { status: false , message: "Server Time out"}

    rescue OpenURI::HTTPError
      response = { status: false, message: "Can't connect server"}

    rescue SocketError
      response = { status: false, message: "Can't connect server"}
    end
    Rails.logger.debug "--------Get Member Account response -------"
    Rails.logger.debug response.to_json
    return response;

  end

  def self.get_membership_transactions(customer,receipt_no = nil)
    membership      = MembershipSetting.find_by_membership_type("paypar_url")
    memberaction    = MembershipAction.find_by_membership_type("get_member_transactions")
    merchant_uid    = memberaction.merchant_account_id.to_s
    auth_token      = memberaction.auth_token.to_s
    url             = membership.gateway_url.to_s + memberaction.gateway_url.to_s
# urltest =self.url_exist?(url)

    begin
    response        = HTTParty.get(url,
                                    :body => { membership_id: customer.membership_id,
                                            receipt_no:receipt_no,
                                            merchant_uid:merchant_uid,auth_token:auth_token
                                            }.to_json,
                                    :headers => {
                                            'Content-Type' => 'application/json',
                                            'Accept'       => 'application/json; version=2'
                                    },
                                    :timeout => 10
                               )
    rescue HTTParty::Error
      response = {status: false, message: "Can't open membership server " }

    rescue Net::OpenTimeout
      response = { status: false , message: "Server Time out"}

    rescue OpenURI::HTTPError
      response = { status: false, message: "Can't connect server"}

    rescue SocketError
      response = { status: false, message: "Can't connect server"}
    end

    return response;

  end

  def self.update_membership
    membership      = MembershipSetting.find_by_membership_type("paypar_url")
    memberaction    = MembershipAction.find_by_membership_type("create_membership_customer")
    merchant_uid    = memberaction.merchant_account_id.to_s
    auth_token      = memberaction.auth_token.to_s
    url             = membership.gateway_url.to_s + memberaction.gateway_url.to_s

    @customers    = Customer.where("membership_type IS NOT NULL AND membership_id IS NULL")   

    @customers.each do |customer|
      member_params = { name: customer.name,phone: customer.contact_no,
                  email: customer.email,dob: customer.date_of_birth,
                  address: customer.address,nrc:customer.nrc_no,
                  card_no:customer.card_no,member_group_id: customer.membership_type,
                  merchant_uid:merchant_uid,auth_token:auth_token}.to_json

      # Check for paypar account exists
      # if paypar_account_no != nil || paypar_account_no != ''
      if customer.paypar_account_no.present?
        member_params = { name: customer.name,phone: customer.contact_no,
                        email: customer.email,dob: customer.date_of_birth,
                        address: customer.address,nrc:customer.nrc_no,
                        paypar_account_no: customer.paypar_account_no,
                        card_no:customer.card_no,member_group_id: customer.membership_type,
                        merchant_uid:merchant_uid,auth_token:auth_token}.to_json
      end 

      begin
      response     = HTTParty.post(url,
                     :body => member_params,
                     :headers => {
                              'Content-Type' => 'application/json',
                              'Accept'       => 'application/json; version=2'
                      })
      rescue Net::OpenTimeout
      response = { status: false, message: "Server Time out" }
      
      rescue OpenURI::HTTPError
        response = { status: false, message: "Can't connect server"}

      rescue SocketError
        response = { status: false, message: "Can't connect server"}
      end
      Rails.logger.debug "--------Update Membership response -------"
      Rails.logger.debug response.to_json
      if response["status"] == true
        status   = customer.update_attributes(membership_id: response["customer_datas"]["id"])
      end
    end
  end

  def self.update_rebate
    sales    = Sale.where("rebate_status = 'false'")
    sales.each do |sale|
      if sale.customer.membership_id
          response = self.rebat(Sale.find(sale.sale_id))
           #record an payment in sale-audit
            remark = "UPdate Rebate Response - #{response} for Customer #{sale.customer_id} Sale Id [#{sale.sale_id}]| pay amount -> #{sale.received_amount} "
            sale_audit = SaleAudit.record_paymal(sale.sale_id, remark, 1)   

           if response["status"] == true
             status   = sale.update_attributes(rebate_status: "true")
           end
      end
    end
  end

  def self.rebat(sObj)
    rebate_prices = SaleItem.calculate_rebate_by_account(sObj.sale_items)

    generic_customer_id = sObj.customer.membership_id
    if generic_customer_id.present?
      paypar = sObj.sale_payments
      payparcost = 0
      credit = 0
      paypar.each do |pp|
        if pp.payment_method == "paypar"
          payparcost = payparcost + pp.payment_amount
        elsif pp.payment_method == "creditnote"
          credit = 1
        end
      end
  
      # overall_dis = SaleItem.get_overall_discount(sObj.id)
      overall_dis = sObj.total_discount

      total_amount = rebate_prices - payparcost - overall_dis

      if credit == 1
        total_amount = 0
      end
      if total_amount >= 0
        receipt_no = sObj.receipt_no
        membership      = MembershipSetting.find_by_membership_type("paypar_url")
        memberaction    = MembershipAction.find_by_membership_type("rebate")
        merchant_uid    = memberaction.merchant_account_id.to_s
        campaign_type_id = memberaction.additional_parameter["campaign_type_id"]
        auth_token       = memberaction.auth_token.to_s
        url             = membership.gateway_url.to_s + memberaction.gateway_url.to_s

        # Control for Paypar Cloud
        begin
          response        = HTTParty.post(url, :body => { generic_customer_id:generic_customer_id ,
                             total_sale_transaction_amount: sObj.grand_total,
                             merchant_uid:merchant_uid,
                             total_amount: total_amount,
                             campaign_type_id: campaign_type_id,
                              receipt_no: receipt_no,
                              auth_token:auth_token}.to_json,
                         :headers => {
                                  'Content-Type' => 'application/json',
                                   'Accept'       => 'application/json; version=2'
                          }, :timeout => 10)
        rescue Net::OpenTimeout
           response = { "status": false , "message": "Connect To" }
        

        rescue OpenURI::HTTPError
           response = { "status": false, "message": "Can't connect server"}
          
        rescue SocketError
           response = { "status": false, "message": "Can't connect server"}
          
        end
        return response    
        Rails.logger.debug "--------Update Rebate response -------"
        Rails.logger.debug response.to_json  
        end
    end
  end

  def self.search_paypar_account_no(account_no)
    membership      = MembershipSetting.find_by_membership_type("paypar_url")
    memberaction    = MembershipAction.find_by_membership_type("search_paypar_account_no")
    merchant_uid    = memberaction.merchant_account_id.to_s
    auth_token      = memberaction.auth_token.to_s
    url             = membership.gateway_url.to_s + memberaction.gateway_url.to_s
    begin
       response = HTTParty.get(url, 
                            :body => { paypar_account_no:account_no, 
                                      merchant_uid:merchant_uid,
                                      auth_token:auth_token
                                      }.to_json,
       :headers => {
        'Content-Type' => 'application/json',
        'Accept'       => 'application/json; version=2'
        },
        :timeout => 10
        )
    rescue HTTParty::Error
      response = {status: false, message: "Server Error"}

    rescue Net::OpenTimeout
      response = { status: false , message: "Server Time out"}

    rescue OpenURI::HTTPError
      response = { status: false, message: "Can't connect server"}

    rescue SocketError
      response = { status: false, message: "Can't connect server"}
    end
    Rails.logger.debug "--------Search Paypar Account No response -------"
    Rails.logger.debug response.to_json
    return response
  end

  def self.search(search)
    if search
      # find(:all, :conditions => ['name LIKE ? OR contact_no LIKE ?', "%#{search}%", "%#{search}%"])
      where("name LIKE ? OR contact_no LIKE ? OR card_no LIKE ? OR paypar_account_no ='#{search}'", "%#{search}%", "%#{search}%", "%#{search}%",)
    else
      find(:all)
    end
  end

  def lastest_invoices
    sales.where(:customer_id => self.id).order("created_at desc").limit(5)
  end

  def self.count_customer
    all = self.all.count+1
    count = all-2

  end

   WALKIN   = "CUS-000000000001"
   TAKEAWAY = "CUS-000000000002"

  private
  def generate_custom_id
    self.customer_id = SeedGenerator.generate_id(self.class.name, "CUS")
  end
end
