package com.example.tampopotest.web;
import com.example.tampopotest.service.InMemoryStore;
import com.example.tampopotest.service.InMemoryStore.User;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.LinkedHashMap;
import java.util.Map;
@Path("/users/{user-id}/friends")
@Produces(MediaType.APPLICATION_JSON)
public class UserFriendsResource {
private final InMemoryStore store = InMemoryStore.get();
// GET /users/{user-id}/friends
@GET
public Response listPairs(@PathParam("user-id") String userId,
@QueryParam("token") String token) {
if (token == null) return Response.status(Response.Status.BAD_REQUEST).build();
User u = store.getUser(userId);
if (u == null) return Response.status(Response.Status.NOT_FOUND).build();
if (!store.verifyToken(userId, token)) return Response.status(403).build();
Map<Integer, Map<String, String>> map = store.listFriendPairsOf(userId);
// OpenAPIではpid1: {...} のような形を要求。キーをそのまま文字列にする
Map<String, Object> res = new LinkedHashMap<>();
for (Map.Entry<Integer, Map<String, String>> e : map.entrySet()) {
res.put("pid" + e.getKey(), e.getValue());
}
return Response.ok(res).build();
}
// GET /users/{user-id}/friends/{pair-id}
@GET
@Path("/{pair-id}")
public Response getOpponent(@PathParam("user-id") String userId,
@PathParam("pair-id") int pairId,
@QueryParam("token") String token) {
if (token == null) return Response.status(Response.Status.BAD_REQUEST).build();
if (!store.verifyToken(userId, token)) return Response.status(403).build();
String other = store.friendOpponent(userId, pairId);
if (other == null) return Response.status(Response.Status.NOT_FOUND).build();
return Response.ok(Map.of("user-id", other)).build();
}
// DELETE /users/{user-id}/friends/{pair-id}
@DELETE
@Path("/{pair-id}")
public Response deletePair(@PathParam("user-id") String userId,
@PathParam("pair-id") int pairId,
@QueryParam("token") String token) {
if (token == null) return Response.status(Response.Status.BAD_REQUEST).build();
if (!store.verifyToken(userId, token)) return Response.status(403).build();
boolean ok = store.deleteFriendPair(pairId);
if (!ok) return Response.status(Response.Status.NOT_FOUND).build();
return Response.ok().build();
}
}