Clear        


                
                    using APP.Domain;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Globalization;
using System.Text;

namespace MVC.Controllers
{
    public class DatabaseController : Controller
    {
        // Field to reference the injected DbContext instance.
        private readonly Db _db;

        // Field to reference the injected IWebHostEnvironment instance which can be development, staging or production.
        private readonly IWebHostEnvironment _environment;

        // Constructor that accepts DbContext and IWebHostEnvironment instances via dependency injection.
        public DatabaseController(Db db, IWebHostEnvironment environment)
        {
            _db = db;
            _environment = environment;
        }

        // Action method to seed the database with initial data.
        [Route("SeedDb")] // will change the route of the action to /SeedDb instead of /Database/Seed
        public IActionResult Seed()
        {
            // Can be uncommented to check if the running application's environment is not development, prevent seeding initial data to the database
            // and return error HTML content.
            //if (!_environment.IsDevelopment())
            //    return Content("<label style='color:red;'>The seed operation can only be performed in development environment!</label>",
            //                    "text/html", Encoding.UTF8);

            // Remove existing data
            var productStores = _db.ProductStores.ToList();
            _db.ProductStores.RemoveRange(productStores);

            var stores = _db.Stores.ToList();
            _db.Stores.RemoveRange(stores);

            var products = _db.Products.ToList();
            _db.Products.RemoveRange(products);

            var categories = _db.Categories.ToList();
            _db.Categories.RemoveRange(categories);

            var userRoles = _db.UserRoles.ToList();
            _db.UserRoles.RemoveRange(userRoles);

            var roles = _db.Roles.ToList();
            _db.Roles.RemoveRange(roles);

            var users = _db.Users.ToList();
            _db.Users.RemoveRange(users);

            var groups = _db.Groups.ToList();
            _db.Groups.RemoveRange(groups);

            var cities = _db.Cities.ToList();
            _db.Cities.RemoveRange(cities);

            var countries = _db.Countries.ToList();
            _db.Countries.RemoveRange(countries);

            // Reset identity columns (for SQLite), IDs will start from 1
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='ProductStores'");
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='Stores'");
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='Products'");
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='Categories'");
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='UserRoles'");
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='Roles'");
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='Users'");
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='Groups'");
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='Cities'");
            _db.Database.ExecuteSqlRaw("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='Countries'");

            // Add stores as a list
            var storeList = new List<Store>
            {
                new Store { Guid = Guid.NewGuid().ToString(), Name = "Migros", IsVirtual = false },
                new Store { Guid = Guid.NewGuid().ToString(), Name = "Trendyol", IsVirtual = true },
                new Store { Guid = Guid.NewGuid().ToString(), Name = "MediaMarkt", IsVirtual = false },
                new Store { Guid = Guid.NewGuid().ToString(), Name = "LC Waikiki", IsVirtual = false },
                new Store { Guid = Guid.NewGuid().ToString(), Name = "Ilac Sepeti", IsVirtual = false },
                new Store { Guid = Guid.NewGuid().ToString(), Name = "Hepsiburada", IsVirtual = true }
            };
            _db.Stores.AddRange(storeList);

            _db.SaveChanges();

            // Add categories and products
            _db.Categories.Add(
                new Category
                {
                    Guid = Guid.NewGuid().ToString(),
                    Title = "Electronics",
                    Description = "Latest technology products and gadgets.",
                    Products = new List<Product>
                    {
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Laptop",
                            UnitPrice = 15000m,
                            StockAmount = 25,
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "MediaMarkt").Id },
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Hepsiburada").Id }
                            }
                        },
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Smartphone",
                            UnitPrice = 8000m,
                            StockAmount = 50,
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Trendyol").Id },
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "MediaMarkt").Id },
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Hepsiburada").Id }
                            }
                        },
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Headphones",
                            UnitPrice = 1200m,
                            StockAmount = 100,
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "MediaMarkt").Id }
                            }
                        }
                    }
                });
            _db.Categories.Add(
                new Category
                {
                    Guid = Guid.NewGuid().ToString(),
                    Title = "Home Appliances",
                    Description = "Kitchen and household appliances.",
                    Products = new List<Product>
                    {
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Microwave Oven",
                            UnitPrice = 3500m
                        },
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Refrigerator",
                            UnitPrice = 12000m,
                            StockAmount = 15,
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Migros").Id }
                            }
                        },
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Washing Machine",
                            UnitPrice = 9500m,
                            StockAmount = 20,
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Migros").Id },
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Hepsiburada").Id }
                            }
                        }
                    }
                });
            _db.Categories.Add(
                new Category
                {
                    Guid = Guid.NewGuid().ToString(),
                    Title = "Clothing",
                    Description = "Men's, women's, and children's clothing.",
                    Products = new List<Product>
                    {
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "T-shirt",
                            UnitPrice = 150m,
                            StockAmount = 200,
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "LC Waikiki").Id }
                            }
                        },
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Jeans",
                            UnitPrice = 350m,
                            StockAmount = 150,
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "LC Waikiki").Id },
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Trendyol").Id }
                            }
                        },
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Winter Jacket",
                            UnitPrice = 750m,
                            StockAmount = 80,
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "LC Waikiki").Id },
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Hepsiburada").Id },
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Trendyol").Id }
                            }
                        }
                    }
                });
            _db.Categories.Add(
                new Category
                {
                    Guid = Guid.NewGuid().ToString(),
                    Title = "Medicine",
                    Description = "Pharmaceutical products and medication.",
                    Products = new List<Product>
                    {
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Pain Killer",
                            UnitPrice = 35m,
                            StockAmount = 300,
                            ExpirationDate = DateTime.Parse("09/19/2035 00:00:00", new CultureInfo("en-US")), // 00:00:00 may not be written
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Ilac Sepeti").Id }
                            }
                        },
                        new Product
                        {
                            Guid = Guid.NewGuid().ToString(),
                            Name = "Vitamin",
                            UnitPrice = 85m,
                            StockAmount = 200,
                            ExpirationDate = new DateTime(2033, 10, 29), // hours, minutes and seconds parameters may also be added
                            ProductStores = new List<ProductStore>
                            {
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Ilac Sepeti").Id },
                                new ProductStore { StoreId = _db.Stores.Single(s => s.Name == "Migros").Id }
                            }
                        }
                    }
                });

            // Add default roles
            _db.Roles.Add(new Role()
            {
                Name = "Admin"
            });
            _db.Roles.Add(new Role()
            {
                Name = "User"
            });

            _db.SaveChanges();

            // Add a default group with two users: an admin and a regular user
            _db.Groups.Add(new Group()
            {
                Title = "General",
                Users = new List<User>()
                {
                    new User()
                    {
                        Address = "Çankaya",
                        BirthDate = new DateTime(1980, 8, 21),
                        CityId = 6,
                        CountryId = 1,
                        FirstName = "Çağıl",
                        Gender = Genders.Man,
                        Guid = Guid.NewGuid().ToString(),
                        IsActive = true,
                        LastName = "Alsaç",
                        Password = "admin",
                        RegistrationDate = DateTime.UtcNow,
                        Score = 3.8M,
                        UserName = "admin",
                        UserRoles = new List<UserRole>()
                        {
                            // Assign Admin role to this user
                            new UserRole() { RoleId = _db.Roles.SingleOrDefault(r => r.Name == "Admin").Id }
                        }
                    },
                    new User()
                    {
                        BirthDate = DateTime.Parse("09/13/2004", new CultureInfo("en-US")),
                        CityId = 82,
                        CountryId = 2,
                        FirstName = "Luna",
                        Gender = Genders.Woman,
                        Guid = Guid.NewGuid().ToString(),
                        IsActive = true,
                        LastName = "Leo",
                        Password = "user",
                        RegistrationDate = DateTime.UtcNow,
                        Score = 4.7m,
                        UserName = "user",
                        UserRoles = new List<UserRole>()
                        {
                            // Assign User role to this user
                            new UserRole() { RoleId = _db.Roles.SingleOrDefault(r => r.Name == "User").Id }
                        }
                    },
                }
            });

            // Add a new Country entity for Türkiye, including all 81 cities as child entities.
            _db.Countries.Add(new Country
            {
                Guid = Guid.NewGuid().ToString(),
                CountryName = "Türkiye",
                Cities = new List<City>
                {
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Adana" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Adıyaman" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Afyonkarahisar" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Ağrı" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Amasya" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Ankara" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Antalya" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Artvin" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Aydın" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Balıkesir" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Bilecik" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Bingöl" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Bitlis" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Bolu" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Burdur" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Bursa" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Çanakkale" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Çankırı" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Çorum" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Denizli" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Diyarbakır" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Edirne" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Elazığ" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Erzincan" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Erzurum" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Eskişehir" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Gaziantep" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Giresun" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Gümüşhane" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Hakkari" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Hatay" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Isparta" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Mersin" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "İstanbul" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "İzmir" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kars" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kastamonu" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kayseri" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kırklareli" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kırşehir" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kocaeli" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Konya" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kütahya" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Malatya" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Manisa" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kahramanmaraş" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Mardin" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Muğla" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Muş" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Nevşehir" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Niğde" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Ordu" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Rize" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Sakarya" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Samsun" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Siirt" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Sinop" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Sivas" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Tekirdağ" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Tokat" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Trabzon" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Tunceli" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Şanlıurfa" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Uşak" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Van" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Yozgat" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Zonguldak" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Aksaray" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Bayburt" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Karaman" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kırıkkale" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Batman" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Şırnak" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Bartın" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Ardahan" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Iğdır" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Yalova" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Karabük" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kilis" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Osmaniye" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Düzce" }
                }
            });

            // Add a new Country entity for the United States of America, including a representative list of major cities.
            _db.Countries.Add(new Country
            {
                Guid = Guid.NewGuid().ToString(),
                CountryName = "United States of America",
                Cities = new List<City>
                {
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "New York" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Los Angeles" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Chicago" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Houston" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Phoenix" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Philadelphia" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "San Antonio" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "San Diego" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Dallas" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "San Jose" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Austin" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Jacksonville" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Fort Worth" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Columbus" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Charlotte" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "San Francisco" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Indianapolis" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Seattle" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Denver" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Washington" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Boston" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "El Paso" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Nashville" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Detroit" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Oklahoma City" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Portland" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Las Vegas" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Memphis" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Louisville" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Baltimore" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Milwaukee" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Albuquerque" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Tucson" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Fresno" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Mesa" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Sacramento" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Atlanta" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Kansas City" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Colorado Springs" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Miami" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Raleigh" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Omaha" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Long Beach" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Virginia Beach" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Oakland" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Minneapolis" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Tulsa" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "Arlington" },
                    new City { Guid = Guid.NewGuid().ToString(), CityName = "New Orleans" }
                }
            });

            // Add a new Country entity for China with no cities.
            _db.Countries.Add(new Country
            {
                Guid = Guid.NewGuid().ToString(),
                CountryName = "China",
            });

            _db.SaveChanges();

            // Clean up wwwroot/files directory by deleting all files in it.
            var files = Directory.GetFiles(Path.Combine("wwwroot", "files"));
            foreach (var file in files)
            {
                System.IO.File.Delete(file);
            }

            // Return a success message as HTML content
            return Content("<label style='color:green;'>Database seed successful.</label>", "text/html", Encoding.UTF8);
        }
    }
}