public NBAStatsForm()
        {
            InitializeComponent();

            this.ExeDirectory = AppDomain.CurrentDomain.BaseDirectory;

            var dbContext = new NBAStatisticsDbContext();

            if (dbContext.Conferences.Count() == 0)
            {
                dbContext.Conferences.Add(new NBAStatistics.Models.Conference
                {
                    Name = "East"
                });
                dbContext.Conferences.Add(new NBAStatistics.Models.Conference
                {
                    Name = "West"
                });
            }

            if (dbContext.Seasons.Count() == 0)
            {
                dbContext.Seasons.Add(new NBAStatistics.Models.Season
                {
                    SeasonId = "2016-17"
                });
                dbContext.Seasons.Add(new NBAStatistics.Models.Season
                {
                    SeasonId = "2015-16"
                });
            }

            dbContext.SaveChanges();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            var nbaStastsContext = new NBAStatisticsDbContext();
            var teamsRepository  = new EfRepository <NBAStatistics.Models.StandingsByDay>(nbaStastsContext);
            var pdfService       = new PdfReportService(teamsRepository);

            pdfService.GeneratePdf();
        }
        private void button4_Click(object sender, EventArgs e)
        {
            var xmlHandler               = new PlayedGamesXmlHandler();
            var reportService            = new XmlReportService(xmlHandler);
            var nbaStatsContext          = new NBAStatisticsDbContext();
            var dailyStandingsRepository = new EfRepository <NBAStatistics.Models.StandingsByDay>(nbaStatsContext);

            reportService.CreatePlayedGamesReport(dailyStandingsRepository);
        }
        public static async Task Import()
        {
            var credentials = MongoCredential.CreateCredential(DbName, User, Pass);
            var settings    = new MongoClientSettings
            {
                Server      = new MongoServerAddress(DbHost, DbPort),
                Credentials = new List <MongoCredential> {
                    credentials
                }
            };

            var client  = new MongoClient(settings);
            var mongoDb = client.GetDatabase(DbName);

            var dbContext = new NBAStatisticsDbContext();

            await Task.Run(async() =>
            {
                var mongoSeasons = mongoDb.GetCollection <NBAStatistics.Data.FillMongoDB.Models.Season>("Seasons").AsQueryable().ToList();

                // Load all teams from the database into the context
                dbContext.Teams.Load();

                foreach (var season in mongoSeasons)
                {
                    foreach (var team in season.Teams)
                    {
                        //var teamInDb = dbContext.Teams.Local
                        //    .FirstOrDefault(t => t.TeamId == team.TeamId);

                        var teamInDb = dbContext.Teams.Local
                                       .SingleOrDefault(t => t.TeamId == team.TeamId); // runs in memory

                        if (teamInDb == null)
                        {
                            dbContext.Teams.Add(new Team
                            {
                                TeamId = team.TeamId,
                                Name   = team.Name
                            });
                        }
                    }
                }

                await dbContext.SaveChangesAsync();

                var mongoPlayers = mongoDb.GetCollection <NBAStatistics.Data.FillMongoDB.Models.Player>("Players").AsQueryable().ToList();

                // Load all players from the database into the context
                dbContext.Players.Load();
                dbContext.Teams.Load();

                foreach (var player in mongoPlayers)
                {
                    var playerNameParts = player.PlayerName.Split(new char[] { ' ' });

                    // throws an exception if there is more than 1 element in the sequence
                    var playerInDb = dbContext.Players.Local
                                     .SingleOrDefault(p => p.AdditionalInfo.PlayerId == player.PlayerId); // runs in memory

                    if (playerInDb == null)
                    {
                        dbContext.Players.Add(new Player
                        {
                            FirstName      = playerNameParts.Length > 0 ? playerNameParts[0] : "",
                            LastName       = playerNameParts.Length > 1 ? playerNameParts[1] : "",
                            AdditionalInfo = new PlayerInfo
                            {
                                PlayerId = player.PlayerId,
                                Birthday = DateTime.ParseExact(player.BirthDate, "MMM dd, yyyy", CultureInfo.InvariantCulture),
                                Height   = ConvertHeightFromFeetsInchesToCentimeters(player.Height),
                                Weight   = PoundsToKilogram(player.Weight)
                            },
                            School = string.IsNullOrEmpty(player.School) ? null : new School
                            {
                                Name = player.School
                            },
                            Position = player.Position,
                            TeamId   = dbContext.Teams.Local
                                       .Single(t => t.TeamId == player.TeamId)
                                       .Id
                        });
                    }
                }

                await dbContext.SaveChangesAsync();
            });
        }
        public static async Task ImportFromZipFile(string zipPath)
        {
            var dbContext = new NBAStatisticsDbContext();

            await Task.Run(() =>
            {
                try
                {
                    var directoryPath           = zipPath.Substring(0, zipPath.LastIndexOf('\\'));
                    string directoryWithReports = $"{directoryPath}\\Reports\\";

                    if (Directory.Exists(directoryWithReports))
                    {
                        Directory.Delete(directoryWithReports, true);
                    }

                    // If the directory already exists, this method does not create a new directory
                    DirectoryInfo di = Directory.CreateDirectory(directoryWithReports);

                    using (ZipArchive archive = ZipFile.OpenRead(zipPath))
                    {
                        foreach (ZipArchiveEntry entry in archive.Entries)
                        {
                            var directoryName   = entry.FullName.Substring(0, 11);
                            var dateOfTheReport = DateTime.ParseExact(
                                directoryName,
                                "dd-MMM-yyyy",
                                CultureInfo.InvariantCulture);

                            var xlsFileName = entry.FullName.Substring(12);
                            var xlsPath     = $"{directoryWithReports}{directoryName}_{xlsFileName}";
                            entry.ExtractToFile(xlsPath);

                            var connectionString = GetConnectionString(xlsPath, false);

                            using (var oleDbConnection = new OleDbConnection(connectionString))
                            {
                                oleDbConnection.Open();
                                var sheetNames = GetSheetNames(oleDbConnection);

                                var oleDbCommand =
                                    new OleDbCommand("SELECT * FROM [" + sheetNames.First() + "]", oleDbConnection);

                                using (var oleDbAdapter = new OleDbDataAdapter(oleDbCommand))
                                {
                                    var dataSet = new DataSet();
                                    oleDbAdapter.Fill(dataSet);

                                    // Load into the dbContext
                                    dbContext.StandingsByDays.Load();
                                    dbContext.Teams.Load();
                                    dbContext.Conferences.Load();

                                    using (var reader = dataSet.CreateDataReader())
                                    {
                                        while (reader.Read())
                                        {
                                            var teamId             = (int)(double)reader["TEAM_ID"];    // TEAM_ID
                                            var leagueId           = reader["LEAGUE_ID"];               // LEAGUE_ID
                                            var seasonId           = (int)(double)reader["SEASON_ID"];  // SEASON_ID
                                            var standingsDate      = (DateTime)reader["STANDINGSDATE"]; // STANDINGSDATE
                                            var conference         = (string)reader["CONFERENCE"];      // CONFERENCE
                                            var team               = (string)reader["TEAM"];            // TEAM
                                            var games              = (byte)(double)reader["G"];         // G
                                            var wins               = (byte)(double)reader["W"];         // W
                                            var losses             = (byte)(double)reader["L"];         // L
                                            var winningsPercentage = (double)reader["W_PCT"];           // W_PCT
                                            var homeRecord         = (string)reader["HOME_RECORD"];     // HOME_RECORD
                                            var roadRecord         = (string)reader["ROAD_RECORD"];     // ROAD_RECORD

                                            var standingsByDayInDb = dbContext.StandingsByDays.Local
                                                                     .SingleOrDefault(sbd => (sbd.TeamId == teamId) && (sbd.Date == standingsDate)); // runs in memory

                                            // for tests only
                                            //var t1 = dbContext.Teams.Local
                                            //            .SingleOrDefault(t => t.TeamId == teamId)
                                            //            .Id;
                                            //var t2 = seasonId;
                                            //var t3 = standingsDate;
                                            //var t4 = dbContext.Conferences.Local
                                            //            .SingleOrDefault(c => c.Name == conference)
                                            //            .Id;
                                            //var t5 = games;
                                            //var t6 = wins;
                                            //var t7 = losses;
                                            //var t8 = winningsPercentage;
                                            //var t9 = (byte)homeRecord.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)
                                            //    .Select(int.Parse)
                                            //    .ToArray()[0];
                                            //var t10 = (byte)roadRecord.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)
                                            //    .Select(int.Parse)
                                            //    .ToArray()[0];

                                            if (standingsByDayInDb == null)
                                            {
                                                dbContext.StandingsByDays.Add(new StandingsByDay
                                                {
                                                    TeamId = dbContext.Teams.Local
                                                             .SingleOrDefault(t => t.TeamId == teamId)
                                                             .Id,
                                                    SeasonId     = seasonId,
                                                    Date         = standingsDate,
                                                    ConferenceId = dbContext.Conferences.Local
                                                                   .SingleOrDefault(c => c.Name == conference)
                                                                   .Id,
                                                    Games          = games,
                                                    Wins           = wins,
                                                    Loses          = losses,
                                                    SuccessRate    = Math.Round(winningsPercentage, 2),
                                                    HomeRecordWins = (byte)homeRecord.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)
                                                                     .Select(int.Parse)
                                                                     .ToArray()[0],
                                                    HomeRecordLosses = (byte)homeRecord.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)
                                                                       .Select(int.Parse)
                                                                       .ToArray()[1],
                                                    RoadRecordWins = (byte)roadRecord.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)
                                                                     .Select(int.Parse)
                                                                     .ToArray()[0],
                                                    RoadRecordLosses = (byte)roadRecord.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)
                                                                       .Select(int.Parse)
                                                                       .ToArray()[1]
                                                });
                                            }
                                        }
                                    }
                                }
                            }

                            // Force clean up to release file handles
                            // source: http://stackoverflow.com/questions/2225087/the-process-cannot-access-the-file-because-it-is-being-used-by-another-process
                            GC.Collect();
                        }
                    }

                    dbContext.SaveChanges();

                    Directory.Delete(directoryWithReports, true);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            });
        }
        public static async Task ImportFromMongoDB()
        {
            var credentials = MongoCredential.CreateCredential(DbName, User, Pass);
            var settings    = new MongoClientSettings
            {
                Server      = new MongoServerAddress(DbHost, DbPort),
                Credentials = new List <MongoCredential> {
                    credentials
                }
            };

            var client  = new MongoClient(settings);
            var mongoDb = client.GetDatabase(DbName);

            var dbContext = new NBAStatisticsDbContext();

            await Task.Run(async() =>
            {
                var mongoSeasons = mongoDb.GetCollection <NBAStatistics.Data.FillMongoDB.Models.Season>("Seasons").AsQueryable().ToList();

                // Load all teams from the database into the dbContext
                dbContext.Teams.Load();

                var nullTeamInDb = dbContext.Teams.Local
                                   .SingleOrDefault(t => t.TeamId == 0); // runs in memory

                if (nullTeamInDb == null)
                {
                    // add fake team for players without team
                    dbContext.Teams.Add(new Team
                    {
                        TeamId       = 0,
                        Name         = "NoName",
                        Abbreviation = "",
                        Founded      = 0,
                        City         = new City
                        {
                            Name    = "NoName",
                            Country = new Country
                            {
                                Name = "NoName"
                            }
                        },
                        Arena = new Arena
                        {
                            Name = "NoName"
                        },
                        HeadCoach = new HeadCoach
                        {
                            Name = "NoName"
                        }
                    });
                }

                foreach (var season in mongoSeasons)
                {
                    foreach (var team in season.Teams)
                    {
                        //var teamInDb = dbContext.Teams.Local
                        //    .FirstOrDefault(t => t.TeamId == team.TeamId);

                        var teamInDb = dbContext.Teams.Local
                                       .SingleOrDefault(t => t.TeamId == team.TeamId); // runs in memory

                        if (teamInDb == null)
                        {
                            dbContext.Teams.Add(new Team
                            {
                                TeamId       = team.TeamId,
                                Name         = team.Name,
                                Abbreviation = team.Abbreviation,
                                Founded      = team.Founded,
                                City         = new City
                                {
                                    Name    = team.City,
                                    Country = new Country
                                    {
                                        Name = team.Country
                                    }
                                },
                                Arena = new Arena
                                {
                                    Name = team.Arena
                                },
                                HeadCoach = new HeadCoach
                                {
                                    Name = team.HeadCoach
                                }
                            });
                        }
                    }
                }

                await dbContext.SaveChangesAsync();

                var mongoPlayers = mongoDb.GetCollection <NBAStatistics.Data.FillMongoDB.Models.Player>("Players").AsQueryable().ToList();

                // Load all players from the database into the dbContext
                dbContext.Players.Load();
                dbContext.Teams.Load();

                foreach (var playerMongoDB in mongoPlayers)
                {
                    // throws an exception if there is more than 1 element in the sequence
                    var playerInDb = dbContext.Players.Local
                                     .SingleOrDefault(p => p.AdditionalInfo.PlayerId == playerMongoDB.PlayerId); // runs in memory

                    if (playerInDb == null)
                    {
                        var player = new Player
                        {
                            FirstName      = playerMongoDB.FirstName,
                            LastName       = playerMongoDB.LastName,
                            AdditionalInfo = new PlayerInfo
                            {
                                PlayerId = playerMongoDB.PlayerId,
                                Birthday = playerMongoDB.BirthDate,
                                Height   = string.IsNullOrEmpty(playerMongoDB.Height) ? null : ConvertHeightFromFeetsInchesToCentimeters(playerMongoDB.Height),
                                Weight   = string.IsNullOrEmpty(playerMongoDB.Weight) ? null : PoundsToKilogram(playerMongoDB.Weight)
                            },
                            School = string.IsNullOrEmpty(playerMongoDB.School) ? null : new School
                            {
                                Name = playerMongoDB.School
                            },
                            Country = string.IsNullOrEmpty(playerMongoDB.Country) ?
                                      new Country {
                                Name = "NoName"
                            } :
                            string.IsNullOrEmpty(playerMongoDB.Country.Trim()) ?
                            new Country {
                                Name = "NoName"
                            } :
                            new Country {
                                Name = playerMongoDB.Country
                            },
                            Position     = playerMongoDB.Position,
                            RosterStatus = playerMongoDB.RosterStatus,
                            TeamId       = dbContext.Teams.Local
                                           .Single(t => t.TeamId == playerMongoDB.TeamId)
                                           .Id
                        };

                        dbContext.Players.Local.Add(player);
                    }
                }

                await dbContext.SaveChangesAsync();

                // Load all players and seasons from the database into the dbContext
                dbContext.Players.Load();
                dbContext.Seasons.Load();
                dbContext.PlayerSeasonPointsPerGame.Load();

                foreach (var playerMongoDB in mongoPlayers)
                {
                    var player = dbContext.Players.Local
                                 .FirstOrDefault(p => p.AdditionalInfo.PlayerId == playerMongoDB.PlayerId);

                    foreach (var sppg in playerMongoDB.SeasonPointsPerGame)
                    {
                        var seasonIdInMongoDB      = sppg.Key;
                        var pointsPerGameInMongoDB = sppg.Value;

                        var seasonId = dbContext.Seasons.Local
                                       .FirstOrDefault(s => s.SeasonId == seasonIdInMongoDB)
                                       .Id;

                        var playerSeasonPointsPerGameRecordExists =
                            dbContext.PlayerSeasonPointsPerGame.Local
                            .Where(ps => ps.PlayerId == player.Id && ps.SeasonId == seasonId)
                            .Count() > 0;

                        if (playerSeasonPointsPerGameRecordExists)
                        {
                            // skip this record to DB
                            continue;
                        }

                        var playerSeasonPointsPerGame = new PlayerSeasonPointsPerGame
                        {
                            PlayerId      = player.Id,
                            SeasonId      = seasonId,
                            PointsPerGame = pointsPerGameInMongoDB
                        };

                        player.PlayerSeasonPointsPerGame.Add(playerSeasonPointsPerGame);
                    }
                }

                await dbContext.SaveChangesAsync();
            });
        }