using FoodShop.Data;
using FoodShop.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace FoodShop.Services
{
    public class SeedUserList
    {
        public string Name { get; set; }
        public string Role { get; set; }

        public SeedUserList(string name, string role)
        {
            Name = name;
            Role = role;
        }
    }

    public class SeedData
    {
        public static void InitializeIdentity(IServiceProvider serviceProvider)
        {
            string userPWD = "pwdadmin";
            //using var context = new ApplicationDbContext(serviceProvider.GetRequiredService<DbContextOptions<ApplicationDbContext>>());
            var context = new ApplicationDbContext(serviceProvider.GetRequiredService<DbContextOptions<ApplicationDbContext>>());

            string[] roleNames = { "Admin", "PowerUser", "User", "Guest", "Member" };

            var roleStore = new RoleStore<IdentityRole>(context);

            foreach (var roleName in roleNames)
            {
                if (!context.Roles.Any(r => r.Name == roleName))
                {
                    var role = new IdentityRole
                    {
                        Name = roleName,
                        //NormalizedName = roleName
                        NormalizedName = roleName.ToUpper()
                    };
                    roleStore.CreateAsync(role).Wait();
                }
            }

            SeedUserList[] userNames = {
                new SeedUserList("admin@local.net", "Admin".ToUpper()),
                new SeedUserList("poweruser@local.net", "PowerUser".ToUpper()),
                new SeedUserList("user@local.net", "User".ToUpper()),
                new SeedUserList("guest@local.net", "Guest".ToUpper())
            };

            var userStore = new UserStore<ApplicationUser>(context);

            foreach (var seeduser in userNames)
            {
                var testuser = userStore.FindByNameAsync(seeduser.Name).Result;

                if (testuser == null)
                {
                    var user = new ApplicationUser();
                    var password = new PasswordHasher<ApplicationUser>();

                    user.UserName = seeduser.Name;
                    user.Email = user.UserName;
                    user.NormalizedUserName = user.UserName.ToUpper();
                    user.NormalizedEmail = user.UserName.ToUpper();
                    user.PasswordHash = password.HashPassword(user, userPWD);
                    user.Name = user.UserName;
                    user.Address = "";
                    user.City = "";
                    user.State = "IT";
                    user.Country = "Italia";
                    user.PostalCode = "";
                    user.FiscalCode = "";
                    user.EmailConfirmed = true;
                    user.ConsensoViewEmail = false;
                    user.ConsensoCookie = true;
                    user.HasRoles = true;
                    user.EntryDate = DateTime.Now;

                    userStore.CreateAsync(user).Wait();
                    userStore.AddToRoleAsync(user, seeduser.Role).Wait();
                }
            }

        }

        public static void SeedCountries(IServiceProvider serviceProvider)
        {
            var context = new ApplicationDbContext(serviceProvider.GetRequiredService<DbContextOptions<ApplicationDbContext>>());

            if (context.Countries.Any())
            {
                return;   // DB has been seeded
            }

            context.Countries.AddRange(
                new Country
                {
                    Name = "Italia",
                    TwoLetterIsoCode = "IT",
                    ThreeLetterIsoCode = "ITA",
                    ShippingType = "Regional",
                    LocalShipping = Convert.ToBoolean("true"),
                    AllowsShipping = Convert.ToBoolean("true"),
                    Published = Convert.ToBoolean("true")

                },
                new Country
                {
                    Name = "Germany",
                    TwoLetterIsoCode = "DE",
                    ThreeLetterIsoCode = "DEU",
                    ShippingType = "State",
                    LocalShipping = Convert.ToBoolean("true"),
                    AllowsShipping = Convert.ToBoolean("true"),
                    Published = Convert.ToBoolean("true")

                },
                new Country
                {
                    Name = "France",
                    TwoLetterIsoCode = "FR",
                    ThreeLetterIsoCode = "FRA",
                    ShippingType = "State",
                    LocalShipping = Convert.ToBoolean("true"),
                    AllowsShipping = Convert.ToBoolean("true"),
                    Published = Convert.ToBoolean("true")

                },
                new Country
                {
                    Name = "Spain",
                    TwoLetterIsoCode = "ES",
                    ThreeLetterIsoCode = "ESP",
                    ShippingType = "State",
                    LocalShipping = Convert.ToBoolean("true"),
                    AllowsShipping = Convert.ToBoolean("true"),
                    Published = Convert.ToBoolean("true")

                },
                new Country
                {
                    Name = "United Kingdom",
                    TwoLetterIsoCode = "GB",
                    ThreeLetterIsoCode = "GBR",
                    ShippingType = "StateFar",
                    LocalShipping = Convert.ToBoolean("true"),
                    AllowsShipping = Convert.ToBoolean("true"),
                    Published = Convert.ToBoolean("true")

                }
            );
            context.SaveChangesAsync().Wait();
        }

        public static void SeedBanners(IServiceProvider serviceProvider)
        {
            using var context = new ApplicationDbContext(serviceProvider.GetRequiredService<DbContextOptions<ApplicationDbContext>>());

            if (context.Banners.Any())
            {
                return;   // DB has been seeded
            }

            context.Banners.AddRange(
                new Banner
                {
                    IdBanner = "homepagehead",
                    IdFile = "banner1",
                    BannerExtension = "svg",
                    NumImg = 2,
                    Carusel_Inteval = Convert.ToInt32("5000"),
                    URL = "http://www.yousitename.org"
                },

                new Banner
                {
                    IdBanner = "homepagehead",
                    IdFile = "banner2",
                    BannerExtension = "svg",
                    NumImg = 1,
                    Carusel_Inteval = Convert.ToInt32("0"),
                    URL = "#"
                },

                new Banner
                {
                    IdBanner = "homepagehead",
                    IdFile = "banner3",
                    BannerExtension = "svg",
                    NumImg = 1,
                    Carusel_Inteval = Convert.ToInt32("0"),
                    URL = "#"
                }
            );
            context.SaveChangesAsync().Wait();
        }

        public static void SeedNotizias(IServiceProvider serviceProvider)
        {
            using var context = new ApplicationDbContext(serviceProvider.GetRequiredService<DbContextOptions<ApplicationDbContext>>());

            if (context.Notizias.Any())
            {
                return;   // DB has been seeded
            }

            context.Notizias.AddRange(
                new Notizia
                {
                    Title = "Divina Commedia",
                    Subtitle = "Inferno, Canto Primo",
                    Newtext = "Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura ché la diritta via era smarrita. Ahi quanto a dir qual era è cosa dura esta selva selvaggia e aspra e forte che nel pensier rinova la paura! Tant'è amara che poco è più morte; ma per trattar del ben ch'i' vi trovai, dirò de l'altre cose ch'i' v'ho scorte. Io non so ben ridir com'i' v'intrai, tant'era pien di sonno a quel punto che la verace via abbandonai. Ma poi ch'i' fui al piè d'un colle giunto, là dove terminava quella valle che m'avea di paura il cor compunto, guardai in alto, e vidi le sue spalle vestite già de' raggi del pianeta che mena dritto altrui per ogne calle...",
                    DateCreated = DateTime.Now
                },

                new Notizia
                {
                    Title = "Divina Commedia",
                    Subtitle = "Inferno, Canto Secondo",
                    Newtext = "Lo giorno se n'andava, e l'aere bruno toglieva li animai che sono in terra da le fatiche loro; e io sol uno sì del cammino e sì de la pietate, che ritrarrà la mente che non erra. O muse, o alto ingegno, or 'aiutate; o mente che scrivesti ciò ch'io vidi, qui si parrà la tua nobilitate. Io cominciai: «Poeta che mi guidi, guarda la mia virtù s'ell' è possente, prima ch'a l'alto passo tu mi fidi. Tu dici che di Silvïo il parente, corruttibile ancora, ad immortale secolo andò, e fu sensibilmente. Però, se l'avversario d'ogne male cortese i fu, pensando l'alto effetto ch'uscir dovea di lui, e 'l chi e 'l quale non pare indegno ad omo 'intelletto; ch'e' fu de l'alma Roma e di suo impero ne l'empireo ciel per padre eletto: la quale e 'l quale, a voler dir lo vero, fu stabilita per lo loco santo u' siede il successor del maggior Piero...",
                    DateCreated = DateTime.Now
                },

                new Notizia
                {
                    Title = "Divina Commedia",
                    Subtitle = "Inferno, Canto Terzo",
                    Newtext = "'Per me si va ne la città dolente, per me si va ne l'etterno dolore, per me si va tra la perduta gente. Giustizia mosse il mio alto fattore; fecemi la divina podestate, la somma sapïenza e 'l primo amore. Dinanzi a me non fuor cose create se non etterne, e io etterno duro. Lasciate ogne speranza, voi ch'intrate'. Queste parole di colore oscuro vid' ïo scritte al sommo d'una porta; per ch'io: «Maestro, il senso lor m'è duro». Ed elli a me, come persona accorta: «Qui si convien lasciare ogne sospetto; ogne viltà convien che qui sia morta. Noi siam venuti al loco ov' i' t'ho detto che tu vedrai le genti dolorose c'hanno perduto il ben del'intelletto». E poi che la sua mano a la mia puose con lieto volto, ond' io mi confortai, mi mise dentro a le segrete cose. Quivi sospiri, pianti e alti guai risonavan per l'aere sanza stelle, per ch'io al cominciar ne lagrimai...",
                    DateCreated = DateTime.Now
                },

                new Notizia
                {
                    Title = "Divina Commedia",
                    Subtitle = "Inferno, Canto Quarto",
                    Newtext = "Ruppemi l'alto sonno ne la testa un greve truono, sì ch'io mi riscossi come persona ch'è per forza desta; e l'occhio riposato intorno mossi, dritto levato, e fiso riguardai per conoscer lo loco dov' io fossi. Vero è che 'n su la proda mi trovai de la valle d'abisso dolorosa che 'ntrono accoglie d'infiniti guai. Oscura e profonda era e nebulosa tanto che, per ficcar lo viso a fondo, io non vi discernea alcuna cosa. «Or discendiam qua giù nel cieco mondo», cominciò il poeta tutto smorto. «Io sarò primo, e tu sarai secondo». E io, che del color mi fui accorto, dissi: «Come verrò, se tu paventi che suoli al mio dubbiare esser conforto?». Ed elli a me: «L'angoscia de le genti che son qua giù, nel viso mi dipigne quella pietà che tu per tema senti. Andiam, ché la via lunga ne sospigne». Così si mise e così mi fé intrare nel primo cerchio che l'abisso cigne...",
                    DateCreated = DateTime.Now
                }
            );
            context.SaveChangesAsync().Wait();
        }


    }
}
