from shapely import wkt as shapely_wkt
from shapely.ops import transform
from pyproj import Transformer
import re

# EPSG codes
WGS84 = "EPSG:4326"
OSGB = "EPSG:27700"  # British National Grid

def buffer_wkt_in_meters(wkt_str: str, buffer_m: int) -> str:
    try:
        geom = shapely_wkt.loads(wkt_str)
    except Exception as e:
        raise ValueError("Invalid WKT") from e

    
    to_osgb = Transformer.from_crs(WGS84, OSGB, always_xy=True).transform
    geom_osgb = transform(to_osgb, geom)

    
    geom_osgb_buf = geom_osgb.buffer(buffer_m, resolution=4, join_style=2)  # 2 == mitre

    
    to_wgs84 = Transformer.from_crs(OSGB, WGS84, always_xy=True).transform
    geom_wgs84_buf = transform(to_wgs84, geom_osgb_buf)

    return geom_wgs84_buf.wkt


def validate_wkt_is_polygon(wkt_string):
    """Validate that WKT string represents a single polygon."""
    if not wkt_string:
        return False, "WKT string is required"
    
    # Basic WKT polygon pattern - starts with POLYGON and has coordinate pairs
    polygon_pattern = r'^POLYGON\s*\(\s*\([^)]+\)\s*\)$'
    
    if not re.match(polygon_pattern, wkt_string.strip(), re.IGNORECASE):
        return False, "WKT must be a single POLYGON geometry"
    
    return True, "Valid polygon WKT"