package library.routes;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import io.javalin.config.JavalinConfig;
import io.javalin.http.Context;
import library.domain.Member;
import library.domain.Roles;
import library.dto.MemberView;
import library.dto.NewMember;
import library.service.MemberService;

/**
 * HTTP in, HTTP out for /members.
 *
 * Responses use MemberView, never Member: Member carries the password hash.
 */
public class MemberRoutes {

	private final MemberService service;

	public MemberRoutes(MemberService service) {
		this.service = service;
	}

	public void register(JavalinConfig config) {
		config.routes.post("/members", ctx -> create(ctx)); // register: public
		config.routes.get("/members/me", ctx -> me(ctx));
		config.routes.get("/members", ctx -> list(ctx)); // librarians only
	}

	// POST /members { "username": "...", "password": "..." } → 201
	private void create(Context ctx) throws SQLException {
		NewMember body = ctx.bodyAsClass(NewMember.class);
		try {
			Member created = service.register(body);
			ctx.status(201);
			ctx.header("Location", "/members/" + created.memberId());
			ctx.json(MemberView.from(created));
		} catch (IllegalArgumentException e) {
			ctx.status(400).result(e.getMessage());
		}
	}

	// GET /members/me → who am I logged in as?
	private void me(Context ctx) {
		ctx.json(MemberView.from(Auth.currentMember(ctx)));
	}

	// GET /members
	private void list(Context ctx) throws SQLException {
		Auth.requireRole(ctx, Roles.LIBRARIAN);
		List<MemberView> views = new ArrayList<>();
		for (Member m : service.findAll()) {
			views.add(MemberView.from(m));
		}
		ctx.json(views);
	}
}
