__author__ = 'CAM'

from win32com.client import CDispatch

from IFikomObject import IFikomObject


class IFikoNumokratorItem(object): pass


class IFikoNumokratorItem(object):
    def __init__(self, Obj, sahip):
        self._parcaObj = Obj
        self._sahip = sahip
        self._parcaNumarasi = str
        self._parcaSayisi = int
        self._bulunduguProductlar = list
        self._altparcalar = []
        self._turu = str
        self._ismi = str

    @property
    def ismi(self) -> str:
        return self._ismi

    @ismi.setter
    def ismi(self, value: str):
        self._ismi = value

    @property
    def turu(self) -> str:
        return self._turu

    @turu.setter
    def turu(self, value: str):
        self._turu = value

    @property
    def sayisi(self) -> int:
        return self._parcaSayisi

    @sayisi.setter
    def sayisi(self, value: int):
        self._parcaSayisi = value

    @property
    def parcaNumarasi(self) -> str:
        return self._parcaNumarasi

    @parcaNumarasi.setter
    def parcaNumarasi(self, value: str):
        self._parcaNumarasi = value

    @property
    def sahip(self) -> object:
        return self._sahip

    @sahip.setter
    def sahip(self, value: object):
        self._sahip = value

    @property
    def parca(self) -> object:
        return self._parcaObj

    @parca.setter
    def parca(self, value: object):
        self._parcaObj = value

    def altItem(self, value: int) -> IFikoNumokratorItem:
        return self._altparcalar[value]

    @property
    def altParcaSayisi(self):
        return len(self._altparcalar)


class IFikoNumokrator(IFikomObject):
    def __init__(self, obj:CDispatch, sahip:IFikomObject=None):
        """Constructor for IFikoNumokrator"""
        super(IFikoNumokrator, self).__init__(obj, sahip)
        self.sahip = sahip
        self.tipi = "IFikoNumokrator"
        self._items = []

    @property
    def sayisi(self) -> int:
        return len(self._items)

    def ekle(self, value:IFikoNumokratorItem):
        return IFikoNumokratorItem(self._items.append(value), self)

    def item(self, value) -> IFikoNumokratorItem:
        return self._items[value]

    def sil(self, value):
        self._items.remove(value)

    def hazirla(self):
        partlar = {}

        def UstNumokratorObje(Product):
            toplamSayi = 0
            agac = {}
            tmprPrdct = Product.productlar
            for x in range(tmprPrdct.sayisi):
                itm = tmprPrdct.item(x)
                fknm = self.ekle(itm)
                fknm.ismi = itm.ismi
                fknm.parcaNumarasi = itm.parcaNumarasi
                if itm.productMi:
                    fknm.turu = "IProduct"
                    toplamSayi += UstNumokratorObje(itm)[0]
                    agac[str(itm.parcaNumarasi)] = UstNumokratorObje(itm)[1]
                else:
                    toplamSayi += 1
                    fknm.turu = "IPart"
                    agac[str(itm.parcaNumarasi)] = {}

                    if itm.parcaNumarasi in partlar:
                        partlar[itm.parcaNumarasi]["Sayisi"] += 1
                    else:
                        partlar[itm.parcaNumarasi] = {}
                        partlar[itm.parcaNumarasi]["Sayisi"] = 1
            return toplamSayi, agac, partlar

        rslt, agac, partlar = UstNumokratorObje(self.sahip)

        # print(Counter(agac["Chc M12x50 (8.8)"]))

        return partlar

    def __call__(self):
        PrdctSayisi = self.sayisi
        return [self.item(x) for x in range(PrdctSayisi)]

    def __str__(self):
        PrdctSayisi = self.sayisi
        return repr([self.item(x).ismi for x in range(PrdctSayisi)])

    def __len__(self) -> int:
        return int(self.sayisi)

    def __getitem__(self, item) -> IFikoNumokratorItem:
        return self.item(item)