import dataclasses

import cv2
import numpy as np
from PySide6.QtCore import QPoint
from PySide6.QtGui import QPolygon


@dataclasses.dataclass
class BoundingBox:
    xstart: float | int
    ystart: float | int
    xend: float | int = -1.
    yend: float | int = -1.

    def to_numpy(self):
        return np.array([self.xstart, self.ystart, self.xend, self.yend])

    def scale(self, sx, sy):
        return BoundingBox(
            xstart=self.xstart * sx,
            ystart=self.ystart * sy,
            xend=self.xend * sx,
            yend=self.yend * sy
        )

    def to_int(self):
        return BoundingBox(
            xstart=int(self.xstart),
            ystart=int(self.ystart),
            xend=int(self.xend),
            yend=int(self.yend)
        )

@dataclasses.dataclass
class Polygon:
    points: list = dataclasses.field(default_factory=list)

    def to_numpy(self):
        return np.array(self.points).reshape(-1, 2)

    def to_mask(self, num_rows, num_cols):
        mask = np.zeros((num_rows, num_cols))
        mask = cv2.fillPoly(mask, pts=[self.to_numpy(), ], color=255)
        return mask

    def is_plotable(self):
        return len(self.points) > 3

    def to_qpolygon(self):
        return QPolygon([
            QPoint(x, y) for x, y in self.points
        ])
