<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class LokasiRakSeeder extends Seeder
{
    /**
     * Mapping kode_rak → koordinat pusat (x%, y%) pada gambar denah.
     * Diambil dari array $shelves yang sudah ada di show.blade.php.
     */
    private function getKoordinatRak(): array
    {
        return [
            'rak_000' => ['x' => 23.25, 'y' => 53],   // Rak 01-05 Umum
            'rak_100' => ['x' => 30.25, 'y' => 53],   // Rak 06-14 Filsafat
            'rak_200' => ['x' => 23.25, 'y' => 69],   // Rak 15-32 Agama
            'rak_300' => ['x' => 30.25, 'y' => 69],   // Rak 33-44 Sosial
            'rak_400' => ['x' => 43.5, 'y' => 50.25], // Rak 45 Bahasa
            'rak_500' => ['x' => 43.5, 'y' => 56.25], // Rak 46-48 Murni
            'rak_600' => ['x' => 43.5, 'y' => 62.25], // Rak 49-68 Terapan
            'rak_700' => ['x' => 43.5, 'y' => 68.75], // Rak 71-74 Seni
            'rak_800' => ['x' => 43.5, 'y' => 75.25], // Rak 77-79 Sastra
            'rak_900' => ['x' => 43.5, 'y' => 81.75], // Rak 69-84 Sejarah
            'rak_baru' => ['x' => 28.5, 'y' => 88.75], // Rak 75-76 Baru
        ];
    }

    /**
     * Prediksi kode rak berdasarkan nomor panggil (duplikasi logika controller).
     */
    private function getKodeRak(?string $nomor_panggil): string
    {
        if (empty($nomor_panggil)) {
            return 'none';
        }

        $kode_utama = (int) substr(trim($nomor_panggil), 0, 3);

        return match (true) {
            $kode_utama >= 0 && $kode_utama <= 99 => 'rak_000',
            $kode_utama >= 100 && $kode_utama <= 199 => 'rak_100',
            $kode_utama >= 200 && $kode_utama <= 299 => 'rak_200',
            $kode_utama >= 300 && $kode_utama <= 399 => 'rak_300',
            $kode_utama >= 400 && $kode_utama <= 499 => 'rak_400',
            $kode_utama >= 500 && $kode_utama <= 599 => 'rak_500',
            $kode_utama >= 600 && $kode_utama <= 699 => 'rak_600',
            $kode_utama >= 700 && $kode_utama <= 799 => 'rak_700',
            $kode_utama >= 800 && $kode_utama <= 899 => 'rak_800',
            $kode_utama >= 900 && $kode_utama <= 999 => 'rak_900',
            default => 'rak_baru',
        };
    }

    public function run(): void
    {
        $koordinat = $this->getKoordinatRak();
        $bukus = DB::table('buku')->get();

        foreach ($bukus as $buku) {
            $kodeRak = $this->getKodeRak($buku->nomor_panggil);

            if ($kodeRak !== 'none' && isset($koordinat[$kodeRak])) {
                // Tambahkan sedikit random offset agar pin tidak menumpuk
                $offsetX = (rand(-15, 15) / 10);
                $offsetY = (rand(-10, 10) / 10);

                DB::table('buku')
                    ->where('id_buku', $buku->id_buku)
                    ->update([
                        'lokasi_x' => round($koordinat[$kodeRak]['x'] + $offsetX, 2),
                        'lokasi_y' => round($koordinat[$kodeRak]['y'] + $offsetY, 2),
                    ]);
            }
        }

        $this->command->info('Koordinat lokasi rak berhasil di-seed untuk ' . $bukus->count() . ' buku.');
    }
}
