Clear        


                
                    using _25_HasArelationship._2_BankaHesaplari.Bases;
using _25_HasArelationship._2_BankaHesaplari.Config;
using _25_HasArelationship._2_BankaHesaplari.Enums;
using System.Globalization;

namespace _25_HasArelationship._2_BankaHesaplari
{
    public class BankaHesaplariDemo
    {
        #region Alanlar
        private List<HesapBase> _hesaplar = new List<HesapBase>(); // has-a relationship: banka hesapları demo 0 veya daha çok hesaba sahiptir
        #endregion



        #region Davranışlar
        public void Calistir()
        {
            string giris = MenuGetir();

            while (giris != "0")
            {
                if (giris == "1")
                {
                    HesapEkle();
                }
                else if (giris == "2")
                {
                    HesaplariListele();
                }
                else if (giris == "3")
                {
                    IslemGerceklestir();
                }
                else if (giris == "4")
                {
                    HesapSil();
                }
                else
                {
                    Console.WriteLine(HesapConfig.GecersizGiris);
                }
                giris = MenuGetir();
            }
        }



        private string MenuGetir()
        {
            Console.Write("\nBanka işlemi (1: yeni hesap ekle, 2: hesapları listele, 3: hesaba işlem gerçekleştir, 4: mevcut hesabı sil, 0: çıkış): ");
            return Console.ReadLine();
        }



        private void HesapEkle()
        {
            string giris, hesapSahibi, hesapKurumu;
            HesapBase hesap;
            IslemBase islem;
            decimal miktar;
            IslemSonucu islemSonucu;
            Console.WriteLine("Yeni Hesap");
            Console.Write("Hesap Tipi: (1: bireysel, 2: kurumsal): ");
            giris = Console.ReadLine();
            if (giris == "1" || giris == "2")
            {
                Console.Write("Hesap sahibinin adı soyadı: ");
                hesapSahibi = Console.ReadLine();
                if (giris == "2")
                {
                    Console.Write("Hesap sahibi kurumun adı: ");
                    hesapKurumu = Console.ReadLine();
                    hesap = new KurumsalHesap()
                    {
                        Sahibi = hesapSahibi,
                        Kurumu = hesapKurumu
                    };
                }
                else
                {
                    hesap = new BireyselHesap()
                    {
                        Sahibi = hesapSahibi
                    };
                }
                hesap.FaizOraniUygula();
                _hesaplar.Add(hesap);
                Console.WriteLine(HesapConfig.HesapEklendi);
                Console.Write("Eklediğiniz hesaba para yatırmak ister misiniz? (1: evet, 2: hayır): ");
                giris = Console.ReadLine();
                if (giris == "1" || giris == "2")
                {
                    if (giris == "1")
                    {
                        IslemGerceklestir(hesap, true);
                    }
                }
                else
                {
                    Console.WriteLine(HesapConfig.GecersizGiris);
                }
            }
            else
            {
                Console.WriteLine(HesapConfig.GecersizGiris);
            }
        }



        private void HesaplariListele()
        {
            string sonuc = "";
            int sayi = _hesaplar.Count;
            BireyselHesap bireyselHesap;
            KurumsalHesap kurumsalHesap;
            if (sayi == 0)
            {
                sonuc = HesapConfig.HesapBulunamadi;
            }
            else
            {
                sayi = 0;
                foreach (HesapBase hesap in _hesaplar)
                {
                    if (hesap.AktifMi) // sadece aktif olan hesapları yazdırıyoruz
                    {
                        if (hesap is BireyselHesap)
                        {
                            bireyselHesap = hesap as BireyselHesap;
                            sonuc += "\nBireysel Hesap";
                            sonuc += $"\nId: {bireyselHesap.Id}";
                            sonuc += $"\nSahibi: {bireyselHesap.Sahibi}";
                            sonuc += $"\nBakiye: {bireyselHesap.ToplamMiktar} TL";
                            sonuc += $"\nFaizli bakiye: {bireyselHesap.FaizliToplamMiktar} TL";
                        }
                        else //if (hesap is KurumsalHesap) // zaten iki tip hesap olduğundan if kısmını yazmaya gerek yok
                        {
                            kurumsalHesap = hesap as KurumsalHesap;
                            sonuc += "\nKurumsal Hesap";
                            sonuc += $"\nId: {kurumsalHesap.Id}";
                            sonuc += $"\nSahibi: {kurumsalHesap.Sahibi}";
                            sonuc += $"\nKurumu: {kurumsalHesap.Kurumu}";
                            sonuc += $"\nBakiye: {kurumsalHesap.ToplamMiktar} TL";
                            sonuc += $"\nFaizli bakiye: {kurumsalHesap.FaizliToplamMiktar} TL";
                        }
                        sayi++;
                    }
                }
                if (sayi > 0)
                    sonuc += "\n" + sayi + " hesap bulundu.";
                else
                    sonuc += HesapConfig.HesapBulunamadi;
            }
            Console.WriteLine(sonuc);
        }



        private HesapBase HesapGetir(int hesapId)
        {
            HesapBase bulunanHesap = null;
            foreach (HesapBase hesap in _hesaplar)
            {
                if (hesap.Id == hesapId)
                {
                    bulunanHesap = hesap;
                    break;
                }
            }
            return bulunanHesap;
        }



        private void IslemGerceklestir(HesapBase hesap, bool paraYatirmaMi)
        {
            Console.Write("Miktar: ");
            decimal miktar = Convert.ToDecimal(Console.ReadLine(), new CultureInfo("tr-TR"));
            IslemSonucu islemSonucu = paraYatirmaMi ? hesap.ParaYatir(miktar) : hesap.ParaCek(miktar);
            Console.WriteLine(HesapConfig.IslemSonucuGetir(islemSonucu));
        }



        private void IslemGerceklestir()
        {
            string giris;
            int hesapId;
            decimal miktar;
            IslemSonucu islemSonucu;
            HesapBase bulunanHesap;
            Console.Write("Hesap işlemi: (1: para yatırma, 2: para çekme): ");
            giris = Console.ReadLine();
            if (giris == "1" || giris == "2")
            {
                HesaplariListele();
                if (_hesaplar.Count > 0)
                {
                    if (giris == "1")
                    {
                        Console.Write("Para yatırma işlemi için hesap id: ");
                        hesapId = int.Parse(Console.ReadLine());
                        bulunanHesap = HesapGetir(hesapId);
                        if (bulunanHesap is null)
                        {
                            Console.WriteLine(HesapConfig.HesapBulunamadi);
                        }
                        else
                        {
                            IslemGerceklestir(bulunanHesap, true);
                        }
                    }
                    else //if (giris == "2") // yazmaya gerek yok çünkü zaten iki koşul var
                    {
                        Console.Write("Para çekme işlemi için hesap id: ");
                        hesapId = int.Parse(Console.ReadLine());
                        bulunanHesap = HesapGetir(hesapId);
                        if (bulunanHesap is null)
                        {
                            Console.WriteLine(HesapConfig.HesapBulunamadi);
                        }
                        else
                        {
                            IslemGerceklestir(bulunanHesap, false);
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine(HesapConfig.GecersizGiris);
            }
        }



        private void HesapSil()
        {
            HesaplariListele();
            if (_hesaplar.Count > 0)
            {
                Console.Write("Silinmek istenen hesap id: ");
                int hesapId = Convert.ToInt32(Console.ReadLine());
                HesapBase bulunanHesap = HesapGetir(hesapId);
                if (bulunanHesap == null)
                {
                    Console.WriteLine(HesapConfig.HesapBulunamadi);
                }
                else
                {
                    bulunanHesap.AktifMi = false;
                    Console.WriteLine(HesapConfig.HesapSilindi);
                }
            }
        }
        #endregion
    }
}