from datetime import datetime
from uuid import UUID

from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator


class BusinessOnboardingRequest(BaseModel):
    name: str = Field(min_length=2, max_length=200)
    phone: str | None = Field(default=None, max_length=50)
    email: EmailStr | None = None
    address: str | None = Field(default=None, max_length=500)
    city: str | None = Field(default=None, max_length=100)
    state: str | None = Field(default=None, max_length=100)
    country: str = Field(default="Nigeria", min_length=2, max_length=100)
    currency: str = Field(default="NGN", min_length=3, max_length=10)
    default_language: str = Field(default="en", min_length=2, max_length=20)
    main_branch_name: str = Field(min_length=2, max_length=200)

    @field_validator("name", "main_branch_name", "country", "currency", "default_language")
    @classmethod
    def require_text(cls, value: str) -> str:
        value = value.strip()
        if not value:
            raise ValueError("This field cannot be blank.")
        return value

    @field_validator("phone", "email", "address", "city", "state", mode="before")
    @classmethod
    def empty_optional_fields_are_null(cls, value: str | None) -> str | None:
        if isinstance(value, str) and not value.strip():
            return None
        return value


class BusinessResponse(BaseModel):
    id: UUID
    name: str
    phone: str | None
    email: EmailStr | None
    address: str | None
    city: str | None
    state: str | None
    country: str
    currency: str
    default_language: str
    created_at: datetime

    model_config = ConfigDict(from_attributes=True)


class MembershipResponse(BaseModel):
    id: UUID
    role: str
    all_branches: bool
    is_active: bool

    model_config = ConfigDict(from_attributes=True)


class BranchResponse(BaseModel):
    id: UUID
    name: str
    is_main: bool
    is_active: bool

    model_config = ConfigDict(from_attributes=True)


class WorkspaceResponse(BaseModel):
    business: BusinessResponse
    membership: MembershipResponse
    accessible_branches: list[BranchResponse]
    role: str


class BusinessMembershipResponse(BaseModel):
    business: BusinessResponse
    membership: MembershipResponse
    accessible_branches: list[BranchResponse]
    main_branch: BranchResponse | None


class MyBusinessesResponse(BaseModel):
    businesses: list[BusinessMembershipResponse]
