<?php

namespace App\Http\Controllers\Network;

use Carbon\Carbon;
use Yajny\Member\Models\Click;
use Yajny\Member\Models\Sale;
use Yajny\Member\Models\SaleItem;

abstract class BaseAmazon extends BaseNetwork implements HasSaleItems
{
    public function mapNetworkSaleToYajnySale($saleOrder): ?Sale
    {
        $sale = Sale::withoutGlobalScopes()->firstOrNew(['network_id' => $this->network->id, 'network_transaction_id' => $saleOrder['SubTag']]);

        $orderAmount = 0;
        $commission = 0;
        if (!$sale->exists) {
            $click = Click::where('id', $saleOrder['SubTag'])->first();
            if ($click) {
                $sale->transaction_time = $click->click_time;
            } else {
                $sale->transaction_time = Carbon::parse($saleOrder['Date'])->toDateTimeString();
            }

            $sale->click_id = $saleOrder['SubTag'];
            $sale->order_id = $saleOrder['SubTag'];
            $sale->campaign_id = null;
            $sale->currency = $saleOrder['currencyCode'];
        } else {
            $orderAmount = $sale->local_order_amount;
            $commission = $sale->local_comission;
        }
        $attributes = $this->getSaleAttributesBasedOnItems($saleOrder);

        /** $attributes['orderAmount'] && $attributes['commission'] can be negative **/
        $sale->local_order_amount = $orderAmount + $attributes['orderAmount'];
        $sale->local_comission = $commission + $attributes['commission'];
        $sale->network_status = $sale->local_comission > 0 ? 'pending' : 'rejected';

        $sale->setStatus($this->network->sale_statuses);
        $sale->amazonFileDate = $saleOrder['file_date'];
        return $sale;
    }

    public function syncSaleItems(Sale $sale, $saleOrder)
    {
        foreach ($saleOrder['items'] as $item) {
            $saleItem = new SaleItem();
            $saleItem->sale_id = $sale->id;
            $saleItem->category = $item['categoryName'];
            $saleItem->report_date = date('Y-m-d', strtotime($item['Date']));

            /** We will not make abs() because we want to keep negative values for Unit Price, Commission & Quantity **/
            $saleItem->unit_price = str_replace(',', '', $item['Price']);
            $saleItem->commission = str_replace(',', '', $item['Earnings']);
            $saleItem->quantity = str_replace(',', '', $item['Qty']);

            $saleItem->status = isset($item['Type']) && $item['Type'] == 'Return' ? 'declined' : 'pending';
            $saleItem->extras = [
                'category_id' => $item['Category'],
                'revenue' => str_replace(',', '', $item['Revenue']),
                'date' => $item['Date'],
                'link_type' => $item['LinkType'],
                'rate' => $item['Rate'],
                'seller' => $item['Seller']
            ];
            $saleItem->save();
        }
    }

    private function getSaleAttributesBasedOnItems($saleOrder): array
    {
        $orderAmount = 0;
        $commission = 0;
        foreach ($saleOrder['items'] as $item) {
            $revenue = str_replace(',', '', $item['Revenue']);
            $earning = str_replace(',', '', $item['Earnings']);

            /** Accumulate Order Amount and Commission regardless negative values **/
            $orderAmount += doubleval($revenue);
            $commission += doubleval($earning);
        }
        return compact('orderAmount', 'commission');
    }
}
