<?php

namespace App\Providers;

use App\Events\BalancePaid;
use App\Events\DepositPaid;
use App\Events\InspectionPassed;
use App\Events\OrderCreated;
use App\Events\OrderPacked;
use App\Events\ParcelCollected;
use App\Events\ParcelDelivered;
use App\Events\ParcelFailedDelivery;
use App\Events\ParcelInTransit;
use App\Events\ProofApproved;
use App\Events\ProofRevisionRequested;
use App\Events\ProofUploaded;
use App\Events\ReadyToShipIntent;
use App\Events\ShipmentCreated;
use App\Events\ShipmentCreationFailed;
use App\Listeners\CreateShipmentOnReadyToShip;
use App\Listeners\GenerateQrCodeOnOrderCreated;
use App\Listeners\MoveCardToPackingOnInspectionPassed;
use App\Listeners\NotifySlackOnOrderCreated;
use App\Listeners\NotifySlackOnOrderPacked;
use App\Listeners\NotifySlackOnParcelCollected;
use App\Listeners\NotifySlackOnParcelDelivered;
use App\Listeners\NotifySlackOnParcelFailedDelivery;
use App\Listeners\NotifySlackOnShipmentCreated;
use App\Listeners\NotifySlackOnShipmentCreationFailed;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event to listener mappings for the application.
     *
     * @var array<class-string, array<int, class-string>>
     */
    protected $listen = [
        // Order events
        OrderCreated::class => [
            NotifySlackOnOrderCreated::class,
            GenerateQrCodeOnOrderCreated::class,
        ],

        // Packing events
        OrderPacked::class => [
            NotifySlackOnOrderPacked::class,
        ],

        // Inspection events
        InspectionPassed::class => [
            MoveCardToPackingOnInspectionPassed::class,
        ],

        // Ready to Ship intent (from Trello webhook)
        ReadyToShipIntent::class => [
            CreateShipmentOnReadyToShip::class,
        ],

        // 

        // Shipment events
        ShipmentCreated::class => [
            NotifySlackOnShipmentCreated::class,
        ],
        ShipmentCreationFailed::class => [
            NotifySlackOnShipmentCreationFailed::class,
        ],

        // Courier events
        ParcelCollected::class => [
            NotifySlackOnParcelCollected::class,
        ],
        ParcelInTransit::class => [
            // TODO: Add listener
        ],
        ParcelDelivered::class => [
            NotifySlackOnParcelDelivered::class,
        ],
        ParcelFailedDelivery::class => [
            NotifySlackOnParcelFailedDelivery::class,
        ],

        // Custom order events (listeners TODO)
        DepositPaid::class => [
            // TODO: NotifySlackOnDepositPaid
        ],
        ProofUploaded::class => [
            // TODO: NotifySlackOnProofUploaded
        ],
        ProofApproved::class => [
            // TODO: NotifySlackOnProofApproved
        ],
        ProofRevisionRequested::class => [
            // TODO: NotifySlackOnProofRevisionRequested
        ],
        BalancePaid::class => [
            // TODO: NotifySlackOnBalancePaid
        ],

        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
    ];

    /**
     * Disable automatic event discovery to avoid permission issues
     */
    public function shouldDiscoverEvents(): bool
    {
        return false;
    }

    /**
     * Register any events for your application.
     */
    public function boot(): void
    {
        //
    }
}
