<?php

namespace Database\Seeders;

use App\Models\Attivita;
use App\Models\Cucina;
use App\Models\Piatto;
use Illuminate\Database\Seeder;

/**
 * Per ogni attività: crea 2 cucine seed (codice SEED-ATT-{id}-C1/C2) se mancanti,
 * poi garantisce almeno 9 piatti attivi per ogni cucina con quell’attivita_id (anche preesistenti).
 * Se non esiste nessuna attività, crea 3 attività demo (slug seed-*).
 * Idempotente sulle cucine seed (firstOrCreate per codice); i piatti si aggiungono solo fino a 9 per cucina.
 */
class AttivitaCucinaPiattiSeeder extends Seeder
{
    public const PIATTI_PER_CUCINA = 9;

    public const CUCINE_PER_ATTIVITA = 2;

    public function run(): void
    {
        $this->ensureAttivita();
        $attivita = Attivita::query()->orderBy('id')->get();

        foreach ($attivita as $a) {
            for ($c = 1; $c <= self::CUCINE_PER_ATTIVITA; $c++) {
                $codice = 'SEED-ATT-' . $a->id . '-C' . $c;
                $cucina = Cucina::query()->firstOrCreate(
                    ['codice' => $codice],
                    [
                        'nome' => 'Cucina ' . $c . ' · ' . $a->nome,
                        'descrizione' => 'Cucina di demo collegata all’attività «' . $a->nome . '».',
                        'is_attiva' => true,
                        'attivita_id' => $a->id,
                    ]
                );

                if ((int) $cucina->attivita_id !== (int) $a->id) {
                    $cucina->attivita_id = $a->id;
                    $cucina->save();
                }
            }

            Cucina::query()
                ->where('attivita_id', $a->id)
                ->orderBy('id')
                ->each(function (Cucina $cucina) {
                    $variant = ((int) $cucina->id % 2) + 1;
                    $this->ensurePiattiPerCucina($cucina, $variant);
                });
        }
    }

    private function ensureAttivita(): void
    {
        if (Attivita::query()->exists()) {
            return;
        }

        $defaults = [
            ['nome' => 'Festival (demo)', 'slug' => 'seed-festival-demo', 'descrizione' => 'Attività creata dal seeder piatti.'],
            ['nome' => 'Sagra (demo)', 'slug' => 'seed-sagra-demo', 'descrizione' => 'Attività creata dal seeder piatti.'],
            ['nome' => 'Mercato (demo)', 'slug' => 'seed-mercato-demo', 'descrizione' => 'Attività creata dal seeder piatti.'],
        ];

        foreach ($defaults as $row) {
            Attivita::query()->firstOrCreate(
                ['slug' => $row['slug']],
                [
                    'nome' => $row['nome'],
                    'descrizione' => $row['descrizione'],
                    'is_attiva' => true,
                ]
            );
        }
    }

    private function dishCatalog(int $cucinaIndex): array
    {
        $base = [
            ['nome' => 'Antipasto misto', 'descrizione' => 'Selezione di salumi e formaggi.', 'prezzo' => 12.00],
            ['nome' => 'Bruschetta al pomodoro', 'descrizione' => 'Pane tostato, pomodoro, basilico, olio EVO.', 'prezzo' => 6.50],
            ['nome' => 'Insalata mista', 'descrizione' => 'Verdure di stagione, carote, pomodori.', 'prezzo' => 7.00],
            ['nome' => 'Primo del giorno', 'descrizione' => 'Chiedere al banco: pasta o risotto.', 'prezzo' => 10.00],
            ['nome' => 'Lasagne al forno', 'descrizione' => 'Pasta fresca, ragù, besciamella.', 'prezzo' => 11.50],
            ['nome' => 'Secondo grigliato', 'descrizione' => 'Carne o pesce alla griglia con contorno.', 'prezzo' => 16.00],
            ['nome' => 'Contorno di verdure', 'descrizione' => 'Verdure al vapore o saltate.', 'prezzo' => 4.50],
            ['nome' => 'Patatine fritte', 'descrizione' => 'Porzione singola, croccanti.', 'prezzo' => 4.00],
            ['nome' => 'Dolce della casa', 'descrizione' => 'Torta o semifreddo a rotazione.', 'prezzo' => 5.50],
            ['nome' => 'Frutta fresca', 'descrizione' => 'Porzione di frutta di stagione.', 'prezzo' => 3.50],
            ['nome' => 'Acqua naturale 50cl', 'descrizione' => 'Bottiglia.', 'prezzo' => 1.50],
            ['nome' => 'Bibita lattina', 'descrizione' => '33cl, vari gusti.', 'prezzo' => 2.50],
        ];

        $offset = ($cucinaIndex - 1) * 3;
        $out = [];
        $n = count($base);
        for ($i = 0; $i < self::PIATTI_PER_CUCINA; $i++) {
            $out[] = $base[($i + $offset) % $n];
        }

        return $out;
    }

    private function ensurePiattiPerCucina(Cucina $cucina, int $cucinaIndex): void
    {
        $have = Piatto::query()->where('cucina_id', $cucina->id)->count();
        if ($have >= self::PIATTI_PER_CUCINA) {
            return;
        }

        $catalog = $this->dishCatalog($cucinaIndex);
        $need = self::PIATTI_PER_CUCINA - $have;

        for ($i = 0; $i < $need; $i++) {
            $idx = $have + $i;
            $tpl = $catalog[$idx % count($catalog)];
            $suffix = ' #' . ($idx + 1);

            Piatto::query()->create([
                'nome' => $tpl['nome'] . $suffix,
                'descrizione' => $tpl['descrizione'],
                'prezzo' => $tpl['prezzo'] + ($idx * 0.05),
                'cucina_id' => $cucina->id,
                'menu_id' => null,
                'immagine' => null,
                'is_attivo' => true,
                'allergeni' => false,
                'bacheca_id' => false,
                'in_evidenza' => $idx < 2,
            ]);
        }
    }
}
