<?php

namespace App\Http\Controllers\Network;

use App\Http\Controllers\Network\Classes\AliExpressApi;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
use Yajny\Member\Models\Network;
use Yajny\Member\Models\Sale;
use Yajny\Member\Models\SaleItem;


class AliExpress extends BaseNetwork implements HasSaleItems
{
    public function __construct(Network $network)
    {
        parent::__construct($network, new AliExpressApi($network->id, $network->affiliate_id, $network->api_key, $network->private_key));
    }

    public function mapNetworkSaleToYajnySale($saleOrder): ?Sale
    {
        $sale = Sale::withoutGlobalScopes()->firstOrNew(['network_id' => $this->network->id, 'order_id' => $saleOrder->order_id]);
        if (!$sale->exists) {
            $sale->click_id = intval(json_decode($saleOrder->custom_parameters)->dp);
            $sale->order_id = $saleOrder->order_id;
            $sale->transaction_time = Carbon::parse($saleOrder->created_time)->toDateTimeString();
            $sale->currency = $saleOrder->settled_currency;
        }
        $attributes = $this->getSaleAttributesBasedOnItems($saleOrder);
        $sale->local_order_amount = $attributes['orderAmount'];
        $sale->local_comission = $attributes['commission'];
        $sale->network_status = $attributes['status'];
        $sale->status = $attributes['status'];
        $sale->setStatus($this->network->sale_statuses);
        return $sale;
    }

    public function syncSaleItems(Sale $sale, $saleOrder)
    {
        if ($saleOrder->items && count($saleOrder->items)) {
            SaleItem::where('sale_id', $sale->id)->delete();
            foreach ($saleOrder->items as $item) {
                $saleItem = new SaleItem();
                $saleItem->sale_id = $sale->id;
                $saleItem->name = $item->product_title;
                $saleItem->sku = $item->sub_order_id;
                $saleItem->commission = ($item->estimated_finished_commission ?? $item->estimated_paid_commission) / 100;
                $saleItem->unit_price = ($item->finished_amount ?? $item->paid_amount) / 100;
                $saleItem->quantity = 1;
                $saleItem->extras = $this->prepareExtras($item);
                $saleItem->save();
            }
        }
    }

    private function prepareExtras($saleItem)
    {
        $itemArray = (array)$saleItem;
        unset($itemArray['items']);
        unset($itemArray['paid_amount']);
        unset($itemArray['order_id']);
        unset($itemArray['order_number']);
        unset($itemArray['product_count']);
        unset($itemArray['parent_order_number']);
        unset($itemArray['sub_order_id']);
        unset($itemArray['estimated_paid_commission']);
        return $itemArray;
    }

    private function getSaleAttributesBasedOnItems($saleOrder): array
    {
        $orderAmount = 0;
        $commission = 0;
        $rejectedAmount = 0;
        $rejectedCommission = 0;
        $status = 'declined';
        $is_pending = false;
        foreach ($saleOrder->items as $item) {
            $itemStatus = $item->status;
            if ($itemStatus == 'confirmed') {
                $status = $itemStatus;
                $orderAmount += (($item->finished_amount ?? $item->paid_amount) / 100);
                $commission += (($item->estimated_finished_commission ?? $item->estimated_paid_commission) / 100);
            } elseif ($itemStatus == 'declined') {
                $rejectedAmount += (($item->finished_amount ?? $item->paid_amount) / 100);
                $rejectedCommission += (($item->estimated_finished_commission ?? $item->estimated_paid_commission) / 100);
            } else {
                $orderAmount += (($item->finished_amount ?? $item->paid_amount) / 100);
                $commission += (($item->estimated_finished_commission ?? $item->estimated_paid_commission) / 100);
                $status = $itemStatus;
                $is_pending = true;
            }
        }
        if ($status == 'declined') {
            $orderAmount = $rejectedAmount;
            $commission = $rejectedCommission;
        }
        if ($is_pending) $status = 'pending';
        return compact('status', 'orderAmount', 'commission');
    }
}
