import websockets

class htmlelement:
  def __init__(self, tag, **attributes):
    self.containedelements = []
    self.attributes = attributes
    self.tag = tag
  def contain(self, item: 'htmlelement | str', condition: bool = True):
    if condition:
      self.containedelements.append(item)
    return self
  def __add__(self, element: "htmlelement | str"):
    self.contain(element)
    return self
  def link(self, src):
    linkedElement = htmlelement("a", href=src).contain(self)
    return linkedElement
  def inside(self, element: 'htmlelement | str', **attributes):
    usetest = True
    for attr in attributes:
      if attr == "cond":
        if attributes.pop(attr) == False:
          usetest = False
          print(f"set test {usetest}")
        break
    if usetest:
      if isinstance(element, str):
        element = htmlelement(element, **attributes)
      return element.contain(self)
    else:
      return ""
  def add_attribute(self, **attributes):
    self.attributes = attributes | self.attributes
    return self
  def render(self):
    attrs = ""
    for attribute, value in self.attributes.items():
      attrs += (f" {attribute}='{value}'" if attribute != "c" else f" class='{value}'")
    rendervar = f"<{self.tag}{attrs}>"
    for element in self.containedelements:
      if isinstance(element, htmlelement):
        rendervar += element.render()
      else:
        rendervar += element
    return f"{rendervar}</{self.tag}>"
  def __str__(self) -> str:
    return self.render()

def dictrenderer(element: dict):
  pass
    
class htmldoc:
  def __init__(self, *elements: htmlelement | str) -> None:
    self.elements = []
    self.background = None
    for element in elements:
      self.elements.append(element)
  def __add__(self, htmlelement: htmlelement | str):
    self.elements.append(htmlelement)
    return self
  def addStyle(self, style: str):
    self.elements.insert(0, htmlelement("link", rel="stylesheet", href=style))
  def render(self):
    if self.background is not None:
      self.elements.append(htmlelement("style").contain(f"body {"{"} background-color: {self.background}; {"}"}"))
    render = ""
    for element in self.elements:
      if isinstance(element, htmlelement):
        render += element.render()
      else:
        render+= element
    return render
  def __str__(self) -> str:
    return self.render()

class websocket:
  pass

class headers:
  def __init__(self, headers):
    self.headers: list[tuple[str, str]] = headers
  def items(self):
    return self.headers
  def add_header(self, header: tuple[str, str]) -> None:
    self.headers.append(header)      

class httpReturn:
  def __init__(self, response: str, headers: list[tuple[str, str]], status: int, close=True) -> None:
    self.response = response
    self.headers = headers
    self.status = status
    self.close = close