<?php

namespace Tests\Unit;

use App\Models\Carrier;
use App\Services\Shipment\ShipmentCarrierFallbackService;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Tests\TestCase;

class ShipmentCarrierFallbackServiceTest extends TestCase
{
    protected function setUp(): void
    {
        parent::setUp();

        Schema::dropIfExists('carriers');
        Schema::create('carriers', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('slug');
            $table->boolean('enabled')->default(true);
            $table->string('process_type')->default('automatic');
            $table->text('api_keys')->nullable();
            $table->json('config_schema')->nullable();
            $table->timestamps();
        });
    }

    public function test_delhivery_falls_back_to_enabled_automatic_ekart(): void
    {
        $delhivery = $this->makeCarrier('delhivery', 'Delhivery', true);
        $ekart = $this->makeCarrier('ekart', 'Ekart', true);

        $fallback = (new ShipmentCarrierFallbackService())->fallbackCarrier($delhivery);

        $this->assertNotNull($fallback);
        $this->assertSame($ekart->id, $fallback->id);
    }

    public function test_no_fallback_when_ekart_is_disabled(): void
    {
        $delhivery = $this->makeCarrier('delhivery', 'Delhivery', true);
        $this->makeCarrier('ekart', 'Ekart', false);

        $this->assertNull((new ShipmentCarrierFallbackService())->fallbackCarrier($delhivery));
    }

    public function test_xpressbees_has_no_automatic_fallback(): void
    {
        $this->makeCarrier('ekart', 'Ekart', true);
        $xpressbees = $this->makeCarrier('xpressbees', 'XpressBees', true);

        $this->assertNull((new ShipmentCarrierFallbackService())->fallbackCarrier($xpressbees));
    }

    private function makeCarrier(string $slug, string $name, bool $enabled): Carrier
    {
        $carrier = new Carrier();
        $carrier->name = $name;
        $carrier->slug = $slug;
        $carrier->enabled = $enabled;
        $carrier->process_type = Carrier::PROCESS_TYPE_AUTOMATIC;
        $carrier->api_keys = 'test-keys';
        $carrier->save();

        return $carrier;
    }
}
