from pathlib import Path
from dataclasses import dataclass
from typing import Optional

import rio


@dataclass
class MemberInfo:
    picture_path: Path
    name: str
    position: str
    entry_date: str
    contact_mail: Optional[str]
    contact_steam: Optional[str]


class MemberCard(rio.Component):
    def __init__(self, info: MemberInfo) -> None:
        super().__init__()
        self._info = info
        self.align_y = 0
        self.margin_top = 0
        self.margin_bottom = 2
        self.margin_right = 1

    def build(self) -> rio.Component:
        contact_row = rio.Row()
        content = rio.Column(
                rio.Image(self._info.picture_path, height=9, margin_bottom=1.3, margin_top=0.8),
                rio.Text(self._info.name, margin_bottom=0.4, style=rio.TextStyle(font_weight="bold")),
                rio.Text(self._info.position, margin_bottom=0.4,  style=rio.TextStyle(italic=True)),
                rio.Text(f"Mitglied seit {self._info.entry_date}",  style=rio.TextStyle(italic=True), margin_bottom=0.4),
                contact_row
            )

        # @Todo: Icon alignment broken if only one icon should be shown.
        if self._info.contact_mail:
            contact_row.add(rio.Link(rio.Icon("material/mail"), f"mailto://{self._info.contact_mail}", open_in_new_tab=True, margin_top=1, margin_bottom=1, align_x=0.9))
        if self._info.contact_steam:
            contact_row.add(rio.Link(rio.Icon("custom/steam"), self._info.contact_steam, open_in_new_tab=True, margin_top=1, margin_bottom=1, align_x=0.1))

        if not self._info.contact_steam and not self._info.contact_mail:
            contact_row.add(rio.Text("", margin_top=2))

        return rio.Rectangle(
            content=content,
            fill=self.session.theme.neutral_color,
            corner_radius=self.session.theme.corner_radius_medium,
            shadow_radius=0.5,
            shadow_color=self.session.theme.hud_color,
            shadow_offset_y=0
        )
