using Apollinare.Domain.Entities;
using Apollinare.Domain.Enums;

namespace Apollinare.Infrastructure.Data;

public static class DbSeeder
{
    public static void Seed(AppollinareDbContext context)
    {
        if (context.TipiPasto.Any()) return;

        // Tipi Pasto
        var tipiPasto = new List<TipoPasto>
        {
            new() { Id = 1, Codice = "PRANZO", Descrizione = "Pranzo" },
            new() { Id = 2, Codice = "CENA", Descrizione = "Cena" },
            new() { Id = 3, Codice = "APERITIVO", Descrizione = "Aperitivo" },
            new() { Id = 4, Codice = "BRUNCH", Descrizione = "Brunch" }
        };
        context.TipiPasto.AddRange(tipiPasto);

        // Tipi Evento
        var tipiEvento = new List<TipoEvento>
        {
            new() { Id = 1, Codice = "MATRIMONIO", Descrizione = "Matrimonio", TipoPastoId = 2 },
            new() { Id = 2, Codice = "BATTESIMO", Descrizione = "Battesimo", TipoPastoId = 1 },
            new() { Id = 3, Codice = "COMUNIONE", Descrizione = "Prima Comunione", TipoPastoId = 1 },
            new() { Id = 4, Codice = "CRESIMA", Descrizione = "Cresima", TipoPastoId = 1 },
            new() { Id = 5, Codice = "COMPLEANNO", Descrizione = "Compleanno", TipoPastoId = 2 },
            new() { Id = 6, Codice = "LAUREA", Descrizione = "Laurea", TipoPastoId = 3 },
            new() { Id = 7, Codice = "AZIENDALE", Descrizione = "Evento Aziendale", TipoPastoId = 1 },
            new() { Id = 8, Codice = "PRIVATO", Descrizione = "Evento Privato", TipoPastoId = 2 }
        };
        context.TipiEvento.AddRange(tipiEvento);

        // Tipi Ospite
        var tipiOspite = new List<TipoOspite>
        {
            new() { Id = 1, Codice = "ADULTO", Descrizione = "Adulto" },
            new() { Id = 2, Codice = "BAMBINO", Descrizione = "Bambino" },
            new() { Id = 3, Codice = "NEONATO", Descrizione = "Neonato" }
        };
        context.TipiOspite.AddRange(tipiOspite);

        // Tipi Risorsa
        var tipiRisorsa = new List<TipoRisorsa>
        {
            new() { Id = 1, Codice = "CAMERIERE", Descrizione = "Cameriere" },
            new() { Id = 2, Codice = "CUOCO", Descrizione = "Cuoco" },
            new() { Id = 3, Codice = "AIUTO_CUOCO", Descrizione = "Aiuto Cuoco" },
            new() { Id = 4, Codice = "BARMAN", Descrizione = "Barman" },
            new() { Id = 5, Codice = "AUTISTA", Descrizione = "Autista" },
            new() { Id = 6, Codice = "ALLESTIMENTO", Descrizione = "Addetto Allestimento" }
        };
        context.TipiRisorsa.AddRange(tipiRisorsa);

        // Tipi Materiale
        var tipiMateriale = new List<TipoMateriale>
        {
            new() { Id = 1, Codice = "PIATTI", Descrizione = "Piatti" },
            new() { Id = 2, Codice = "BICCHIERI", Descrizione = "Bicchieri" },
            new() { Id = 3, Codice = "POSATE", Descrizione = "Posate" },
            new() { Id = 4, Codice = "TOVAGLIATO", Descrizione = "Tovagliato" },
            new() { Id = 5, Codice = "ATTREZZATURA", Descrizione = "Attrezzatura Cucina" },
            new() { Id = 6, Codice = "DECORAZIONI", Descrizione = "Decorazioni" }
        };
        context.TipiMateriale.AddRange(tipiMateriale);

        // Codici Categoria
        var categorie = new List<CodiceCategoria>
        {
            new() { Id = 1, Codice = "A", Descrizione = "Per Adulti", CoeffA = 1.0m, CoeffB = 0.5m, CoeffS = 1.0m },
            new() { Id = 2, Codice = "B", Descrizione = "Per Buffet", CoeffA = 0.8m, CoeffB = 1.0m, CoeffS = 0.8m },
            new() { Id = 3, Codice = "S", Descrizione = "Per Seduti", CoeffA = 1.0m, CoeffB = 0.6m, CoeffS = 1.0m },
            new() { Id = 4, Codice = "U", Descrizione = "Universale", CoeffA = 1.0m, CoeffB = 1.0m, CoeffS = 1.0m }
        };
        context.CodiciCategoria.AddRange(categorie);

        // Clienti
        var clienti = new List<Cliente>
        {
            new() { Id = 1, RagioneSociale = "Rossi Mario", Indirizzo = "Via Roma 1", Citta = "Bologna", Provincia = "BO", Telefono = "051123456", Email = "mario.rossi@email.com" },
            new() { Id = 2, RagioneSociale = "Bianchi Laura", Indirizzo = "Via Mazzini 25", Citta = "Modena", Provincia = "MO", Telefono = "059987654", Email = "laura.bianchi@email.com" },
            new() { Id = 3, RagioneSociale = "Verdi SpA", Indirizzo = "Via Industria 100", Citta = "Reggio Emilia", Provincia = "RE", Telefono = "0522555666", Email = "info@verdispa.com", PartitaIva = "01234567890" },
            new() { Id = 4, RagioneSociale = "Ferrari Giuseppe", Indirizzo = "Via Emilia 50", Citta = "Parma", Provincia = "PR", Telefono = "0521444333", Email = "g.ferrari@email.com" },
            new() { Id = 5, RagioneSociale = "Neri & C. Srl", Indirizzo = "Via Garibaldi 15", Citta = "Ferrara", Provincia = "FE", Telefono = "0532111222", Email = "contatti@nerisrl.it", PartitaIva = "09876543210" }
        };
        context.Clienti.AddRange(clienti);

        // Location
        var locations = new List<Location>
        {
            new() { Id = 1, Nome = "Villa dei Cedri", Indirizzo = "Via dei Colli 100", Citta = "Bologna", Provincia = "BO", DistanzaKm = 15, Referente = "Marco Villa" },
            new() { Id = 2, Nome = "Palazzo Ducale", Indirizzo = "Piazza Grande 1", Citta = "Modena", Provincia = "MO", DistanzaKm = 40, Referente = "Anna Conti" },
            new() { Id = 3, Nome = "Agriturismo Il Poggio", Indirizzo = "Via Campagna 50", Citta = "Reggio Emilia", Provincia = "RE", DistanzaKm = 55, Referente = "Luigi Poggi" },
            new() { Id = 4, Nome = "Hotel Centrale", Indirizzo = "Via Stazione 10", Citta = "Parma", Provincia = "PR", DistanzaKm = 95, Referente = "Sara Hotel" },
            new() { Id = 5, Nome = "Ristorante Da Mario", Indirizzo = "Via Gastronomia 5", Citta = "Bologna", Provincia = "BO", DistanzaKm = 5, Referente = "Mario Chef" }
        };
        context.Location.AddRange(locations);

        // Risorse
        var risorse = new List<Risorsa>
        {
            new() { Id = 1, Nome = "Paolo", Cognome = "Camerini", TipoRisorsaId = 1, Telefono = "3331112222" },
            new() { Id = 2, Nome = "Marco", Cognome = "Servizi", TipoRisorsaId = 1, Telefono = "3332223333" },
            new() { Id = 3, Nome = "Giovanni", Cognome = "Cucina", TipoRisorsaId = 2, Telefono = "3333334444" },
            new() { Id = 4, Nome = "Luca", Cognome = "Aiuto", TipoRisorsaId = 3, Telefono = "3334445555" },
            new() { Id = 5, Nome = "Andrea", Cognome = "Barman", TipoRisorsaId = 4, Telefono = "3335556666" },
            new() { Id = 6, Nome = "Franco", Cognome = "Autista", TipoRisorsaId = 5, Telefono = "3336667777" },
            new() { Id = 7, Nome = "Roberto", Cognome = "Allestimenti", TipoRisorsaId = 6, Telefono = "3337778888" }
        };
        context.Risorse.AddRange(risorse);

        // Articoli
        var articoli = new List<Articolo>
        {
            new() { Id = 1, Codice = "P001", Descrizione = "Piatto piano porcellana", TipoMaterialeId = 1, CategoriaId = 4, QtaDisponibile = 500, QtaStdA = 1, QtaStdB = 1, QtaStdS = 1, UnitaMisura = "PZ" },
            new() { Id = 2, Codice = "P002", Descrizione = "Piatto fondo porcellana", TipoMaterialeId = 1, CategoriaId = 3, QtaDisponibile = 500, QtaStdA = 1, QtaStdB = 0, QtaStdS = 1, UnitaMisura = "PZ" },
            new() { Id = 3, Codice = "P003", Descrizione = "Piatto dessert", TipoMaterialeId = 1, CategoriaId = 4, QtaDisponibile = 400, QtaStdA = 1, QtaStdB = 1, QtaStdS = 1, UnitaMisura = "PZ" },
            new() { Id = 4, Codice = "B001", Descrizione = "Bicchiere acqua cristallo", TipoMaterialeId = 2, CategoriaId = 4, QtaDisponibile = 600, QtaStdA = 1, QtaStdB = 1, QtaStdS = 1, UnitaMisura = "PZ" },
            new() { Id = 5, Codice = "B002", Descrizione = "Bicchiere vino rosso", TipoMaterialeId = 2, CategoriaId = 3, QtaDisponibile = 400, QtaStdA = 1, QtaStdB = 0, QtaStdS = 1, UnitaMisura = "PZ" },
            new() { Id = 6, Codice = "B003", Descrizione = "Bicchiere vino bianco", TipoMaterialeId = 2, CategoriaId = 3, QtaDisponibile = 400, QtaStdA = 1, QtaStdB = 0, QtaStdS = 1, UnitaMisura = "PZ" },
            new() { Id = 7, Codice = "B004", Descrizione = "Flute champagne", TipoMaterialeId = 2, CategoriaId = 2, QtaDisponibile = 300, QtaStdA = 1, QtaStdB = 1, QtaStdS = 1, UnitaMisura = "PZ" },
            new() { Id = 8, Codice = "PO01", Descrizione = "Forchetta tavola", TipoMaterialeId = 3, CategoriaId = 4, QtaDisponibile = 600, QtaStdA = 2, QtaStdB = 1, QtaStdS = 2, UnitaMisura = "PZ" },
            new() { Id = 9, Codice = "PO02", Descrizione = "Coltello tavola", TipoMaterialeId = 3, CategoriaId = 4, QtaDisponibile = 600, QtaStdA = 2, QtaStdB = 1, QtaStdS = 2, UnitaMisura = "PZ" },
            new() { Id = 10, Codice = "PO03", Descrizione = "Cucchiaio tavola", TipoMaterialeId = 3, CategoriaId = 3, QtaDisponibile = 500, QtaStdA = 1, QtaStdB = 0, QtaStdS = 1, UnitaMisura = "PZ" },
            new() { Id = 11, Codice = "T001", Descrizione = "Tovaglia bianca 180x300", TipoMaterialeId = 4, CategoriaId = 4, QtaDisponibile = 100, QtaStdA = 0.1m, QtaStdB = 0.1m, QtaStdS = 0.1m, UnitaMisura = "PZ" },
            new() { Id = 12, Codice = "T002", Descrizione = "Tovagliolo stoffa bianco", TipoMaterialeId = 4, CategoriaId = 4, QtaDisponibile = 800, QtaStdA = 1, QtaStdB = 1, QtaStdS = 1, UnitaMisura = "PZ" }
        };
        context.Articoli.AddRange(articoli);

        // Eventi
        var eventi = new List<Evento>
        {
            new()
            {
                Id = 1,
                Codice = "EV2024001",
                DataEvento = DateTime.Today.AddDays(30),
                OraInizio = new TimeSpan(19, 0, 0),
                OraFine = new TimeSpan(24, 0, 0),
                ClienteId = 1,
                LocationId = 1,
                TipoEventoId = 1,
                Stato = StatoEvento.Confermato,
                Descrizione = "Matrimonio Rossi-Verdi",
                NumeroOspiti = 150,
                NumeroOspitiAdulti = 130,
                NumeroOspitiBambini = 20,
                NumeroOspitiSeduti = 150,
                CostoTotale = 15000,
                CostoPersona = 100,
                Confermato = true
            },
            new()
            {
                Id = 2,
                Codice = "EV2024002",
                DataEvento = DateTime.Today.AddDays(15),
                OraInizio = new TimeSpan(12, 30, 0),
                OraFine = new TimeSpan(16, 0, 0),
                ClienteId = 2,
                LocationId = 2,
                TipoEventoId = 2,
                Stato = StatoEvento.Preventivo,
                Descrizione = "Battesimo Bianchi",
                NumeroOspiti = 80,
                NumeroOspitiAdulti = 70,
                NumeroOspitiBambini = 10,
                NumeroOspitiSeduti = 80,
                CostoTotale = 4800,
                CostoPersona = 60,
                DataScadenzaPreventivo = DateTime.Today.AddDays(7)
            },
            new()
            {
                Id = 3,
                Codice = "EV2024003",
                DataEvento = DateTime.Today.AddDays(45),
                OraInizio = new TimeSpan(18, 0, 0),
                OraFine = new TimeSpan(21, 0, 0),
                ClienteId = 3,
                LocationId = 4,
                TipoEventoId = 7,
                Stato = StatoEvento.Scheda,
                Descrizione = "Cena aziendale Verdi SpA",
                NumeroOspiti = 200,
                NumeroOspitiBuffet = 200,
                CostoTotale = 10000,
                CostoPersona = 50
            },
            new()
            {
                Id = 4,
                Codice = "EV2024004",
                DataEvento = DateTime.Today.AddDays(60),
                OraInizio = new TimeSpan(13, 0, 0),
                OraFine = new TimeSpan(17, 0, 0),
                ClienteId = 4,
                LocationId = 3,
                TipoEventoId = 3,
                Stato = StatoEvento.Confermato,
                Descrizione = "Prima Comunione Ferrari",
                NumeroOspiti = 60,
                NumeroOspitiAdulti = 45,
                NumeroOspitiBambini = 15,
                NumeroOspitiSeduti = 60,
                CostoTotale = 3600,
                CostoPersona = 60,
                Confermato = true
            }
        };
        context.Eventi.AddRange(eventi);

        // Configurazioni
        var configurazioni = new List<Configurazione>
        {
            new() { Id = 1, Chiave = "MAX_EVENTI_GIORNO", Valore = "3", Descrizione = "Numero massimo di eventi per giorno" },
            new() { Id = 2, Chiave = "GIORNI_SCADENZA_PREVENTIVO", Valore = "15", Descrizione = "Giorni di validità del preventivo" },
            new() { Id = 3, Chiave = "PERCENTUALE_ACCONTO", Valore = "30", Descrizione = "Percentuale acconto minimo richiesto" }
        };
        context.Configurazioni.AddRange(configurazioni);

        // Utenti
        var utenti = new List<Utente>
        {
            new() { Id = 1, Username = "admin", Nome = "Amministratore", Ruolo = "Admin" },
            new() { Id = 2, Username = "monia", Nome = "Monia", Ruolo = "Admin" },
            new() { Id = 3, Username = "cucina", Nome = "Cucina", Ruolo = "Cucina", SolaLettura = true },
            new() { Id = 4, Username = "operatore", Nome = "Operatore", Ruolo = "Operatore" }
        };
        context.Utenti.AddRange(utenti);

        context.SaveChanges();
    }
}
