<?php

declare(strict_types=1);

use App\Jobs\SyncSupplierProjectJob;
use App\Models\Project;
use App\Models\Tenant;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Queue;
use Tests\Concerns\SharesSupplierPdo;

uses(DatabaseTransactions::class);
uses(SharesSupplierPdo::class);

beforeEach(function () {
    Queue::fake();
    DB::statement("SELECT set_config('app.current_tenant_id', '0', true)");
});

// G: ВСЕ пути синхронизации должны уважать preflight_blocked_at — заблокированный
// (за нехваткой баланса) проект НЕ должен уезжать заказом к поставщику ни через
// одиночную правку, ни через ручную «Синхронизировать», ни через возобновление.
// Зеркалит create-гард (ProjectService::create) и фильтр ночного sweep.

// --- update ---

it('does not sync blocked project to supplier on update', function () {
    $tenant = Tenant::factory()->create();
    $user = User::factory()->create(['tenant_id' => $tenant->id]);
    $project = Project::factory()->for($tenant)->create([
        'is_active' => true,
        'preflight_blocked_at' => now(),
        'regions' => [77],
    ]);

    $this->actingAs($user)->patchJson("/api/projects/{$project->id}", [
        'regions' => [78],
    ])->assertOk();

    Queue::assertNotPushed(SyncSupplierProjectJob::class);
});

it('syncs unblocked project to supplier on update', function () {
    $tenant = Tenant::factory()->create();
    $user = User::factory()->create(['tenant_id' => $tenant->id]);
    $project = Project::factory()->for($tenant)->create([
        'is_active' => true,
        'preflight_blocked_at' => null,
        'regions' => [77],
    ]);

    $this->actingAs($user)->patchJson("/api/projects/{$project->id}", [
        'regions' => [78],
    ])->assertOk();

    Queue::assertPushed(SyncSupplierProjectJob::class);
});

// --- toggle-active (возобновление) ---

it('does not sync blocked project to supplier on toggle-active resume', function () {
    $tenant = Tenant::factory()->create();
    $user = User::factory()->create(['tenant_id' => $tenant->id]);
    $project = Project::factory()->for($tenant)->create([
        'is_active' => false,
        'preflight_blocked_at' => now(),
    ]);

    $this->actingAs($user)->patchJson("/api/projects/{$project->id}/toggle-active", [
        'is_active' => true,
    ])->assertOk();

    Queue::assertNotPushed(SyncSupplierProjectJob::class);
});

it('syncs unblocked project to supplier on toggle-active resume', function () {
    $tenant = Tenant::factory()->create();
    $user = User::factory()->create(['tenant_id' => $tenant->id]);
    $project = Project::factory()->for($tenant)->create([
        'is_active' => false,
        'preflight_blocked_at' => null,
    ]);

    $this->actingAs($user)->patchJson("/api/projects/{$project->id}/toggle-active", [
        'is_active' => true,
    ])->assertOk();

    Queue::assertPushed(SyncSupplierProjectJob::class);
});

// --- ручная «Синхронизировать» (triggerSync) ---

it('does not sync blocked project to supplier on manual sync', function () {
    $tenant = Tenant::factory()->create();
    $user = User::factory()->create(['tenant_id' => $tenant->id]);
    $project = Project::factory()->for($tenant)->create([
        'is_active' => true,
        'preflight_blocked_at' => now(),
    ]);

    $this->actingAs($user)->postJson("/api/projects/{$project->id}/sync")->assertStatus(202);

    Queue::assertNotPushed(SyncSupplierProjectJob::class);
});

it('syncs unblocked project to supplier on manual sync', function () {
    $tenant = Tenant::factory()->create();
    $user = User::factory()->create(['tenant_id' => $tenant->id]);
    $project = Project::factory()->for($tenant)->create([
        'is_active' => true,
        'preflight_blocked_at' => null,
    ]);

    $this->actingAs($user)->postJson("/api/projects/{$project->id}/sync")->assertStatus(202);

    Queue::assertPushed(SyncSupplierProjectJob::class);
});
