<?php

namespace App\Helpers;

use Carbon\Carbon;
use Yajny\Controller\StoreCtrl;
use Yajny\Member\Models\CurrencyRate;
use Yajny\Models\Store;

class AppDataFormatter
{
    public static function formatBalanceForWalletPage(array $balance, $memberCurrency): array
    {
        $dataFormatted = [];
        foreach ($balance as $key => $value) {
            $dataFormatted[$key] = round($value * $memberCurrency->conversion_rate, 2);
            $dataFormatted[$key . '_formatted'] = self::currencyValueFormatted($value * $memberCurrency->conversion_rate, $memberCurrency);
        }

        return $dataFormatted;
    }

    public static function formatFavoritesForWalletPage(array $favStoreIDs): array
    {
        if ($favStoreIDs) {
            $favStores = StoreCtrl::getStoresById($favStoreIDs)->map(function ($item) {
                return array_merge(Store::mapItems($item), ['offers_count' => $item->coupons->count()]);
            });
            return array_values($favStores->reverse()->toArray());
        }

        return [];
    }

    public static function formatTransactions(array $transactions, $memberCurrency): array
    {
        $dataFormatted = [];
        foreach ($transactions as $transaction) {
            $dataFormatted[Carbon::parse($transaction->transaction_time)->format('m/Y')][] = self::formatTransaction($transaction, $memberCurrency);
        }
        return $dataFormatted;
    }

    public static function getCurrencyRate($memberCurrency, $dateTime)
    {
        $currencyRate = CurrencyRate::where([['currency_code', $memberCurrency->iso_code], ['start_date', '<', $dateTime]])->orderBy('start_date', 'desc')->first();
        if (is_null($currencyRate)) $currencyRate = CurrencyRate::where('currency_code', $memberCurrency->iso_code)->first();
        return $currencyRate->conversion_rate;
    }

    private static function formatTransaction($transaction, $memberCurrency)
    {
        $nameArr = [];
        if ($transaction->type == 'expired') {
            $nameArr['ar'] = 'مبلغ منتهي الصلاحية غير مسحوب';
            $nameArr['en'] = 'Unwidhrawn expired amount';
            return [
                'elementId' => $transaction->id,
                'elementType' => $transaction->type,
                'date' => $transaction->transaction_time,
                'amount_formatted' => $transaction->amount. ' ' . $memberCurrency->iso_code,
                'isExpired' => ($transaction->expiration_date < now()),
                'title_en' => $nameArr['en'],
                'title_ar' => $nameArr['ar'],
            ];
        } else {
            $nameArr = json_decode($transaction->name, true);
            $conversion_rate = self::getCurrencyRate($memberCurrency, $transaction->transaction_time);
            return [
                'elementId' => $transaction->id,
                'elementType' => $transaction->type,
                'date' => $transaction->transaction_time,
                'amount_formatted' => self::currencyValueFormatted($transaction->amount * $conversion_rate, $memberCurrency),
                'isExpired' => ($transaction->expiration_date < now()),
                'title_en' => $nameArr['en'],
                'title_ar' => $nameArr['ar'],
            ];
        }
    }

    public static function formatTransactionsForWalletPage(array $transactions, $memberCurrency, $show_bonus_logo = false, $show_store_logo = false): array
    {
        $dataFormatted = [];
        foreach ($transactions as $transaction) {
            switch ($transaction->type) {
                case 'bonus':
                    $dataFormatted[] = self::formatBonusTransaction($transaction, $memberCurrency, $show_bonus_logo);
                    break;
                case 'sale':
                    $dataFormatted[] = self::formatSaleTransaction($transaction, $memberCurrency, $show_store_logo);
                    break;
                case 'new_bonus':
                    $dataFormatted[] = self::formatSaleTransaction($transaction, $memberCurrency, $show_store_logo);
                    break;
                case 'payout':
                    $dataFormatted[] = self::formatSaleTransaction($transaction, $memberCurrency, $show_store_logo);
                    break;
            }
        }
        return $dataFormatted;
    }

    public static function formatPayoutsForWalletPage(array $payouts, $memberCurrency): array
    {
        $dataFormatted = [];
        foreach ($payouts as $payout) {
            $payout->applyCurrencyConversion($memberCurrency);
            $dataFormatted[] = [
                'id' => $payout->id,
                'user_id' => $payout->user_id,
                'method_code' => $payout->method_code,
                'title' => [
                    'en' => $payout->method_info->name_en,
                    'ar' => $payout->method_info->name_ar
                ],
                'account' => $payout->account,
                'amount' => $payout->local_amount,
                'amount_formatted' => $payout->local_amount_formatted,
                'currency' => $payout->local_currency,
                'status' => $payout->status,
                'paid_at' => $payout->paid_at,
                'created_at' => $payout->created_at->toDateTimeString(),
            ];
        }

        return $dataFormatted;
    }

    public static function formatClicksForWalletPage(array $clicks): array
    {
        $dataFormatted = [];
        foreach ($clicks as $click) {
            $dataFormatted[] = [
                'id' => $click->id,
                'user_id' => $click->user_id,
                'click_time' => $click->click_time,
                'store_id' => $click->store_id,
                'store_slug' => $click->store->slug,
                'title' => [
                    'en' => $click->store->name_en,
                    'ar' => $click->store->name_ar
                ]
            ];
        }
        return $dataFormatted;
    }

    private static function formatSaleTransaction($transaction, $memberCurrency, $showLogo = false)
    {
        return [
            'title' => json_decode($transaction->name, true),
            'order_amount_formatted' => self::currencyValueFormatted($transaction->order_amount * $memberCurrency->conversion_rate, $memberCurrency),
            'amount_formatted' => self::currencyValueFormatted($transaction->amount * $memberCurrency->conversion_rate, $memberCurrency),
            'transaction_time' => $transaction->transaction_time,
            'status' => $transaction->status,
            'logo' => ($showLogo) ? $transaction->logo : null
        ];
    }

    private static function formatBonusTransaction($transaction, $memberCurrency, $showLogo = false)
    {
        return [
            'title' => json_decode($transaction->name, true),
            'order_amount_formatted' => null,
            'amount_formatted' => self::currencyValueFormatted($transaction->amount * $memberCurrency->conversion_rate, $memberCurrency),
            'transaction_time' => $transaction->transaction_time,
            'status' => $transaction->status,
            'logo' => ($showLogo) ? asset('/images/medal-2x.png') : null
        ];
    }

    private static function currencyValueFormatted($value, $currency): string
    {
        $value = round($value, 2);
        $formattedValue = "{$value} {$currency->symbol}";
        if ($currency->display_as == 'prefix')
            $formattedValue = "{$currency->symbol} {$value}";
        return $formattedValue;
    }
}
