<?php

namespace Tests\Feature;

use App\Models\Kategori;
use App\Models\User;
use Tests\DatabaseTestCase;

class KategoriTest extends DatabaseTestCase
{
    private function actingAsApoteker(): User
    {
        $user = User::factory()->create(['role' => 'apoteker']);
        $this->actingAs($user);
        return $user;
    }

    // ─────────────────────────────────────────
    // index
    // ─────────────────────────────────────────

    public function test_index_returns_200_for_authenticated_user(): void
    {
        $this->actingAsApoteker();
        $response = $this->get(route('kategori.index'));
        $response->assertStatus(200);
    }

    public function test_index_redirects_guest_to_login(): void
    {
        $response = $this->get(route('kategori.index'));
        $response->assertRedirect(route('login'));
    }

    public function test_index_lists_all_kategoris(): void
    {
        $this->actingAsApoteker();
        Kategori::create(['nama' => 'Antibiotik']);
        Kategori::create(['nama' => 'Vitamin']);

        $response = $this->get(route('kategori.index'));
        $response->assertSee('Antibiotik');
        $response->assertSee('Vitamin');
    }

    // ─────────────────────────────────────────
    // store
    // ─────────────────────────────────────────

    public function test_store_creates_kategori_with_valid_data(): void
    {
        $this->actingAsApoteker();

        $response = $this->post(route('kategori.store'), [
            'nama'       => 'Antibiotik',
            'keterangan' => 'Obat antibiotik',
        ]);

        $response->assertRedirect(route('kategori.index'));
        $response->assertSessionHas('success');
        $this->assertDatabaseHas('kategoris', ['nama' => 'Antibiotik']);
    }

    public function test_store_fails_without_nama(): void
    {
        $this->actingAsApoteker();

        $response = $this->post(route('kategori.store'), [
            'nama' => '',
        ]);

        $response->assertSessionHasErrors('nama');
    }

    public function test_store_fails_with_duplicate_nama(): void
    {
        $this->actingAsApoteker();
        Kategori::create(['nama' => 'Antibiotik']);

        $response = $this->post(route('kategori.store'), [
            'nama' => 'Antibiotik',
        ]);

        $response->assertSessionHasErrors('nama');
    }

    // ─────────────────────────────────────────
    // update
    // ─────────────────────────────────────────

    public function test_update_modifies_kategori(): void
    {
        $this->actingAsApoteker();
        $kategori = Kategori::create(['nama' => 'Antibiotik']);

        $response = $this->put(route('kategori.update', $kategori), [
            'nama'       => 'Anti Inflamasi',
            'keterangan' => 'Updated',
        ]);

        $response->assertRedirect(route('kategori.index'));
        $this->assertDatabaseHas('kategoris', ['nama' => 'Anti Inflamasi']);
        $this->assertDatabaseMissing('kategoris', ['nama' => 'Antibiotik']);
    }

    public function test_update_allows_same_nama_for_same_kategori(): void
    {
        $this->actingAsApoteker();
        $kategori = Kategori::create(['nama' => 'Antibiotik']);

        $response = $this->put(route('kategori.update', $kategori), [
            'nama'       => 'Antibiotik',
            'keterangan' => 'Edited keterangan',
        ]);

        $response->assertRedirect(route('kategori.index'));
        $this->assertDatabaseHas('kategoris', [
            'id'         => $kategori->id,
            'nama'       => 'Antibiotik',
            'keterangan' => 'Edited keterangan',
        ]);
    }

    public function test_update_fails_with_duplicate_nama_of_other_kategori(): void
    {
        $this->actingAsApoteker();
        Kategori::create(['nama' => 'Vitamin']);
        $kategori = Kategori::create(['nama' => 'Antibiotik']);

        $response = $this->put(route('kategori.update', $kategori), [
            'nama' => 'Vitamin',
        ]);

        $response->assertSessionHasErrors('nama');
    }

    // ─────────────────────────────────────────
    // destroy
    // ─────────────────────────────────────────

    public function test_destroy_deletes_kategori(): void
    {
        $this->actingAsApoteker();
        $kategori = Kategori::create(['nama' => 'Antibiotik']);

        $response = $this->delete(route('kategori.destroy', $kategori));

        $response->assertRedirect(route('kategori.index'));
        $this->assertDatabaseMissing('kategoris', ['id' => $kategori->id]);
    }

    public function test_superadmin_can_crud_kategori(): void
    {
        $superadmin = User::factory()->create(['role' => 'superadmin']);
        $this->actingAs($superadmin);

        $this->get(route('kategori.create'))->assertStatus(200);
        $this->post(route('kategori.store'), ['nama' => 'Herbal'])->assertRedirect(route('kategori.index'));
        $kategori = Kategori::where('nama', 'Herbal')->firstOrFail();
        $this->get(route('kategori.edit', $kategori))->assertStatus(200);
        $this->put(route('kategori.update', $kategori), ['nama' => 'Herbal Update'])->assertRedirect(route('kategori.index'));
        $this->delete(route('kategori.destroy', $kategori))->assertRedirect(route('kategori.index'));
    }
}
