"""
B-ASIC Core Operations Module.
TODO: More info.
"""

from b_asic.operation import OperationId, Operation, BasicOperation
from numbers import Number
from typing import final

class Input(Operation):
	"""
	Input operation.
	TODO: More info.
	"""

	# TODO: Implement.
	pass

class Constant(BasicOperation):
	"""
	Constant value operation.
	TODO: More info.
	"""

	def __init__(self, identifier: OperationId, value: Number):
		"""
		Construct a Constant.
		"""
		super().__init__(identifier)
		self._output_ports = [OutputPort()] # TODO: Generate appropriate ID for ports.
		self._parameters["value"] = value

	@final
	def evaluate(self, inputs: list) -> list:
		return [self.param("value")]

class Addition(BasicOperation):
	"""
	Binary addition operation.
	TODO: More info.
	"""

	def __init__(self, identifier: OperationId):
		"""
		Construct an Addition.
		"""
		super().__init__(identifier)
		self._input_ports = [InputPort(), InputPort()] # TODO: Generate appropriate ID for ports.
		self._output_ports = [OutputPort()] # TODO: Generate appropriate ID for ports.

	@final
	def evaluate(self, inputs: list) -> list:
		return [inputs[0] + inputs[1]]


class ConstantMultiplication(BasicOperation):
	"""
	Unary constant multiplication operation.
	TODO: More info.
	"""

	def __init__(self, identifier: OperationId, coefficient: Number):
		"""
		Construct a ConstantMultiplication.
		"""
		super().__init__(identifier)
		self._input_ports = [InputPort()] # TODO: Generate appropriate ID for ports.
		self._output_ports = [OutputPort()] # TODO: Generate appropriate ID for ports.
		self._parameters["coefficient"] = coefficient

	@final
	def evaluate(self, inputs: list) -> list:
		return [inputs[0] * self.param("coefficient")]

# TODO: More operations.