# -*- encoding : utf-8 -*-

class Public::OrdersController < ApplicationController
	
	layout "ebook"
	skip_before_filter :verify_authenticity_token, :only => [:ipn]
  
  def new
    @order = Order.new(:country => "France")

  end
  
  def create
    @order = Order.new(params.require(:order).permit!)
    @order.order_products << OrderProduct.new(:name => "Observer et photographier la faune sans déranger", :description => "Exemplaire personnel", :price => 10.0, :slug => "observer-et-photographier-la-faune-sans-deranger")
    if @order.save
      respond_to do |format|
            format.html { redirect_to paid_by_paypal_public_order_path(@order.token)}
            
            format.js { }
      end
    else
      render :action => :new
    end
  end
  
  def download
    @order = Order.find_by_token(params[:id])
    
    if @order and @order.paid
      if params[:file] == "pdf"
        @order.downloads_count = @order.downloads_count.to_i+1
        @order.save
        
        
        @temp_file = "#{Rails.root}/pdf/#{@order.token}_temp.pdf"
        @final_file = "#{Rails.root}/pdf/#{@order.token}.pdf"
        spacing = 5
  
          pdf = WickedPdf.new.pdf_from_string("<html><body style='background:transparent;'><p style='text-align:right;font-family:arial;font-size:10px; color:#E2E4E6;position:absolute;bottom:18;right:0;'> Exemplaire personnel de #{@order.firstname} #{@order.name}</p></body></html>",  
            :no_background => true,
            :page_size => "A4",
            
              
            :margin => {
              :top => 0,
              :bottom => 0,
              :left =>20,
              :right => 13
        
              }
       
        
            )
      
      
          File.open(@temp_file, 'wb') do |file|
            file << pdf
          end
          
    
          require 'posix/spawn'
            

            
            child = ::POSIX::Spawn::Child.new 'pdftk', Rails.root.to_s+'/pdf/plaquette-cabane.pdf', 'background', @temp_file, 'output',  @final_file
            

            @data_to_send = File.open( @final_file).read
            File.delete(@temp_file)
            File.delete(@final_file)
           # @data_to_send = File.open( @temp_file).read
     
    
        
        
        
        
        
        
        
        
        
        
        
        send_data @data_to_send, :filename => "plaquette-cabane-#{@order.token}.pdf" , :type => 'application/pdf'
        
        
     
      end
      
    end
  end
  
  def paid
    @order = Order.find_by_token(params[:id])
    if @order.paid
      redirect_to public_order_path(@order.token)
    else
      
      respond_to do |format|
            format.html { redirect_to paid_by_paypal_public_order_path(@order.token)}
           
      end
      
      
    end
  end
  def show
    @order = Order.find_by_token(params[:id])
   
    
  end
  def paid_by_paypal
    @order = Order.find_by_token(params[:id])
    if @order.paid
      redirect_to public_order_path(@order.token)
    end
    
    products = []
    @order.order_products.each do |order_product|
      products << {:Name => order_product.name,:Quantity => 1,:Amount => {:currencyID => "EUR",:value => order_product.price } }
    end
    
    require 'paypal-sdk-merchant'
    @api = PayPal::SDK::Merchant::API.new

   
    @set_express_checkout = @api.build_set_express_checkout({
      :SetExpressCheckoutRequestDetails => {
        :custom => @order.token,
        :ReturnURL => do_paypal_payment_public_order_url(@order),
        :CancelURL => paid_public_order_url(@order.token),
        :NoShipping => 1,
        :PaymentDetails => [{
          :OrderTotal => {
            :currencyID => "EUR",
            :value =>@order.total },
          
          :NotifyURL => "http://lepicvert.org"+ipn_public_order_path(@order),
          :ShipToAddress => {
            :Name => @order.name+" "+@order.firstname.to_s,
            :Street1 => @order.street1,
            :Street2 => @order.street2,
            :CityName => @order.cityname,
            :StateOrProvince => "",
            :Country => @order.country,
            :PostalCode => @order.postal_code },
          :PaymentDetailsItem => products,
          :PaymentAction => "Sale" }] } })
    
    # Make API call & get response
    @set_express_checkout_response = @api.set_express_checkout(@set_express_checkout)

    # Access Response
    if @set_express_checkout_response.success?
      
      @get_express_checkout_details = @api.build_get_express_checkout_details({
        :Token => @order.token })

      @get_express_checkout_details_response = @api.get_express_checkout_details(@get_express_checkout_details)
      
      
      
      
      @payment_detail = @get_express_checkout_details_response.GetExpressCheckoutDetailsResponseDetails.PaymentDetails[0]
      
      
      redirect_to @api.express_checkout_url(@set_express_checkout_response.Token)
    else
      @set_express_checkout_response.Errors
    end
  end
  

  
  def do_paypal_payment
    
    
    require 'paypal-sdk-merchant'
    @api = PayPal::SDK::Merchant::API.new
    
    
    @get_express_checkout_details = @api.build_get_express_checkout_details({:Token => params[:token] })

    @get_express_checkout_details_response = @api.get_express_checkout_details(@get_express_checkout_details)




    # Access Response
    if @get_express_checkout_details_response.success?
      
      @order = Order.find_by_token(@get_express_checkout_details_response.GetExpressCheckoutDetailsResponseDetails.Custom.to_s)
      
      
      
      
    else
      
      
      @get_express_checkout_details_response.Errors
    end
    
    # Build request object
    @do_express_checkout_payment = @api.build_do_express_checkout_payment({
      :DoExpressCheckoutPaymentRequestDetails => {
        :PaymentAction => "Sale",
        :Token => params[:token],
        :PayerID => params[:PayerID],
        :PaymentDetails => [{
          :OrderTotal => {
            :currencyID => "EUR",
            :value => @order.total },
          :NotifyURL => "http://lepicvert.org"+ipn_public_order_path(@order) }] } })

    # Make API call & get response
    @do_express_checkout_payment_response = @api.do_express_checkout_payment(@do_express_checkout_payment)

    # Access Response
    if @do_express_checkout_payment_response.success?
      @payment_info = @do_express_checkout_payment_response.DoExpressCheckoutPaymentResponseDetails.PaymentInfo[0]
      
      @do_express_checkout_payment_response.DoExpressCheckoutPaymentResponseDetails
      @do_express_checkout_payment_response.FMFDetails
      
    
      
      
      
      
      
  
      if @payment_info.PaymentStatus.to_s == "Completed"
        @order.payment_type = "1"
        @order.paid = true
        @order.paid_at = Time.now
        @order.save
        
        EbookMailer.confirm(@order.email, public_order_url(:id => @order.token)).deliver
        
        
        redirect_to public_order_path(:id => @order.token, :download => true)
      else
        render :file => 'public/500.html', :status => 500, :layout => false
        
      end
      
      
    

      
      
      
    else
      render :file => 'public/500.html', :status => 500, :layout => false
    end
    
    
    
    
  end
	
  def ipn
    
    
    @api = PayPal::SDK::Merchant.new
      if @api.ipn_valid?(request.raw_post)  # return true or false
        @order = Order.find_by_token(params[:custom].to_s)
        if params[:payment_status] == "Completed"
        
          
          @order.payment_type= 1
          @order.paid = true
          @order.paid_at = Time.now
          
          @order.paypal_test_ipn= params[:test_ipn]

          @order.paypal_txn_type = params[:txn_type]
          @order.paypal_txn_id = params[:txn_id]
          @order.paypal_payment_date = params[:payment_date]

          @order.paypal_payment_status = params[:payment_status]
          @order.paypal_reason_code = params[:reason_code]
          @order.paypal_payment_type = params[:payment_type]

          @order.paypal_mc_currency = params[:mc_currency]
          @order.paypal_mc_fee = params[:mc_fee]
          @order.paypal_mc_gross = params[:mc_gross]

          @order.paypal_residence_country = params[:residence_country]
          @order.paypal_last_name = params[:last_name]
          @order.paypal_first_name = params[:first_name]
          @order.paypal_payer_email = params[:payer_email]
          @order.paypal_payer_id = params[:payer_id]
          @order.paypal_payer_status = params[:payer_status]

          @order.paypal_receiver_id = params[:receiver_id]
          @order.paypal_receiver_email = params[:receiver_email]

          @order.paypal_protection_eligibility = params[:protection_eligibility]
          @order.paypal_ipn_track_id = params[:ipn_track_id]
          
          @order.save
          puts "le paiement de la commande #{@order.id} par paypal est validé"
        
        else
          @order.paypal_test_ipn= params[:test_ipn]

          @order.paypal_txn_type = params[:txn_type]
          @order.paypal_txn_id = params[:txn_id]
          @order.paypal_payment_date = params[:payment_date]

          @order.paypal_payment_status = params[:payment_status]
          @order.paypal_reason_code = params[:reason_code]
          @order.paypal_payment_type = params[:payment_type]

          @order.paypal_mc_currency = params[:mc_currency]
          @order.paypal_mc_fee = params[:mc_fee]
          @order.paypal_mc_gross = params[:mc_gross]

          @order.paypal_residence_country = params[:residence_country]
          @order.paypal_last_name = params[:last_name]
          @order.paypal_first_name = params[:first_name]
          @order.paypal_payer_email = params[:payer_email]
          @order.paypal_payer_id = params[:payer_id]
          @order.paypal_payer_status = params[:payer_status]

          @order.paypal_receiver_id = params[:receiver_id]
          @order.paypal_receiver_email = params[:receiver_email]

          @order.paypal_protection_eligibility = params[:protection_eligibility]
          @order.paypal_ipn_track_id = params[:ipn_track_id]
          @order.paid_at = nil
          @order.paid = false
          @order.save
         
        end
        
      else
        
      end
    render :inline => "test"
  end
  
  
  
  
end