import os
from time import sleep
from typing import List

from win32com.client import CDispatch
from IBodyler import IBodyler
from IEksenler import IEksenler
from IFikomObject import IFikomObject
from IHibridBodyler import IHibridBodyler
from IParametreler import IParametreler
from PIL import Image

from IYardimciSiniflar import SifirKonum


class IPartDokuman:
    pass


class IPart(IFikomObject):
    def __init__(self, obj: CDispatch, sahip: IPartDokuman = None):
        super(IPart, self).__init__(obj, sahip)
        self.sahip: IPartDokuman = sahip
        self.tipi = "IPart"
        #--->
        self.__dosya = os.path.realpath(
            os.path.join(self.anaProgram.scriptYolu, "Prg", "FikoDosya")
        )

    @property
    def eksenler(self) -> IEksenler:
        return IEksenler(obj=self.catNesne.AxisSystems, sahip=self)

    @property
    def yogunluk(self) -> float:
        return self.catNesne.Density

    @yogunluk.setter
    def yogunluk(self, value: float):
        self.catNesne.Density = value

    @property
    def bodyler(self):
        return IBodyler(self.catNesne.Bodies, self)

    @property
    def hibridBodyler(self) -> IHibridBodyler:
        return IHibridBodyler(self.catNesne.HybridBodies, self)

    @property
    def parametreler(self) -> IParametreler:
        return IParametreler(self.catNesne.Parameters, self)

    def guncelle(self):
        self.catNesne.Update()

    def resim2sketch(self, yol: str) -> IFikomObject:
        if not os.path.exists(yol):
            raise FileExistsError("Dosya Bulunamadı")
        # --->
        __poTraceKlasor: str = os.path.join(
            self.anaProgram.scriptYolu, "prg", "potrace"
        )
        # --->
        img = Image.open(yol)
        __rsmDsy: str = os.path.join(__poTraceKlasor, "cevir.bmp")
        img.save(__rsmDsy, "bmp")
        # --->
        Popen_arg = os.path.join(__poTraceKlasor, "process.bat")
        # self.anaProgram.fikoSistem.dosyaSistemi.programCalistirBekle(Popen_arg)
        from subprocess import Popen

        p = Popen(
            Popen_arg, cwd=os.path.join(self.anaProgram.scriptYolu, "prg", "potrace")
        )
        stdout, stderr = p.communicate()
        # --->
        __dxfYol: str = os.path.join(__poTraceKlasor, "ksys.dxf")
        __dxfDoc = self.anaProgram.dokumanlar.ac(__dxfYol).anaProgram.aktifDokuman
        sleep(0)
        # __dxfDoc = self.anaProgram.dokumanlar.ac(__dxfYol)
        # __dxfDoc = self.anaProgram.aktifDokuman.catNesne
        # __sktch=__dxfDoc.Sheets.item("Model").views.Item("Main View")

        __dxfDoc.secililer.ara("Name='Main View';all")
        sleep(0)
        __dxfDoc.secililer.kopyala()
        # self.sahip.secililer.ekle(__dxfDoc.secililer.item(0).nesne.catNesne)
        # --->
        bodyer = self.catNesne.hybridBodies
        fikoBody = bodyer.add()
        fikoBody.name = "FikoDesen"
        # --->
        self.sahip.secililer.temizle()
        self.sahip.secililer.ekle(fikoBody)
        self.sahip.secililer.yapistir()
        __dxfDoc.kapat()

    def geometricSetEkle(self, ismi=None):
        bodyer = self.catNesne.hybridBodies
        fikoBody = bodyer.add()
        if ismi:
            fikoBody.name = ismi
        return IFikomObject(fikoBody, self)

    def olcuAl(self, eksen, body):
        part = self
        scriptDosya = os.path.join(self.__dosya, "FikoMfg0Eksen.FikoDll")

        hsf = part.catNesne.HybridShapeFactory

        bodyer = part.catNesne.hybridBodies
        try:
            fikoBody = bodyer.item("FikoMantasyon")
            part.catNesne.InWorkObject = fikoBody
        except:
            fikoBody = bodyer.add()
            fikoBody.name = "FikoMantasyon"

        bodyReferans = [body]

        dndr: List = []
        for rfrns in bodyReferans:
            factory = part.catNesne.GetCustomerFactory("InstanceFactory")

            factory.BeginInstanceFactory("Fiko0Eksen", scriptDosya)

            factory.BeginInstantiate()
            factory.PutInputData("ParcaBody", rfrns)

            referansXY = part.catNesne.CreateReferenceFromBRepName(
                f"FSur:(Face:(Brp:({eksen.ismi};1);None:();Cf11:());WithTemporaryBody;WithoutBuildError;WithInitialFeatureSupport;MonoFond;MFBRepVersion_CXR15",
                None,
            )

            factory.PutInputData("XY", referansXY)

            referansYZ = part.catNesne.CreateReferenceFromBRepName(
                f"FSur:(Face:(Brp:({eksen.ismi};2);None:();Cf11:());WithTemporaryBody;WithoutBuildError;WithInitialFeatureSupport;MonoFond;MFBRepVersion_CXR15",
                None,
            )

            factory.PutInputData("YZ", referansYZ)

            referansXZ = part.catNesne.CreateReferenceFromBRepName(
                f"FSur:(Face:(Brp:({eksen.ismi};3);None:();Cf11:());WithTemporaryBody;WithoutBuildError;WithInitialFeatureSupport;MonoFond;MFBRepVersion_CXR15",
                None,
            )

            factory.PutInputData("ZX", referansXZ)

            Instance = factory.Instantiate()

            factory.EndInstantiate()
            factory.EndInstanceFactory()

            # Instance.GetParameter("O.X").value = yonler.merkez.X
            # Instance.GetParameter("O.Y").value = yonler.merkez.Y
            # Instance.GetParameter("O.Z").value = yonler.merkez.Z

            # Instance.GetParameter("X.X").value = yonler.x.X
            # Instance.GetParameter("X.Y").value = yonler.x.Y
            # Instance.GetParameter("X.Z").value = yonler.x.Z

            # Instance.GetParameter("Y.X").value = yonler.y.X
            # Instance.GetParameter("Y.Y").value = yonler.y.Y
            # Instance.GetParameter("Y.Z").value = yonler.y.Z

            # Instance.GetParameter("Z.X").value = yonler.z.X
            # Instance.GetParameter("Z.Y").value = yonler.z.Y
            # Instance.GetParameter("Z.Z").value = yonler.z.Z

            part.guncelle()

            param1 = Instance

            rslt = []
            rslt.append(param1.GetParameter("Xmin").value)
            rslt.append(param1.GetParameter("Xmax").value)
            rslt.append(param1.GetParameter("Ymin").value)
            rslt.append(param1.GetParameter("Ymax").value)
            rslt.append(param1.GetParameter("Zmin").value)
            rslt.append(param1.GetParameter("Zmax").value)

            dndr.append(SifirKonum(*rslt))
        # --->
        Xminlist = []
        Xmaxlist = []
        Yminlist = []
        Ymaxlist = []
        Zminlist = []
        Zmaxlist = []
        for itm in dndr:
            Xminlist.append(abs(itm.Xmin))
            Xmaxlist.append(abs(itm.Xmax))

            Yminlist.append(abs(itm.Ymin))
            Ymaxlist.append(abs(itm.Ymax))

            Zminlist.append(abs(itm.Zmin))
            Zmaxlist.append(abs(itm.Zmax))

        Xmin = max(Xminlist)
        Xmax = max(Xmaxlist)
        Ymin = max(Yminlist)
        Ymax = max(Ymaxlist)
        Zmin = max(Zminlist)
        Zmax = max(Zmaxlist)

        self.__sifirKonum = SifirKonum(Xmin, Xmax, Ymin, Ymax, Zmin, Zmax)
        return self.__sifirKonum


import IPartDokuman


"""

Dim drawingDocument1 As DrawingDocument
Set drawingDocument1 = CATIA.ActiveDocument

Dim selection1 As Selection
Set selection1 = drawingDocument1.Selection

selection1.Clear

Dim drawingSheets1 As DrawingSheets
Set drawingSheets1 = drawingDocument1.Sheets

Dim drawingSheet1 As DrawingSheet
Set drawingSheet1 = drawingSheets1.Item("Model")

Dim drawingViews1 As DrawingViews
Set drawingViews1 = drawingSheet1.Views

Dim drawingView1 As DrawingView
Set drawingView1 = drawingViews1.Item("Main View")

selection1.Add drawingView1

selection1.Copy

Dim specsAndGeomWindow1 As SpecsAndGeomWindow
Set specsAndGeomWindow1 = CATIA.ActiveWindow

Dim viewer3D1 As Viewer3D
Set viewer3D1 = specsAndGeomWindow1.ActiveViewer

Dim viewpoint3D1 As Viewpoint3D
Set viewpoint3D1 = viewer3D1.Viewpoint3D

Dim partDocument1 As PartDocument
Set partDocument1 = CATIA.ActiveDocument

Dim part1 As Part
Set part1 = partDocument1.Part

part1.Update

"""
