<?php

namespace Yajny\Member\Models;

use Illuminate\Database\Eloquent\Model;
use Yajny\Member\Exceptions\CurrencyNotFoundException;

class Sale extends Model
{
    protected $table = 'sales';
    protected $primaryKey = 'id';
    protected $dateColumn = 'created_at';

    protected $guarded = ['id'];

    protected $casts = [
        'order_amount' => 'float',
        'comission' => 'float',
        'local_order_amount' => 'float',
        'local_comission' => 'float',
        'extras' => 'object',
        'currency_conversions' => 'array',
    ];

    public $amazonFileDate = null;

    public function store()
    {
        return $this->hasOne('Yajny\Models\Store', 'id', 'store_id')->withoutGlobalScopes();
    }

    public function items()
    {
        return $this->hasMany('Yajny\Member\Models\SaleItem', 'sale_id', 'id');
    }

    public function setClickIdAttribute($value)
    {
        $this->attributes['click_id'] = (strlen($value) < 1 && is_array($value)) ? null : $value;
    }

    public function setStatus($network_statuses)
    {
        $this->attributes['status'] = isset($network_statuses[$this->attributes['network_status']]) ? $network_statuses[$this->attributes['network_status']] : 'pending';
    }

    public static function updateAmounts($sale) {
        $conversionRate = 1;
        //check if network is updating existing Sale or creating a new one
        if (isset($sale->id)) {
            $conversionRate = $sale->currency_rate;
        } else {
            if (isset($sale->currency) && strtoupper($sale->currency) != 'USD') {
                $currencyConversions = self::dailyConversionsByTransactionDate($sale->transaction_Time);

                if ($currencyConversions) {
                    $conversionRate = $currencyConversions[$sale->currency];
                    $sale->currency_rate = $conversionRate;
                    $sale->currency_conversions = $currencyConversions;
                } else {
                    throw new CurrencyNotFoundException();
                }
            }
        }
        $sale->comission = round($sale->local_comission / $conversionRate, 2);
        $sale->order_amount = round($sale->local_order_amount / $conversionRate, 2);
    }

    protected static function boot()
    {
        parent::boot();

        static::saving(function (self $sale) {
            self::updateAmounts($sale);
        });

        static::saved(function (self $sale) {
            if ($sale->amazonFileDate) {
                $amazonReadLog = AmazonReadLog::where('file_date', $sale->amazonFileDate)->where('network_id', $sale->network_id)->first();
                $lastInsertedIndex = $amazonReadLog->last_inserted_index;
                $amazonReadLog->last_inserted_index = $lastInsertedIndex + 1;
                if ($amazonReadLog->last_inserted_index == $amazonReadLog->total_orders)
                    $amazonReadLog->is_processed = true;
                $amazonReadLog->save();
            }
        });
    }
    private static function dailyConversionsByTransactionDate($transactionTime) :array
    {
        $conversionsByDate = CurrencyRate::query()
            ->select('currency_code')
            ->selectRaw('MIN(conversion_rate) as conversion_rate')
            ->whereIn('currency_code', $isoCode = ['EGP', 'SAR', 'AED', 'KWD'])
            ->whereDate('start_date', date('Y-m-d', strtotime($transactionTime)))
            ->groupBy(['currency_code'])
            ->pluck('conversion_rate', 'currency_code')
            ->toArray();

        return count($conversionsByDate) > 0
            ? $conversionsByDate
            : Currencies::query()
                ->whereIn('iso_code', $isoCode)
                ->pluck('conversion_rate','iso_code')
                ->toArray();
    }
}
