/// <summary>
 /// Get all persons
 /// </summary>
 /// <returns>Persons info</returns>
 public IEnumerable <PersonInfo> GetPersons()
 {
     using (AccountsStorageContext context = new AccountsStorageContext())
     {
         return(context.Persons);
     }
 }
        /// <summary>
        /// Update account
        /// </summary>
        /// <param name="account">Account</param>
        public void UpdateAccount(Account.Account account)
        {
            using (AccountsStorageContext context = new AccountsStorageContext())
            {
                string     accountId = account.Id;
                PersonInfo pi        = context.Persons.SingleOrDefault(person => person.Id == accountId);

                if (pi != null)
                {
                    Remove(pi.Id);
                    Add(account);
                }
            }
        }
        /// <summary>
        /// Get account using id
        /// </summary>
        /// <param name="accId">Account id</param>
        /// <returns>Founded account</returns>
        public Account.Account GetAccountById(string accId)
        {
            using (AccountsStorageContext context = new AccountsStorageContext())
            {
                PersonInfo pi = context.Persons.SingleOrDefault(person => person.Id == accId);

                if (pi != null)
                {
                    Account.Account foundedAccount = new Account.Account(pi.Id, pi.Name, pi.SurName, pi.Mail, pi.Bonus);

                    List <PersonToCashLink> links = context.Links.Where(link => link.PersonId == pi.Id).ToList();
                    foreach (PersonToCashLink link in links)
                    {
                        CashInfo ci = context.Cashes.SingleOrDefault(cashInfo => cashInfo.Id == link.CashId);

                        switch ((CashType)ci.CashType)
                        {
                        case CashType.BaseCash:
                            BaseCash baseCash = new BaseCash(new BonusCalculator(0.05, 0.03), ci.Id);
                            baseCash.Amount = ci.Amount;
                            foundedAccount.AddCash((Currency)ci.Currency, baseCash);
                            break;

                        case CashType.GoldCash:
                            GoldCash goldCash = new GoldCash(new BonusCalculator(0.05, 0.03), ci.Id);
                            goldCash.Amount = ci.Amount;
                            foundedAccount.AddCash((Currency)ci.Currency, goldCash);
                            break;

                        case CashType.PlatinumCash:
                            PlatinumCash platinumCash = new PlatinumCash(new BonusCalculator(0.05, 0.03), ci.Id);
                            platinumCash.Amount = ci.Amount;
                            foundedAccount.AddCash((Currency)ci.Currency, platinumCash);
                            break;
                        }
                    }

                    return(foundedAccount);
                }
                else
                {
                    return(null);
                }
            }
        }
        /// <summary>
        /// Add account to database using storage structures
        /// </summary>
        /// <param name="account">Additing account</param>
        public void Add(Account.Account account)
        {
            using (AccountsStorageContext context = new AccountsStorageContext())
            {
                PersonInfo pi = new PersonInfo(account.Id, account.Name, account.SurName, account.Mail, account.Bonus);
                context.Persons.Add(pi);

                foreach (var cashInfo in account.Cash)
                {
                    CashInfo ci = new CashInfo(cashInfo.Value.Id, cashInfo.Value.Amount, (int)cashInfo.Key, (int)cashInfo.Value.GetCashType());
                    context.Cashes.Add(ci);

                    PersonToCashLink link = new PersonToCashLink(account.Id, cashInfo.Value.Id, GenerateLinkId());
                    context.Links.Add(link);
                }

                context.SaveChanges();
            }
        }
        /// <summary>
        /// Remove account from database
        /// </summary>
        /// <param name="accId">Account id</param>
        public void Remove(string accId)
        {
            using (AccountsStorageContext context = new AccountsStorageContext())
            {
                PersonInfo pi = context.Persons.SingleOrDefault(person => person.Id == accId);

                if (pi != null)
                {
                    context.Persons.Remove(pi);

                    List <PersonToCashLink> links = context.Links.Where(link => link.PersonId == pi.Id).ToList();
                    foreach (PersonToCashLink link in links)
                    {
                        CashInfo ci = context.Cashes.SingleOrDefault(cashInfo => cashInfo.Id == link.CashId);
                        context.Cashes.Remove(ci);

                        context.Links.Remove(link);
                    }

                    context.SaveChanges();
                }
            }
        }