# Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654)

from typing import Literal

from pydantic import Field

from .baseinvocation import (BaseInvocation, BaseInvocationOutput,
                             InvocationConfig, InvocationContext)
from .math import FloatOutput, IntOutput

# Pass-through parameter nodes - used by subgraphs

class ParamIntInvocation(BaseInvocation):
    """An integer parameter"""
    #fmt: off
    type: Literal["param_int"] = "param_int"
    a: int = Field(default=0, description="The integer value")
    #fmt: on

    class Config(InvocationConfig):
      schema_extra = {
          "ui": {
              "tags": ["param", "integer"],
              "title": "Integer Parameter"
          },
      }

    def invoke(self, context: InvocationContext) -> IntOutput:
        return IntOutput(a=self.a)

class ParamFloatInvocation(BaseInvocation):
    """A float parameter"""
    #fmt: off
    type: Literal["param_float"] = "param_float"
    param: float = Field(default=0.0, description="The float value")
    #fmt: on

    class Config(InvocationConfig):
      schema_extra = {
          "ui": {
              "tags": ["param", "float"],
              "title": "Float Parameter"
          },
      }

    def invoke(self, context: InvocationContext) -> FloatOutput:
        return FloatOutput(param=self.param)

class StringOutput(BaseInvocationOutput):
    """A string output"""
    type: Literal["string_output"] = "string_output"
    text: str = Field(default=None, description="The output string")


class ParamStringInvocation(BaseInvocation):
    """A string parameter"""
    type: Literal['param_string'] = 'param_string'
    text: str = Field(default='', description='The string value')

    class Config(InvocationConfig):
      schema_extra = {
          "ui": {
              "tags": ["param", "string"],
              "title": "String Parameter"
          },
      }

    def invoke(self, context: InvocationContext) -> StringOutput:
        return StringOutput(text=self.text)
    