<?php

namespace App\Http\Controllers\Network;

use App\Http\Controllers\Network\Classes\AWIN as AWINApi;
use Carbon\Carbon;
use Yajny\Member\Models\Network;
use Yajny\Member\Models\Sale;


class AWIN extends BaseNetwork
{
    /**
     * Create a new network instance.
     *
     * @param Network $network
     */
    public function __construct(Network $network)
    {
        parent::__construct($network, new AWINApi($network->api_key, $network->affiliate_id, $network->api_url));
    }

    /**
     * Mapping sales from network for saving.
     *
     * @param array|object $saleOrder the network sale order
     *
     * @return Sale Sale object saved on Database.
     * @throws Exception If issue happened on saving sales
     *
     */
    public function mapNetworkSaleToYajnySale($saleOrder): ?Sale
    {
        $sale = Sale::withoutGlobalScopes()->firstOrNew(['network_id' => $this->network->id, 'network_transaction_id' => $saleOrder->id]);

        if (!is_numeric($saleOrder->clickRefs->clickRef))
            return null;

        if (!$sale->exists) {
            $sale->click_id = $saleOrder->clickRefs->clickRef;
            $sale->order_id = $saleOrder->orderRef;
            $sale->campaign_id = $saleOrder->campaign;
            $sale->transaction_time = Carbon::parse($saleOrder->transactionDate)->toDateTimeString();
            $sale->currency = $saleOrder->commissionAmount->currency;
        }
        $sale->local_order_amount = $saleOrder->saleAmount->amount;
        $sale->local_comission = $saleOrder->commissionAmount->amount;
        $sale->network_status = $saleOrder->commissionStatus;
        $sale->setStatus($this->network->sale_statuses);
        $sale->extras = [
            'advertiserId' => $saleOrder->advertiserId,
            'publisherId' => $saleOrder->publisherId,
            'commissionSharingPublisherId' => $saleOrder->commissionSharingPublisherId,
            'commissionSharingSelectedRatePublisherId' => $saleOrder->commissionSharingSelectedRatePublisherId,
            'saleAmountCurrency' => $saleOrder->saleAmount->currency,
            'commissionAmountCurrency' => $saleOrder->commissionAmount->currency,
            'ipHash' => $saleOrder->ipHash,
            'customerCountry' => $saleOrder->customerCountry,
            'clickDate' => $saleOrder->clickDate,
            'validationDate' => $saleOrder->validationDate,
            'type' => $saleOrder->type,
            'declineReason' => $saleOrder->declineReason,
            'voucherCodeUsed' => $saleOrder->voucherCodeUsed,
            'voucherCode' => $saleOrder->voucherCode,
            'amended' => $saleOrder->amended,
            'amendReason' => $saleOrder->amendReason,
            'oldSaleAmount' => $saleOrder->oldSaleAmount,
            'oldCommissionAmount' => $saleOrder->oldCommissionAmount,
            'clickDevice' => $saleOrder->clickDevice,
            'transactionDevice' => $saleOrder->transactionDevice,
            'publisherUrl' => $saleOrder->publisherUrl,
            'advertiserCountry' => $saleOrder->advertiserCountry,
            'transactionParts' => $saleOrder->transactionParts,
            'paidToPublisher' => $saleOrder->paidToPublisher,
            'paymentId' => $saleOrder->paymentId,
            'transactionQueryId' => $saleOrder->transactionQueryId,
            'originalSaleAmount' => $saleOrder->originalSaleAmount
        ];
        return $sale;
    }

    /**
     * Mapping sale items for saving them.
     *
     * @param Sale $sale the Sale object related to items.
     * @param array|object $saleOrder the network sale order.
     */
    public function syncSaleItems(Sale $sale, $saleOrder)
    {
        if ($saleOrder->basketProducts && count($saleOrder->basketProducts)) {
            SaleItem::where('sale_id', $sale->id)->delete();
            foreach ($saleOrder->basketProducts as $item) {
                $saleItem = new SaleItem();
                $saleItem->sale_id = $sale->id;
                $saleItem->name = $item->productName;
                $saleItem->sku = @$item->skuCode;
                $saleItem->category = @$item->category;
                $saleItem->unit_price = $item->unitPrice;
                $saleItem->quantity = $item->quantity;
                $saleItem->save();
            }
        }
    }
}
