from sqlalchemy import Column, String, Boolean, DateTime, func, ForeignKey
from sqlalchemy.orm import relationship
from app.models.base import BaseModel


class User(BaseModel):
    __tablename__ = "users"

    name = Column(String(255), nullable=False)
    is_active = Column(Boolean, default=True)
    phone_number = Column(String(255), nullable=True)
    nip = Column(String(255), unique=True, nullable=False)
    pin = Column(
        String(255),
        ForeignKey("fingerspot_users.pin", ondelete="SET NULL"),
        unique=True,
        nullable=True,
    )
    fingerspot = relationship("FingerspotUser", foreign_keys=[pin], lazy="joined")
    image_path = Column(String(255), nullable=True)
    sign_path = Column(String(255), nullable=True)
    role_id = Column(
        String(36), ForeignKey("roles.id", ondelete="SET NULL"), nullable=True
    )
    role = relationship("Role", foreign_keys=[role_id], lazy="joined")
    unit_id = Column(
        String(36), ForeignKey("units.id", ondelete="SET NULL"), nullable=True
    )
    unit = relationship("Unit", foreign_keys=[unit_id], lazy="joined")
    password = Column(String(255), nullable=False)
    remember_token = Column(String(100), nullable=True)

    def permissions(self):
        """
        Return permissions like Laravel allPermissions()
        """
        if not self.role:
            return []

        result = []

        for pr in self.role.permissions:
            result.append(
                {
                    "subject": pr.permission.subject,
                    "name": pr.permission.name,
                    "actions": pr.actions,
                }
            )

        return result
