<?php

namespace App\Http\Controllers\Network;

use App\Http\Controllers\Network\Classes\ShopifyApi;
use Carbon\Carbon;
use Yajny\Member\Models\Network;
use Yajny\Member\Models\Sale;
use Yajny\Member\Models\SaleItem;

class Shopify extends BaseNetwork implements HasSaleItems
{
    public function __construct(Network $network)
    {
        parent::__construct($network, new ShopifyApi($network->id, $network->api_key, $network->api_url));
    }

    public function mapNetworkSaleToYajnySale($saleOrder): ?Sale
    {
        $sale = Sale::withoutGlobalScopes()->firstOrNew(['network_id' => $this->network->id, 'order_id' => $saleOrder->id]);
        if (!$sale->exists) {
            $sale->network_transaction_id = $saleOrder->id;
            $sale->click_id = $saleOrder->click_id;
            $sale->order_id = $saleOrder->id;
            $sale->network_sale_id = $saleOrder->order_number;
            $sale->transaction_time = Carbon::parse($saleOrder->created_at)->toDateTimeString();
            $sale->currency = $saleOrder->currency;
        }
        $sale->local_order_amount = $saleOrder->current_total_price;
        $sale->local_comission = ($saleOrder->current_total_price) ? $saleOrder->commission_amount : 0;
        $sale->network_status = $saleOrder->status;
        $sale->setStatus($this->network->sale_statuses);
        return $sale;
    }

    public function syncSaleItems(Sale $sale, $saleOrder)
    {
        $oldSaleItems = SaleItem::where('sale_id', $sale->id)->get();
        foreach ($saleOrder->line_items as $item) {
            $saleItem = $oldSaleItems->where('sku', $item->sku)->first();
            if (!$saleItem) {
                $saleItem = new SaleItem();
                $saleItem->sale_id = $sale->id;
                $saleItem->name = $item->name;
                $saleItem->unit_price = $item->price;
                $saleItem->sku = $item->sku;
                $saleItem->extras = json_encode([
                    'requires_shipping' => $item->requires_shipping,
                    'origin_location' => $item->origin_location,
                    'gift_card' => $item->gift_card,
                    'vendor' => $item->vendor,
                ]);
            }
            if ($saleItem->quantity != $item->fulfillable_quantity)
                $saleItem->quantity = $item->fulfillable_quantity;
            if ($item->fulfillable_quantity == 0)
                $saleItem->status = 'declined';
            else
                $saleItem->status = $saleOrder->status;
            $saleItem->save();
        }
    }
}
