<?php // tests/Feature/Seats/SeatModelTest.php

use App\Models\Customer;
use App\Models\Instance;
use App\Models\Seat;

it('startet jeden Sitz als noch nicht in der Nextcloud', function () {
    expect(Seat::factory()->create()->nc_state)->toBe(Seat::STATE_NONE);
});

it('bildet jede Rolle auf genau eine Nextcloud-Gruppe ab', function () {
    // Keine Rolle ohne Gruppe: eine Rolle, die im Portal waehlbar ist und im
    // Gast nichts bewirkt, ist genau die Attrappe, die hier abgeschafft wird.
    foreach (Seat::ROLES as $rolle) {
        expect(Seat::GROUPS)->toHaveKey($rolle)
            ->and(Seat::GROUPS[$rolle])->not->toBe('');
    }

    // Nicht nur "irgendein Wert" — die Namen selbst, denn sie wandern spaeter
    // woertlich in `occ group:adduser`. Ein Vertipper darin faellt sonst
    // erst auf einer echten Instanz auf, nicht hier.
    expect(Seat::GROUPS['member'])->toBe('mitarbeiter')
        ->and(Seat::GROUPS['readonly'])->toBe('nur-lesen');
});

it('fuehrt owner und admin in die Admin-Gruppe', function () {
    expect(Seat::GROUPS['owner'])->toBe('admin')
        ->and(Seat::GROUPS['admin'])->toBe('admin');
});

it('erkennt die Rolle, die keinen Speicherplatz bekommt', function () {
    expect(Seat::factory()->create(['role' => 'readonly'])->isReadonly())->toBeTrue()
        ->and(Seat::factory()->create(['role' => 'member'])->isReadonly())->toBeFalse();
});

it('verknuepft den Inhaber-Sitz mit dem bestehenden Admin-Konto', function () {
    // Die Wanderung. Der owner-Sitz eines Kunden, dessen Instanz ein
    // nc_admin_ref traegt, IST dieses Konto — die Bereitstellung hat es
    // angelegt. Stuende er auf 'none', boete das Panel dem Inhaber an, sich
    // selbst einzuladen, und der Auftrag traefe auf einen Benutzer, den es
    // laengst gibt.
    $customer = Customer::factory()->create();
    Instance::factory()->for($customer)->create(['nc_admin_ref' => 'admin', 'status' => 'active']);
    $sitz = Seat::factory()->for($customer)->create(['role' => 'owner']);

    // Die Wanderung lief beim Anlegen der Testdatenbank; hier wird die
    // Nachziehmethode geprueft, die sie benutzt.
    $sitz->linkToInstanceAdmin();

    expect($sitz->fresh()->nc_username)->toBe('admin')
        ->and($sitz->fresh()->nc_state)->toBe(Seat::STATE_SYNCED);
});

it('laesst einen Inhaber-Sitz ohne Instanz unangetastet', function () {
    // Kein Auftrag hat je ein Admin-Konto angelegt — es gibt nichts zu
    // verknuepfen, und es darf nichts krachen, weil customer->instances()
    // leer ist.
    $customer = Customer::factory()->create();
    $sitz = Seat::factory()->for($customer)->create(['role' => 'owner']);

    $sitz->linkToInstanceAdmin();

    expect($sitz->fresh()->nc_username)->toBeNull()
        ->and($sitz->fresh()->nc_state)->toBe(Seat::STATE_NONE);
});

it('laesst einen Inhaber-Sitz ohne nc_admin_ref unangetastet', function () {
    // Eine Instanz ohne Admin-Konto — etwa eine, deren Bereitstellung noch
    // nicht bis dahin gekommen ist. blank() statt einer reinen Null-Pruefung,
    // weil ein leerer String hier dieselbe Aussage ist wie kein Wert.
    $customer = Customer::factory()->create();
    Instance::factory()->for($customer)->create(['nc_admin_ref' => null, 'status' => 'active']);
    $sitz = Seat::factory()->for($customer)->create(['role' => 'owner']);

    $sitz->linkToInstanceAdmin();

    expect($sitz->fresh()->nc_username)->toBeNull()
        ->and($sitz->fresh()->nc_state)->toBe(Seat::STATE_NONE);
});
