"""Create a list of components from an iterable."""
from __future__ import annotations

from typing import Optional

import pydantic

from pynecone.components.component import Component
from pynecone.components.layout.box import Box
from pynecone.components.tags import CondTag, Tag
from pynecone.var import Var


class Cond(Component):
    """Render one of two components based on a condition."""

    # The cond to determine which component to render.
    cond: Var[bool]

    # The component to render if the cond is true.
    comp1: Component

    # The component to render if the cond is false.
    comp2: Component

    # Whether the cond is within another cond.
    is_nested: bool = False

    @pydantic.validator("cond")
    def validate_cond(cls, cond: Var) -> Var:
        """Validate that the cond is a boolean.

        Args:
            cond: The cond to validate.

        Returns:
            The validated cond.
        """
        assert issubclass(cond.type_, bool), "The var must be a boolean."
        return cond

    @classmethod
    def create(
        cls, cond: Var, comp1: Component, comp2: Optional[Component] = None
    ) -> Cond:
        """Create a conditional component.

        Args:
            cond: The cond to determine which component to render.
            comp1: The component to render if the cond is true.
            comp2: The component to render if the cond is false.

        Returns:
            The conditional component.
        """
        if comp2 is None:
            comp2 = Box.create()
        if isinstance(comp1, Cond):
            comp1.is_nested = True
        if isinstance(comp2, Cond):
            comp2.is_nested = True
        return cls(
            cond=cond,
            comp1=comp1,
            comp2=comp2,
            children=[comp1, comp2],
        )  # type: ignore

    def _render(self) -> Tag:
        return CondTag(
            cond=self.cond,
            true_value=self.comp1.render(),
            false_value=self.comp2.render(),
            is_nested=self.is_nested,
        )