from datetime import datetime, timedelta
from typing import Optional

from pydantic import Field

from src.apps.base.schemas.common import BaseSchema


class SessionBase(BaseSchema):
    ip_addr: Optional[str] = Field(default=None, description="IP address of request")
    token: Optional[str] = Field(default=None, description="Session JWT")
    device: Optional[str] = Field(default=None, description="Accessing device")
    platform: Optional[str] = Field(default=None, description="Accessing device's platform")
    os: Optional[str] = Field(default=None, description="Accessing device's Operating System")
    user_agent: Optional[str] = Field(default=None, description="Request User-Agent string")
    expires_at: Optional[datetime] = Field(default=None, description="Expiry Date and time of session")
    refreshed_at: Optional[datetime] = Field(default=None, description="Refresh Date and time of session")
    persist: Optional[bool] = Field(
        default=None, description="If the session is persisted, it will be active until next 7 days"
    )


class SessionSchema(SessionBase):
    id: int = Field(description="Id of Line Item resource")
    session_id: Optional[str] = Field(description="Unique id of session typically has the form 'se_xxx' ")


class SessionCreate(SessionBase):
    session_id: Optional[str] = Field(default=None, description="Unique id of session typically has the form 'se_xxx' ")
    ip_addr: Optional[str] = Field(default=None, description="IP address of request")
    token: str = Field(description="Session JWT")
    expires_at: datetime = Field(description="Expiry Date and time of session")
    user_id: int = Field(description="ID of the user to whom this session belongs")
    device: Optional[str] = Field(default=None, description="user login device")
    location: Optional[str] = Field(default=None, description=" User login location")
    referer: Optional[str] = Field(default=None, description="URL of the previous webpage")

    # New fields
    city: Optional[str] = Field(default=None)
    region: Optional[str] = Field(default=None)
    country: Optional[str] = Field(default=None)
    loc: Optional[str] = Field(default=None)
    postal: Optional[str] = Field(default=None)
    timezone: Optional[str] = Field(default=None)
    browser: Optional[str] = Field(default=None)
    is_mobile: Optional[bool] = Field(default=None)
    os: Optional[str] = Field(default=None, description="Operating system of the device")

    refreshed_at: Optional[datetime] = Field(default=None, description="Time when session was last refreshed")
    created_at: Optional[datetime] = Field(default=None, description="Time when session was created")
