from functools import reduce

__author__ = 'CAM'

from win32com.client import CDispatch

from IFikomObject import IFikomObject
from IProgram import IProgram





class IProgramlar(IFikomObject):
    def __init__(self, obj:CDispatch, sahip:IFikomObject=None):
        super(IProgramlar, self).__init__(obj, sahip)
        self.sahip = sahip
        self.tipi = "IProgramlar"

    # --->Sabit Degiskenler

    @property
    def sayisi(self):
        return self.catNesne.Programs.Count

    def tumunuDeaktifYap(self) -> bool:
        try:
            for x in range(1, self.catNesne.Programs.Count + 1):
                self.catNesne.Programs.GetElement(x).Active = 0
        finally:
            return bool(1)


    def tumunuAktifYap(self) -> bool:
        try:
            for x in range(1, self.catNesne.Programs.Count + 1):
                self.catNesne.Programs.GetElement(x).Active = 1
        finally:
            return bool(1)


    def tumunuKilitle(self) -> bool:
        try:
            for x in range(1, self.catNesne.Programs.Count + 1):
                if self.catNesne.Programs.GetElement(x).ChildrenActivities.Count > 0:
                    self.catNesne.Programs.GetElement(x).LockActivitesWithinProgram()
        finally:
            return bool(1)


    def tumKilidiAc(self) -> bool:
        try:
            for x in range(1, self.catNesne.Programs.Count + 1):
                if self.catNesne.Programs.GetElement(x).ChildrenActivities.Count > 0:
                    self.catNesne.Programs.GetElement(x).UnLockActivitesWithinProgram()
        finally:
            return bool(1)

    def item(self, MFGIndex)->IProgram:
        if type(MFGIndex) is int:
            MFGIndex = MFGIndex + 1
        return IProgram(obj=self.catNesne.Programs.GetElement(MFGIndex), sahip=self)

    @property
    def aktifProgramlar(self):
        rslt = []
        prgSayisi = self.sayisi
        rslt = [self.item(x).ismi for x in range(prgSayisi) if self.item(x).aktif]
        return rslt

    @property
    def deAktifProgramlar(self):
        rslt = []
        prgSayisi = self.sayisi
        rslt = [self.item(x).ismi for x in range(prgSayisi) if not self.item(x).aktif]
        return rslt

    @property
    def isimliProgramlar(self):
        rslt = []
        prgSayisi = self.sayisi
        rslt = [self.item(x).ismi for x in range(prgSayisi) if not self.item(x).isimsiz]
        return rslt

    @property
    def isimsizProgramlar(self):
        rslt = []
        prgSayisi = self.sayisi
        rslt = [self.item(x).ismi for x in range(prgSayisi) if self.item(x).isimsiz]
        return rslt

    def __call__(self):
        prgSayisi = self.sayisi
        # return [self.item(x) for x in range(prgSayisi)]
        return list(map(lambda x:self.item(x),range(prgSayisi)))

    def __str__(self):
        prgSayisi = self.sayisi
        return repr([self.item(x).ismi for x in range(prgSayisi)])

    def __len__(self) -> int:
        return int(self.sayisi)

    def __getitem__(self, item) -> IProgram:
        return self.item(item)





class FikoProgramListesi(list):
    def __init__(self, prgler:list=[]):
        """Constructor for ProgramListesi"""
        super(FikoProgramListesi, self).__init__(prgler)
        self.liste = prgler

    def __getitem__(self, item)->IProgram:
        return self.liste[item]

    def __call__(self, *args, **kwargs):
        return self.liste

    def __str__(self):
        prgSayisi = self.__len__()
        return repr([self.__getitem__(x).ismi for x in range(prgSayisi)])