class HTTPVerbs(str, Enum):
    GET = "GET"
    POST = "POST"
    DELETE = "DELETE"
    PATCH = "PATCH"
    PUT = "PUT"


class BatchRequest(BaseModel):
    id: str
    url: str
    method: HTTPVerbs
    headers: Optional[Dict[str, str]]
    body: Optional[Any]

    @validator("url")
    def validate_url(cls, val: str) -> str:
        if bool(urlparse(val).netloc):
            raise ValueError("Invalid URL, absolute URL's are not allowed")
        if not val.startswith("/"):
            raise ValueError("Invalid URL, relative URL's must start with a leading /")
        return val


class BatchResponse(BaseModel):
    id: str
    status: int
    headers: Optional[Dict[str, str]]
    body: Optional[Any]


class BatchIn(BaseModel):
    requests: List[BatchRequest]

    @validator("requests")
    def validate_requests(cls, val: List[BatchRequest]) -> List[BatchRequest]:
        if len(val) > 20:
            raise ValueError("Only a maximum of 20 batch requests are supported")
        if len(val) != len(set((req.id for req in val))):
            raise ValueError("Batch request id's are not unique")
        return val


class BatchOut(BaseModel):
    responses: List[BatchResponse]