import json
from IParametreler import IParametreler
from IYardimciSiniflar import timeit

__author__ = 'PC'
import os
import glob
from IDokuman import IDokuman
from IPPRDokuman import IPPRDokuman
from IPartOperasyonlari.IPartOperasyonlari import IPartOperasyonlari
from IProgram import IProgram

from FikoPost.IFikoDBNC import IFikoDBNC


class IFikoPost: pass
class FikoProgramListesi: pass


class IProcessDokuman(IDokuman):
    def __init__(self, obj, sahip=None):
        # --->Mirasci Sinif
        super(IProcessDokuman, self).__init__(obj, sahip)
        self.sahip = sahip
        self.tipi = "IProcessDokuman"
        # --->Sabit Degiskenler
        self.__eskiPostKlasoru = "POSTLAR"
        self.__postUzantisi = "H"

    @property
    def eskiPostKlasoru(self):
        return self.__eskiPostKlasoru

    @eskiPostKlasoru.setter
    def eskiPostKlasoru(self, value: str) -> str:
        self.__eskiPostKlasoru = value

    @property
    def postUzantisi(self):
        return self.__postUzantisi

    @postUzantisi.setter
    def postUzantisi(self, value: str):
        self.__postUzantisi = value

    @property
    def partOperasyonlari(self, Process=0)->IPartOperasyonlari:
        return IPartOperasyonlari(obj=self.asPPR.processler.item(Process).catNesne, sahip=self)

    @property
    def seciliProgramVarMi(self) -> bool:
        rslt = False
        AktifDokuman = self.catNesne

        for x in range(0, AktifDokuman.Selection.Count2):
            if AktifDokuman.Selection.Item2(x + 1).Value.Type == "ManufacturingProgram":
                rslt = True
                break
        return rslt


    def __MFGPOTespit(self, Mfg):
        self.CatProcess = self.asPPRDokuman.processler.item(0)
        PossiblePrecedenceActivities = Mfg.PossiblePrecedenceActivities
        poSayac = 0
        PoSayisi = self.CatProcess.partOperasyonlari.sayisi
        for x in range(0, PossiblePrecedenceActivities.Count):
            Activity = PossiblePrecedenceActivities.item(x + 1).Type
            if Activity == "ManufacturingSetup":
                poSayac = poSayac + 1
                if poSayac > PoSayisi:
                    break
            if Activity != "ManufacturingSetup" and Activity != "MachiningProcessList":
                break
        return self.CatProcess.partOperasyonlari.item(poSayac)

    @property
    def seciliProgramlar(self) -> FikoProgramListesi:
        from IProgramlar import FikoProgramListesi
        # --->
        Selection = self.secililer
        # --->
        rslt = []
        if Selection.sayisi2 > 0:
            for x in range(0, Selection.sayisi2):
                inesne = Selection.item2(x)
                if inesne.turu == "ManufacturingProgram":
                    rslt.append(IProgram(obj=inesne.catNesne.Value))
        # return FikoProgramListesi(list(map(
        #     lambda x: IProgram(obj=x.catNesne.Value, sahip=self.__MFGPOTespit(x.catNesne.Value).programlar),
        #             filter(lambda x: x.turu == "ManufacturingProgram", self.secililer()))))
        return FikoProgramListesi(rslt)

    @property
    def tumProgramlar(self) -> FikoProgramListesi:
        from IProgramlar import FikoProgramListesi
        rslt = []
        for op in self.partOperasyonlari():
            for prg in op.programlar():
                rslt.append(prg)
        return FikoProgramListesi(rslt)

    @property
    def tumProgramlarListe(self) -> list:
        rslt = []
        for op in self.partOperasyonlari():
            for prg in op.programlar():
                rslt.append(prg.ismi)
        return rslt

    @property
    def tumProgramSayisi(self):
        __rslt = 0
        for x in self.partOperasyonlari():
            __rslt += x.programlar.sayisi
        return __rslt

    def SeciliProgramlarAptUret(self, Ayar={ }, Sonra=None, Once=None, PosttanSonra=None,
                                PosttanOnce=None):
        SeciliProgramlar = self.seciliProgramlar
        # --->
        if Once != None:
            Once(SeciliProgramlar)
        # --->
        rslt = []
        for x in SeciliProgramlar:
            rslt.append(x.AptUret(Once=PosttanOnce, Sonra=PosttanSonra, Ayar=Ayar))
        # --->
        if Sonra != None:
            Sonra(SeciliProgramlar)
        return rslt

    def seciliProgramlarNcUret(self, Ayar={ }, Sonra=None, Once=None, PosttanSonra=None,
                               PosttanOnce=None):
        SeciliProgramlar = self.seciliProgramlar
        # --->
        if Once != None:
            Once(SeciliProgramlar)
        # --->
        for x in SeciliProgramlar:
            x.ncUret(Once=PosttanOnce, Sonra=PosttanSonra, Ayar=Ayar)
        # --->
        if Sonra != None:
            Sonra(SeciliProgramlar)

    def postlariKlasoreTasi(self, val=None):
        def KlasordekiDosyalar(Klasor, Uzantilar="*.*"):
            os.chdir(Klasor)
            List = []
            for files in glob.glob(Uzantilar):
                List.append(files)
            return List

        import shutil

        if val != None:
            self.postUzantisi = val

        liste = []
        dosyalar = KlasordekiDosyalar(self.klasoru, "*." + self.postUzantisi)
        print(dosyalar)
        for dosya in dosyalar:
            liste.append(str(dosya))

        Klasor = self.klasoru
        # if val == None:
        if not os.path.exists(os.path.join(Klasor, self.eskiPostKlasoru)):
            os.makedirs(os.path.join(Klasor, self.eskiPostKlasoru))
        Dosyalar = KlasordekiDosyalar(Klasor + "\\", "*." + self.postUzantisi)
        for idos in range(len(Dosyalar)):
            if os.path.exists(Klasor + "\\" + self.eskiPostKlasoru + "\\" + Dosyalar[idos]):
                os.remove(Klasor + "\\" + self.eskiPostKlasoru + "\\" + Dosyalar[idos])

            shutil.copy(Klasor + "\\" + Dosyalar[idos],
                        Klasor + "\\" + self.eskiPostKlasoru + "\\" + Dosyalar[idos])
            os.remove(Klasor + "\\" + Dosyalar[idos])
        # else:
        #     pass

        return liste

    def klasoruTemizle(self, val=["log", "FikoApt_LOG", "LOG", "H"]):
        def KlasordekiDosyalar(Klasor, Uzantilar="*.*"):
            os.chdir(Klasor)
            List = []
            for files in glob.glob(Uzantilar):
                List.append(files)
            return List

        liste = []
        for uzanti in val:
            dosyalar = KlasordekiDosyalar(self.klasoru, "*." + uzanti)
            for dosya in dosyalar:
                liste.append(str(dosya))

        for uzanti in val:
            dosyalar = KlasordekiDosyalar(self.klasoru, "*." + uzanti)
            for dosya in dosyalar:
                os.remove(dosya)

        return liste

    def tezgah(self, val=None):
        import json

        Klasor = self.klasoru + "\\Fikomantasyon"
        # --->
        if not os.path.exists(Klasor):
            os.makedirs(Klasor)
        AyarDosya = Klasor + "\\Tezgah.FikoAyar"
        if os.path.isfile(AyarDosya):
            Json = json.load(open(AyarDosya))

        # --->

        if val is None:
            try:
                return Json["FikoTezgah"]
            except:
                return None
        else:
            try:
                Json = { }
                Json["FikoTezgah"] = val
                json.dump(Json, open(AyarDosya, 'w'))
            except:
                pass

    @property
    def asPPR(self) -> IPPRDokuman:
        return IPPRDokuman(obj=self.catNesne, sahip=self)

    @property
    def fikoPost(self) -> IFikoPost:
        return IFikoPost(sahip=self)

    @property
    def fikoDBNC(self) -> IFikoDBNC:
        return IFikoDBNC(sahip=self)

    def tumProgramlarListeJsonForFikoKit(self, bilgiler: list = ['ismi']) -> list:
        rslt = []
        for op in self.partOperasyonlari():
            for prg in op.programlar():
                rslt.append(prg.jsonForFikoKit(bilgiler))
        return rslt

    def takimOlustur(self):
        pass


from FikoPost.IFikoPost import IFikoPost
