from pydantic import Field, ConfigDict
from datetime import datetime
from typing import List, Optional
from src.apps.base.schemas.common import BaseSchema


class PermissionBase(BaseSchema):
    model_config = ConfigDict(from_attributes=True)
    
    module: Optional[str] = Field(
        default=None,
        description="Name of the module for which this permission is applicable, inclusive of alphanumeric characters only"
    )
    submodule: Optional[str] = Field(
        default=None,
        description="Name of the submodule, inclusive of alphanumeric characters only"
    )
    operation: Optional[str] = Field(
        default=None,
        description="Name of the operation to be performed"
    )
    operation_label: Optional[str] = Field(
        default=None,
        description="Label of the operation to be performed"
    )
    display_order: Optional[int] = Field(default=None, description="Display order of the permission")


class PermissionSchema(PermissionBase):
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(description="Id of permission resource")


# Shared properties
class RoleBase(BaseSchema):
    model_config = ConfigDict(from_attributes=True)
    
    label: Optional[str] = Field(
        default=None,
        description="Label for the role, inclusive of alphanumeric characters only"
    )
    is_default: Optional[bool] = Field(default=None, description="Is this role a default role?")


class RoleSchema(RoleBase):
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(description="Id of role resource")
    slug: Optional[str] = Field(default=None, description="System generated slug for the role")
    created_at: Optional[datetime] = Field(
        default=None,
        description="Created date and time as unix timestamp"
    )
    # created_by: Optional[UserSchema] = Field(description="Creator of this role")
    permissions: Optional[List[PermissionSchema]] = Field(
        default=None,
        description="Permissions assosciated with this role"
    )
    # merchant: Optional[MerchantSchema] = Field(description="Merchant for whom this role is created")


class RoleNoDepsSchema(RoleBase):
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(description="Id of role resource")
    slug: Optional[str] = Field(default=None, description="System generated slug for the role")
    created_at: Optional[datetime] = Field(
        default=None,
        description="Created date and time as unix timestamp"
    )
