use axum::Json;
use axum::extract::State;
use serde::{Deserialize, Serialize};
use sl_types::map::RegionName;
use crate::auth::CurrentUser;
use crate::error::Error;
use crate::state::AppState;
#[derive(Debug, Deserialize)]
pub struct LookupRequest {
pub region_name: String,
}
#[derive(Debug, Serialize)]
pub struct LookupResponse {
pub x: u32,
pub y: u32,
}
pub async fn lookup(
_user: CurrentUser,
State(state): State<AppState>,
Json(req): Json<LookupRequest>,
) -> Result<Json<LookupResponse>, Error> {
let region_name = RegionName::try_new(req.region_name)
.map_err(|e| Error::BadRequest(format!("invalid region name: {e}")))?;
let mut region_cache = state.region_cache.lock().await;
let coords = region_cache.get_grid_coordinates(®ion_name).await?;
drop(region_cache);
let coords = coords
.ok_or_else(|| Error::NotFound(format!("no region found with name `{region_name}`")))?;
Ok(Json(LookupResponse {
x: coords.x(),
y: coords.y(),
}))
}