<?php

namespace App\Http\Controllers\Network;

use App\Http\Controllers\Network\Classes\Partnerize as PartnerizeApi;
use Yajny\Member\Models\Network;
use Yajny\Member\Models\Sale;
use Yajny\Member\Models\SaleItem;


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

    public function mapNetworkSaleToYajnySale($saleOrder): ?Sale
    {
        $conversionData = $saleOrder->conversion_data;
        $sale = Sale::withoutGlobalScopes()->firstOrNew(['network_id' => $this->network->id, 'network_transaction_id' => $conversionData->conversion_id]);

        if (!$sale->exists) {
            $sale->click_id = is_numeric($conversionData->publisher_reference) ? $conversionData->publisher_reference : null;
            $sale->order_id = $conversionData->conversion_reference;
            $sale->campaign_id = $conversionData->campaign_id;
            $sale->transaction_time = $conversionData->conversion_time;
            $sale->currency = $conversionData->currency;
            $sale->payment_method = @$conversionData->meta_data->payment_option;
            $sale->extras = [
                'country' => @$conversionData->country,
                'delivery_type' => @$conversionData->meta_data->delivery_type,
                'payment_option' => @$conversionData->meta_data->payment_option,
                'delivery_option' => @$conversionData->meta_data->delivery_option,
                'first_time_transaction' => @$conversionData->meta_data->first_time_transaction,
                'meta' => @$conversionData->meta_data
            ];
        }
        $sale->local_order_amount = $conversionData->conversion_value->value;
        $sale->local_comission = $conversionData->conversion_value->publisher_commission;
        $sale->network_status = $conversionData->conversion_value->conversion_status;
        $sale->setStatus($this->network->sale_statuses);
        return $sale;
    }

    public function syncSaleItems(Sale $sale, $saleOrder)
    {
        $items = $saleOrder->conversion_data->conversion_items;
        if ($items && count($items)) {
            SaleItem::where('sale_id', $sale->id)->delete();
            foreach ($items as $item) {
                $saleItem = new SaleItem();
                $saleItem->sale_id = $sale->id;
                $saleItem->name = @$item->meta_data->product_name;
                $saleItem->brand = @$item->meta_data->product_brand;
                $saleItem->category = @$item->category;
                $saleItem->status = $item->item_status;
                $saleItem->sku = @$item->sku;
                $saleItem->unit_price = $item->item_value;
                $saleItem->quantity = $item->quantity;
                $saleItem->commission = $item->item_publisher_commission;
                $saleItem->extras = [
                    'rejection_reason' => $item->reject_reason,
                    'coupon' => [
                        'code' => $item->voucher_codes[0]->voucher_code,
                        'status' => $item->voucher_codes[0]->voucher_status
                    ]
                ];
                $saleItem->save();
            }
        }
    }
}
