<?php 
namespace PortalPeople\magento\models;
use Yii;    
use backend\models\Cartsbe;
use PortalPeople\netsuite\components\NetSuite;
use yii\helpers\Inflector;

class Carts extends Cartsbe
{
    public function afterSave($insert, $changedAttributes)
    {
        parent::afterSave($insert, $changedAttributes);
        $this->CreateDeliveryLines();
        if($this->status == 'Paid' && 1 == 2){
            Yii::$app->trigger('cart-order-after', ($event = new \common\events\UserDataEvent(['customData' => $changedAttributes, 'model' => $this])));
        }
    }



    public function CreateDeliveryLines(){
        if($this->status == 'Paid' && is_object($this->shipment) == true){
            $shippingcosts = \backend\models\Shippingcosts::costs($this->id);
            $shippingline = $this->shippingline;
            foreach($shippingcosts as $haulier => $data){
                \Yii::Warning($data, 'CreateDeliveryLines Shipment');
                $cartline = \backend\models\Cartlines::find()
                    ->where([
                        'basketid' => $this->id, 
                        'haulierint' => $haulier, 
                        'productid' => '331D4D9B-7F11-9473-1279-CAFDA629360A'
                    ])
                    ->one();
                if (!$cartline){
                    $cartline = new \backend\models\Cartlines(['id' => \backend\models\Cartlines::Tempid(), 'basketid' => $this->id]);
                    $cartline->productid = '331D4D9B-7F11-9473-1279-CAFDA629360A';
                    $cartline->requested_date = $shippingline?->requested_date;
                    $cartline->qty = 1;
                    $cartline->erpqty = 1;
                    $cartline->price = 0;
                    $cartline->linetotal = 0.00;
                    $cartline->deliveryline = 0;
                    $cartline->paid = true;
                } 
                $cartline->haulierint = $haulier;
                $cartline->cost = $data['cost'];
                $cartline->costtotal = $data['cost'];
                $cartline->product_description = $shippingline?->product_description;
                $cartline->hidden_info = $data['haulier'].' Delivery ' . Inflector::pluralize($data['pallets'] . ' Pallet');
                $cartline->save();
            }   
        }   
    }
    
    public static function NewMagentoOrder($data){
        // Reject orders that have not been paid (e.g. invoice sent but awaiting payment)
        $paymentMethod = $data['payment']['method'] ?? null;
        if ($paymentMethod === 'stripe_payments_invoice') {
            Yii::warning('Order rejected: payment method stripe_payments_invoice is awaiting payment.', 'magento');
            return null;
        }

        $cartClass = Yii::$app->getModule('magento')->cartClass ?? self::class;
        $model = new $cartClass();
        $model->sourceurl = 'www.gardoo.co.uk';
        $model->id = $model::tempId();
        $model->status = 'Paid';
        $model->dateordered = strtotime($data['order']['updated_at']);
        //$model->currency = $data['currency'];
        $model->email = $data['customer']['email'];
        $model->contact = $data['customer']['firstname'] . ' ' . $data['customer']['lastname'];
        $fulladdresses = $model->fulladdresses ?? [];
        //$model->telephone = $data['customer']['telephone'];
        $billingAddress = New \backend\models\Address();
        $billingAddress->address1 = $data['billing_address']['street'];
        $billingAddress->town = $data['billing_address']['city'];
        $billingAddress->postcode = $data['billing_address']['postcode'];
        $billingAddress->telephone = $data['billing_address']['telephone'];
        
        $shippingAddress = New \backend\models\Address();
        $shippingAddress->address1 = $data['shipping_address']['street'];
        $shippingAddress->town = $data['shipping_address']['city'];
        $shippingAddress->postcode = $data['shipping_address']['postcode'];
        $shippingAddress->telephone = $data['shipping_address']['telephone'];
        $fulladdresses['billing'] = $billingAddress;
        $fulladdresses['shipping'] = $shippingAddress;
        $model->fulladdresses = $fulladdresses;
        foreach($data['items'] as $item){
            $product = \backend\models\Productsbe::find()->where(['stock_code' => $item['sku']])->one();
            if($product){
                $cartline = new \backend\models\Cartlines();
                $cartline->basketid = $model->id;
                $cartline->productid = $product->id;
                $cartline->product_name = $product->data->magento->name ?? $item['name'] ?? $product->product_name;
                $cartline->qty = $item['qty_ordered'];
                $cartline->price = $item['row_total_incl_tax'] / $item['qty_ordered'];
                $cartline->dispatch = 0;
                $cartline->requested_date = $data['shipping_fields']['shipping_date'] ?? null;
                if($item['discount_amount'] > 0){
                    $cartline->disc = $item['discount_amount'] / $item['qty_ordered'];
                }
                $cartline->save();
            }
        }
        $model->delivery_date = $data['shipping_fields']['shipping_date'] ?? null;
        $model->delivery_message = $data['shipping_fields']['shipping_message'] ?? null;
        //   $model->extended->OrderNo = $data['order']['id'];
        $shipment = new \backend\models\Shipment();
        $shipment->shipment_type = 0;
        $shipment->cart_id = $model->id;
        $shipment->delivery = $data['shipping_method']['description'] ?? null;
        $shipment->shipment_date = $data['shipping_fields']['shipping_date'] ?? null;
        $shipment->save();
        if(array_key_exists('method', $data['payment'])){
            $method = $data['payment']['method'];
        }
        if($method == 'paypal_express'){
            /*
            $payment = [  
                'additional_information' => [
                    'paypal_express_checkout_shipping_overridden' => 1,
                    'paypal_express_checkout_shipping_method' => '',
                    'paypal_payer_id' => 'GGJBCYW29E7QJ',
                    'paypal_payer_email' => 'a.pickstock-buyer@chalvingtongroup.com',
                    'paypal_payer_status' => 'verified',
                    'paypal_address_status' => 'Confirmed',
                    'paypal_correlation_id' => '870eccb513950',
                    'paypal_express_checkout_payer_id' => 'GGJBCYW29E7QJ',
                    'paypal_express_checkout_token' => 'EC-7CW880928Y410140E',
                    'method_title' => 'PayPal Express Checkout',
                    'paypal_express_checkout_redirect_required' => null,
                    'paypal_protection_eligibility' => 'Eligible',
                    'paypal_payment_status' => 'pending',
                    'paypal_pending_reason' => 'authorization',
                ],
            ];*/
            if(array_key_exists('payment', $data) && array_key_exists('additional_information', $data['payment']) && array_key_exists('paypal_pending_reason', $data['payment']['additional_information'])){
                $paymentStatus = $data['payment']['additional_information']['paypal_pending_reason'];
            }
            if(array_key_exists('payment', $data) && array_key_exists('additional_information', $data['payment']) && array_key_exists('paypal_correlation_id', $data['payment']['additional_information'])){
                $paymentRef = $data['payment']['additional_information']['paypal_correlation_id'];
            }
            $pay = new \backend\models\Paymentresponsesbe();
            $pay->basketid = $model->id;
            $pay->paymentmethod = 'PayPal';
            $pay->status = $paymentStatus == 'authorization' ? 'Paid' : 'Pending';
            $pay->paymentref = $paymentRef;
            $pay->source = $data['order_source'];
            $pay->amount = $data['order']['grand_total'];
            $pay->save();
        } elseif ($method == 'stripe_payments') {
            $pay = new \backend\models\Paymentresponsesbe();
            if(array_key_exists('payment', $data) && array_key_exists('additional_information', $data['payment']) && array_key_exists('is_transaction_pending', $data['payment']['additional_information'])){
                $paymentStatus = $data['payment']['additional_information']['is_transaction_pending'] == false ? 'Paid' : 'Pending';
            }
            if(array_key_exists('payment', $data) && array_key_exists('additional_information', $data['payment']) && array_key_exists('payment_intent_id', $data['payment']['additional_information'])){
                $paymentRef = $data['payment']['additional_information']['payment_intent_id'];
            }
            $pay->basketid = $model->id;
            $pay->paymentmethod = 'Stripe';
            $pay->status = $paymentStatus;
            $pay->paymentref = $paymentRef;
            $pay->source = $data['order_source'];
            $pay->amount = $data['order']['grand_total'];
            $pay->save();
        }
        if (isset($pay) && $pay->status == 'Paid') {
            $model->billingstatus = 'Paid';
        }
        $model->save();
        return $model;
    }
}