Clear        


                
                    using _25_HasArelationship._2_BankaHesaplari.Config;
using _25_HasArelationship._2_BankaHesaplari.Enums;

namespace _25_HasArelationship._2_BankaHesaplari.Bases
{
    /// <summary>
    /// Bireysel ve kurumsal hesap somut sınıflarının miras alacağı soyut sınıf.
    /// </summary>
    public abstract class HesapBase
    {
        #region Özellikler
        /// <summary>
        /// Tekil otomatik bir artacak hesap numarası.
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// Hesap sahibinin adı ve soyadı.
        /// </summary>
        public string Sahibi { get; set; }

        /// <summary>
        /// Hesabın aktif hesap veya aktif olmayan (dondurulmuş) hesap değeri.
        /// </summary>
        public bool AktifMi { get; set; } = true; // ilk değer ataması olarak true yapıyoruz ki yeni hesap objesi oluşturulduğunda hesap aktif olsun

        /// <summary>
        /// Hesaptaki işlemler üzerinden sadece okunur toplam para miktarı (bakiye).
        /// </summary>
        public decimal ToplamMiktar
        {
            get
            {
                decimal toplam = 0;
                foreach (Islem islem in _islemler)
                {
                    toplam += islem.Miktar;
                }
                return toplam;
            }
        }

        /// <summary>
        /// Hesaptaki toplam para miktarına faiz oranı uygulanmış miktar.
        /// </summary>
        public decimal FaizliToplamMiktar
        {
            get
            {
                return ToplamMiktar + ToplamMiktar * _faizOrani;
            }
        }
        #endregion



        #region Alanlar
        /// <summary>
        /// Bakiyeye uygulanacak faiz oranı.
        /// </summary>
        protected decimal _faizOrani; // protected tanımladık ki bireysel ve kurumsal hesap sınıflarında erişebilelim

        /// <summary>
        /// Hesabın para yatırma ve para çekme işlemleri.
        /// </summary>
        private List<IslemBase> _islemler = new List<IslemBase>(); // has-a relationship: bir hesabın sıfır veya daha çok işlemi olabilir,
                                                                   // hesap objesi oluştuğunda işlemler koleksiyonu da oluşacak
        #endregion



        #region Constructor
        protected HesapBase() // class abstract olduğu için constructor'ı protected tanımlıyoruz
        {
            Id = HesapConfig.Id++; // tüm uygulama için ortak paylaşılan statik HesapConfig sınıfındaki Id'nin değerini hesabın Id'sine ata ve 1 arttır
        }
        #endregion



        #region Davranışlar
        /// <summary>
        /// Hesaba para yatırma işlemi.
        /// </summary>
        /// <param name="yatirilacakMiktar"></param>
        /// <returns>IslemSonucu</returns>
        public IslemSonucu ParaYatir(decimal yatirilacakMiktar)
        {
            if (yatirilacakMiktar <= 0) // yatırılacak miktar 0'dan küçük veya 0'a eşitse
                return IslemSonucu.NegatifMiktar; // hatalı işlem sonucu dönüyoruz

            // yeni bir işlem objesinin oluşturulup işlem listesine eklenmesi
            Islem islem = new Islem(yatirilacakMiktar, true);
            _islemler.Add(islem);

            return IslemSonucu.Basarili; // başarılı işlem sonucu dönüyoruz
        }

        /// <summary>
        /// Hesaptan para çekme işlemi.
        /// </summary>
        /// <param name="cekilecekMiktar"></param>
        /// <returns>IslemSonucu</returns>
        public IslemSonucu ParaCek(decimal cekilecekMiktar)
        {
            if (cekilecekMiktar <= 0) // çekilecek miktar 0'dan küçük veya 0'a eşitse
                return IslemSonucu.NegatifMiktar; // hatalı işlem sonucu dönüyoruz

            if (ToplamMiktar - cekilecekMiktar < 0) // eğer para çekildikten sonra bakiye negatifse
                return IslemSonucu.YetersizBakiye; // hatalı işlem sonucu dönüyoruz

            // yeni bir işlem objesinin oluşturulup işlem listesine eklenmesi
            Islem islem = new Islem(-cekilecekMiktar, false); // -cekilecekMiktar = -1 * cekilecekMiktar
            _islemler.Add(islem);

            return IslemSonucu.Basarili; // başarılı işlem sonucu dönüyoruz
        }

        /// <summary>
        /// Bu sınıftan miras alan bireysel ve kurumsal hesap sınıflarında farklı oranlar üzerinden toplam miktara 
        /// uygulanacak faiz oranını atayan soyut method tanımı.
        /// </summary>
        public abstract void FaizOraniUygula();
        #endregion
    }
}