<?php

namespace App\Http\Resources;

use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Models\Group;
use App\Models\Transaction;
use App\Models\Wallet;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Log;

class TransactionWithStorageResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        $order = null;
        $groupTransactions = null;
        $group_payment_attempts = null;
        $groupPaymentAttemptsFiltered = [];
        $group_payment_expired = null;
        $group_payment_history = null;
        $groupTotalAmount = 0;

        if ($this->owner instanceof Transaction) {
            if ($this->owner) {
                if ($this->owner->owner) {
                    $order = new OrderResource($this->owner->owner->owner);
                }
            }
        } else if (!($this->owner instanceof Transaction) && !($this->owner instanceof Wallet)) {
            if ($this->owner) {
                $order = new OrderResource($this->owner->owner);
            }

            if($this->groups){
                $group_payment_attempts = GroupForOrderV2Resource::collection($this->groups->whereNotIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]));
                $group_payment_expired = GroupForOrderV2Resource::collection($this->groupsWithTrashed->whereIn('status', [ApprovalStatus::EXPIRED]));
                $group_payment_history  = GroupForOrderV2Resource::collection($this->groups->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::REJECTED]));
            }

        } else {
            $group = Group::where('reference', $this->payment_reference)->first();
            if ($group) {
                $groupTransactions = GroupTransactionResource::collection($group->groupTransactions);
            }

        }


        $ts = $this->groups->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION])->last();
        if ($ts) {
            $paymentTransaction = Transaction::where('payment_reference',  $ts->reference)->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION])->first();
            if($paymentTransaction){
                $groupTotalAmount = (double) $this->amount;

                foreach ($group_payment_history as $key => $value) {
                    if ($value->id === $ts->id && $value->reference === $ts->reference) {
                        unset($group_payment_history[$key]);
                    }
                }

                foreach ($group_payment_attempts as $key => $value) {
                    if ($value->id === $ts->id && $value->reference == $ts->reference) {
                        $groupPaymentAttemptsFiltered[$key] = $value;
                    }
                }
            }
        }


        return [
            'id' => $this->id,
            'owner_type' => $this->owner_type,
            'order' => $order,
            'group_transactions' => $groupTransactions,
            'group_reference' => $groupTransactions ? ($group ? $group->reference : null ) : null,
            'groups_payment_attempts' => $groupPaymentAttemptsFiltered,
            'groups_payment_expired' => $group_payment_expired,
            'groups_payment_history' => $group_payment_history,
            'documents' => $groupTransactions ? DocumentResource::collection($this->documents->where('status', ApprovalStatus::PENDING_VERIFICATION)) : DocumentResource::collection($this->documents),
            'type' => (int) $this->type,
            'bill_no' => $this->bill_no,
            'amount' => (double) $this->amount,
            'payment_method' => (int) $this->payment_method,
            'payment_reference' => $this->payment_reference,
            'outstanding' => (double) $this->amount - ($this->transactions()->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->sum('amount')),
            'floating' => $group_payment_attempts ? $groupTotalAmount : (double) $this->transactions()->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION])->sum('amount'),
            'service_charge' => (double) $this->service_charge,
            'tax' => (double) $this->tax,
            'original_amount' => (double) $this->original_amount,
            'currency' => new CurrencyResource($this->currency),
            'original_currency' => new CurrencyResource($this->original_currency),
            'currency_rate' => (double) $this->currency_rate,
            'status' => (int) $this->status,
            'details' => TransactionDetailResource::collection($this->transactionDetails),
            'transactions' => TransactionResource::collection($this->transactions),
            'payment_attempts' => TransactionResource::collection(
                $this->transactions()
                    ->payments()->where('status', ApprovalStatus::PENDING_SUBMISSION)
                    ->get()
            ),
            'payments_expired' => TransactionResource::collection(
                $this->transactions()
                    ->payments()->where('status', ApprovalStatus::EXPIRED)
                    ->get()
            ),
            'payment_history' => TransactionResource::collection(
                $this->transactions()
                    ->payments()
                    ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::COMPLETED, ApprovalStatus::REJECTED])
                    ->get()
            ),
            'remarks' => RemarkResource::collection($this->remarks),
            'storages' => $this->storages ? $this->storages : null, //from middleware
            'is_waived' => (int) $this->is_waived,
            'expires_on' => Carbon::parse($this->expires_on)->format('d-m-Y h:i:s A'),
            'updated_at' => Carbon::parse($this->updated_at)->format('d-m-Y'),
            'created_at' => Carbon::parse($this->created_at)->format('d-m-Y')
        ];
    }
}
