<?php

namespace App\Http\Controllers\Network;

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


class Linkshare extends BaseNetwork implements HasSaleItems
{
    public function __construct(Network $network)
    {
        parent::__construct($network, new LinkshareApi($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, 'network_transaction_id' => $saleOrder->etransaction_id]);
        if (!$sale->exists) {
            $sale->click_id = intval($saleOrder->u1);
            $sale->network_transaction_id = $saleOrder->etransaction_id;
            $sale->order_id = $saleOrder->order_id;
            $sale->campaign_id = null;
            $sale->transaction_time = Carbon::parse($saleOrder->transaction_date)->toDateTimeString();
            $sale->currency = $saleOrder->currency;
        }
        $attributes = $this->getSaleAttributesBasedOnItems($saleOrder);
        $sale->local_order_amount = $attributes['orderAmount'];
        $sale->local_comission = $attributes['commission'];
        if ($sale->network_status == 'Y' && $attributes['status'] == 'N')
            $sale->network_status = $attributes['status'];
        $sale->setStatus($this->network->sale_statuses);
        return $sale;
    }

    public function syncSaleItems(Sale $sale, $saleOrder)
    {
        if ($saleOrder->isNew && $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_name;
                $saleItem->sku = $item->sku_number;
                $saleItem->unit_price = $item->sale_amount;
                $saleItem->commission = $item->commissions;
                $saleItem->quantity = 1;
                $saleItem->status = $item->status;
                $saleItem->save();
            }
        }
    }

    private function getSaleAttributesBasedOnItems($saleOrder): array
    {
        if (!$saleOrder->isNew || count($saleOrder->items) == 1) {
            return [
                'status' => $saleOrder->status,
                'orderAmount' => $saleOrder->sale_amount,
                'commission' => $saleOrder->commissions
            ];
        }

        $orderAmount = 0;
        $commission = 0;
        $orderStatus = 'Y';
        foreach ($saleOrder->items as $item) {
            $itemStatus = $item->status;
            if ($itemStatus == 'N') {
                $orderStatus = $itemStatus;
                $orderAmount += doubleval($item->sale_amount);
                $commission += doubleval($item->commissions);
            }
        }
        $attributes = [];
        $attributes['status'] = $orderStatus;
        $attributes['orderAmount'] = $orderAmount;
        $attributes['commission'] = $commission;
        return $attributes;
    }
}
