import os
from helpers.background_console_colors import (
    BackgroundConsoleColors,
)
from usecases.open_freecad_document_use_case import (
    OpenFreeCadDocumentUseCase,
)
from usecases.read_file_system_and_get_instance_model_use_case import (
    ReadFileSystemAndGetInstanceModelUseCase,
)


class FreeCadTest:
    testName: str
    """Class for performing FreeCAD model checks
    """

    def testHelper(self, testResult):
        if isinstance(testResult, bool) is False:
            print(
                BackgroundConsoleColors.WARNING,
                self.testName
                + " expected a value of type Boolean, returned a value of type below ",
            )
            print(testResult)
            return
        if testResult:
            print(BackgroundConsoleColors.OKGREEN, self.testName + "is complete!")
        else:
            print(BackgroundConsoleColors.FAIL, self.testName + " is Error!")
        pass


class FreeCadASPGenerationTestController(FreeCadTest):
    testName: str
    """
    FreeCAD Document Validation Controller
    """

    def __init__(self, testName: str) -> None:
        self.testName = testName
        pass

    def test(
        self,
        assertFn,
        documentPath: str,
        modelName: str,
        model,
        execComposition,
        outPath=os.path.dirname(__file__) + "/out/",
    ):
        try:
            OpenFreeCadDocumentUseCase.call(documentPath).either(
                leftF=lambda _: (
                    execComposition(""),
                    ReadFileSystemAndGetInstanceModelUseCase()
                    .call(model=model, path=outPath.replace("/helpers", "") + modelName)
                    .either(
                        leftF=lambda model: (
                            self.testHelper(
                                assertFn(model),
                            ),
                        ),
                        rightF=lambda error: print(error),
                    ),
                ),
                rightF=lambda error: print(error),
            )
        except Exception as inst:
            print("FreeCadASPGenerationTestController error")
            print(inst)
        pass
