﻿from os.path import join, abspath, dirname,isfile

from IMakine import IMakine
from IPart import IPart
from IPartOperasyonlari.IPartOperasyonu import IPartOperasyonu
from IProcessDokuman import IProcessDokuman

__author__ = 'CAM'

from IFikomObject import IFikomObject
from IDokuman import IDokuman
from win32com.client import CDispatch, Dispatch
from IProduct import IProduct
import inspect
import shutil

class IPartDokuman(IDokuman):
    def __init__(self, obj: CDispatch, sahip: IFikomObject = None):
        super(IPartDokuman, self).__init__(obj, sahip)
        self.sahip = sahip
        self.tipi = "IPartDokuman"

    # --->Sabit Degiskenler

    @property
    def part(self) -> IPart:
        return IPart(self.catNesne.Part, self)

    @property
    def product(self) -> IProduct:
        return IProduct(self.catNesne.Product)

    def processOlustur(self, *args, **kwargs) -> IProcessDokuman:
        """
        Eğer Döküman PartDöküman İse İşe Yarayacak Kontroller Yapılacak.Klasor Parametresi None İse Part İle Aynı
        Klasöre Oluşturulacak.
        İsim None İse Part Döküman İle Aynı İsimde Oluşturulacak.
        Ayarlar Parametresi None İse Standart Ayarlar Kullanılacak(Yada Kwargs Get Olayı Geçerli Olacak).
        """
        # [A] Process Oluşturma İşlemi
        _scriptYolu = dirname(abspath(inspect.getfile(inspect.currentframe())))
        _ornekProcess = join(_scriptYolu, "fikoProcess.fikprcs")
        _dsy = join(self.klasoru, self.ismi.replace(".CATPart","") + "-" + "1" + ".CATProcess")
        __kaydet: bool = kwargs.get("kaydet", False)

        if isfile(_dsy):
            return

        shutil.copy(_ornekProcess, _dsy)
        self.anaProgram.dokumanlar.ac(_dsy)
        __dokuman:IDokuman = self.anaProgram.aktifDokuman  # type: ignore
        __processDokuman:IProcessDokuman = __dokuman.asProcessDokuman
        __pprDokuman = __processDokuman.asPPR
        
        __partDokuman: IPartDokuman = self
        __pprPart: IProduct = __pprDokuman.productlar.ekle(__partDokuman.product)
        __processDokuman.partOperasyonlari[0].urunDokumani = __pprPart
        __processDokuman.partOperasyonlari[1].urunDokumani = __pprPart
        # [A] Part Operasyonu Ayarları
        __PO: IPartOperasyonu = __processDokuman.partOperasyonlari[1]
        __PO.ismi = "FikOperasyon.1"
        __makine: IMakine = __PO.makineYarat("Mfg3AxisMachine")
        __makine.kuralDosyasi = abspath(
            join(self.anaProgram.programKlasoru, "..", "..", "startup", "Manufacturing", "IMSPar", "fanuc16i.lib"))# type: ignore
        __makine.interpolasyonDairesel2d = False
        __makine.interpolasyonDuzlemsel3d = False
        __makine.maksIslemeHizi = 25000
        __makine.maksBostakiHizi = 25000
        __makine.ismi = "FikoYT 3 Eksen"
        # [A] Parttaki Eksenler Kontrol Edilerek İşleme Ekseni Seçiliyor
        if __partDokuman.part.eksenler.sayisi == 1:
            __PO.islemeEkseni.eksenSec(__partDokuman.part.eksenler.item(0), __pprPart)
        elif __partDokuman.part.eksenler.sayisi > 1:
            __PO.islemeEkseni.eksenSec(__partDokuman.part.eksenler.item(__partDokuman.part.eksenler.sayisi-1), __pprPart)
        __PO.islemeEkseni.ismi = __PO.ismi

        # __PO.programlar[0].ismi = "<<< " + __PO.sifirKonum.toStr + " >>>" # type: ignore
                # [A] Eğer Kaydet Argümanı Tamınlanmışsa
        if __kaydet:
            try:
                __processDokuman.kaydet()
            except:
                pass
                # __processDokuman.kaydet()
        # __PO.programlar[0].ismi = "<<< " + __PO.sifirKonum.toStr + " >>>"
        return __processDokuman
        return

        # print(__pprPart.referansProduct.asType("IPartDokuman", IPartDokuman).part.eksenler.ekle())
        # [A] Argümanlar
        __kaydet: bool = kwargs.get("kaydet", False)
        __klasor: str = kwargs.get("klasor", self.klasoru)
        __ismi: str = kwargs.get("ismi", self.ismi.upper().replace(".CATPART", ""))
        __yol: str = join(__klasor, __ismi + ".CATProcess")

        # [A] Process Oluşturma İşlemi
        __partDokuman: IPartDokuman = self
        __processDokuman = self.anaProgram.dokumanlar.ekle("Process").asProcessDokuman
        __pprDokuman = __processDokuman.asPPR

        __pprPart: IProduct = __pprDokuman.productlar.ekle(__partDokuman.product)
        __processDokuman.partOperasyonlari[0].urunDokumani = __pprPart
        # [A] Part Operasyonu Ayarları
        __PO: IPartOperasyonu = __processDokuman.partOperasyonlari[0]
        __PO.ismi = "FikOperasyon.1"
        __makine: IMakine = __PO.makineYarat("Mfg3AxisMachine")
        __makine.kuralDosyasi = abspath(
            join(self.anaProgram.programKlasoru, "..", "..", "startup", "Manufacturing", "IMSPar", "fanuc18i.lib"))
        __makine.interpolasyonDairesel2d = False
        __makine.interpolasyonDuzlemsel3d = False
        __makine.maksIslemeHizi = 10000
        __makine.maksBostakiHizi = 10000
        __makine.ismi = "FikoYT 3 Eksen"
        # [A] Parttaki Eksenler Kontrol Edilerek İşleme Ekseni Seçiliyor
        if __partDokuman.part.eksenler.sayisi == 1:
            __PO.islemeEkseni.eksenSec(__partDokuman.part.eksenler.item(0), __pprPart)
        elif __partDokuman.part.eksenler.sayisi > 1:
            __PO.islemeEkseni.eksenSec(__partDokuman.part.eksenler.item(__partDokuman.part.eksenler.sayisi-1), __pprPart)
        __PO.islemeEkseni.ismi = __PO.ismi

        # [A] Eğer Kaydet Argümanı Tamınlanmışsa
        if __kaydet:
            try:
                __processDokuman.farkliKaydet(__yol)
            except:
                __processDokuman.kaydet()
        __PO.programlar[0].ismi = "<<< " + __PO.sifirKonum.toStr + " >>>"
        return __processDokuman


    def processOlusturYEDEK(self, *args, **kwargs) -> IProcessDokuman:
        """
        Eğer Döküman PartDöküman İse İşe Yarayacak Kontroller Yapılacak.Klasor Parametresi None İse Part İle Aynı
        Klasöre Oluşturulacak.
        İsim None İse Part Döküman İle Aynı İsimde Oluşturulacak.
        Ayarlar Parametresi None İse Standart Ayarlar Kullanılacak(Yada Kwargs Get Olayı Geçerli Olacak).
        """

        # print(__pprPart.referansProduct.asType("IPartDokuman", IPartDokuman).part.eksenler.ekle())
        # [A] Argümanlar
        __kaydet: bool = kwargs.get("kaydet", False)
        __klasor: str = kwargs.get("klasor", self.klasoru)
        __ismi: str = kwargs.get("ismi", self.ismi.upper().replace(".CATPART", ""))
        __yol: str = join(__klasor, __ismi + ".CATProcess")

        # [A] Process Oluşturma İşlemi
        __partDokuman: IPartDokuman = self
        __processDokuman = self.anaProgram.dokumanlar.ekle("Process").asProcessDokuman
        __pprDokuman = __processDokuman.asPPR

        __pprPart: IProduct = __pprDokuman.productlar.ekle(__partDokuman.product)
        __processDokuman.partOperasyonlari[0].urunDokumani = __pprPart
        # [A] Part Operasyonu Ayarları
        __PO: IPartOperasyonu = __processDokuman.partOperasyonlari[0]
        __PO.ismi = "FikOperasyon.1"
        __makine: IMakine = __PO.makineYarat("Mfg3AxisMachine")
        __makine.kuralDosyasi = abspath(
            join(self.anaProgram.programKlasoru, "..", "..", "startup", "Manufacturing", "IMSPar", "fanuc18i.lib"))
        __makine.interpolasyonDairesel2d = False
        __makine.interpolasyonDuzlemsel3d = False
        __makine.maksIslemeHizi = 10000
        __makine.maksBostakiHizi = 10000
        __makine.ismi = "FikoYT 3 Eksen"
        # [A] Parttaki Eksenler Kontrol Edilerek İşleme Ekseni Seçiliyor
        if __partDokuman.part.eksenler.sayisi == 1:
            __PO.islemeEkseni.eksenSec(__partDokuman.part.eksenler.item(0), __pprPart)
        elif __partDokuman.part.eksenler.sayisi > 1:
            __PO.islemeEkseni.eksenSec(__partDokuman.part.eksenler.item(__partDokuman.part.eksenler.sayisi-1), __pprPart)
        __PO.islemeEkseni.ismi = __PO.ismi

        # [A] Eğer Kaydet Argümanı Tamınlanmışsa
        if __kaydet:
            try:
                __processDokuman.farkliKaydet(__yol)
            except:
                __processDokuman.kaydet()
        __PO.programlar[0].ismi = "<<< " + __PO.sifirKonum.toStr + " >>>"
        return __processDokuman
