from typing import Literal from app.client.futabus_client import FutabusClient class LocationService: def __init__(self, client: FutabusClient): self.client = client async def get_city_by_office( self, office_name: str, role: Literal["origin", "dest"] ) -> tuple[int | None, str | None, str | None]: """ Trích xuất thông tin tỉnh (ID, code, name) từ tên văn phòng. Args: office_name (str): Tên văn phòng cần tìm. role (Literal["origin", "dest"]): Loại văn phòng ("origin" hoặc "dest"). Returns: Tuple[int | None, str | None, str | None]: Thông tin tỉnh tương ứng (ID, code, name), hoặc toàn bộ là None nếu không tìm thấy. """ if role not in {"origin", "dest"}: raise ValueError("role must be 'origin' or 'dest'") response = await self.client.get_pickup_points( origin=office_name if role == "origin" else None, dest=office_name if role == "dest" else None, ) key = role for group in response.get(key, []): for office in group.get("group", []): if office.get("name", "").lower() == office_name.lower(): id = ( office.get("provinceId")[0] if isinstance(office.get("provinceId"), tuple) else office.get("provinceId") ) code = office.get("provinceCode") name = office.get("provinceName") return id, code, name return None, None, None async def get_office_id_by_name(self, office_name: str) -> int | None: """ Trích xuất Office ID từ tên văn phòng. Args: office_name (str): Tên văn phòng. Returns: int | None: ID văn phòng nếu tìm thấy, ngược lại None. """ response = await self.client.get_pickup_points(origin=office_name) for group in response.get("origin", []): for office in group.get("group", []): if office.get("name", "").lower() == office_name.lower(): office_id = office.get("officeId") return office_id[0] if isinstance(office_id, tuple) else office_id return None