# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.

from typing import TYPE_CHECKING

from Charon.VirtualFile import VirtualFile

from UM.Mesh.MeshReader import MeshReader
from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase
from UM.PluginRegistry import PluginRegistry

if TYPE_CHECKING:
    from cura.Scene.CuraSceneNode import CuraSceneNode


class UFPReader(MeshReader):

    def __init__(self) -> None:
        super().__init__()

        MimeTypeDatabase.addMimeType(
            MimeType(
                name = "application/x-ufp",
                comment = "Ultimaker Format Package",
                suffixes = ["ufp"]
            )
        )
        self._supported_extensions = [".ufp"]

    def _read(self, file_name: str) -> "CuraSceneNode":
        # Open the file
        archive = VirtualFile()
        archive.open(file_name)
        # Get the gcode data from the file
        gcode_data = archive.getData("/3D/model.gcode")
        # Convert the bytes stream to string
        gcode_stream = gcode_data["/3D/model.gcode"].decode("utf-8")

        # Open the GCodeReader to parse the data
        gcode_reader = PluginRegistry.getInstance().getPluginObject("GCodeReader")  # type: ignore
        gcode_reader.preReadFromStream(gcode_stream)  # type: ignore
        return gcode_reader.readFromStream(gcode_stream, file_name)  # type: ignore
