<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Carbon\Carbon;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Models\Booking;

class DeleteOrderCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'make-refunded-booking-expired {bookings_reference}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Change refunded booking status to expired';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $bookings_reference = $this->argument('bookings_reference');
        // $bookings_reference = '28546,38599,44487,71086,70133,58580,42831,96028,41188,33894,95877,86732,31894,50962,44215,92894,40968,30303,89762,74693,45271,27169';
        $bookings_reference = explode(',', $bookings_reference);

        $start   = new Carbon();
        $this->logOutput('Process started');

        foreach ($bookings_reference as $reference) {
            $booking = Booking::where('marking', $reference)->first();

            if (!$booking) {
                $this->logOutput('Booking not found: ' . $reference);
            } else {
                $payment = $booking->transactions()
                    ->payments()->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
                    ->first();

                $payment->status = ApprovalStatus::EXPIRED;
                $payment->save();

                $this->logOutput('Booking ' . $reference . ' Payment deleted: ' . $payment->id);
            }
        }

        $end = new Carbon();
        $elapsedTime = $start->diff($end)->format('%H:%I:%S');

        $this->logOutput('Process ended. ElapsedTime: ' . $elapsedTime);
    }

    public function logOutput($text)
    {
        if (is_array($text)) {
            $text = implode(', ', $text);
        }

        $this->info(Carbon::now() . ' : ' . $text);

        $filePath = storage_path('logs/delete-orders.log');
        $textToAppend = Carbon::now()->format('[Y-m-d H:i:s]') . ' ' . $text . PHP_EOL;
        file_put_contents($filePath, $textToAppend, FILE_APPEND);
    }
}
