package application.helper;

import domain.dto.response.CustomerPositionStateResponse;
import domain.dto.response.CustomerResponse;
import domain.dto.response.StatusResponse;
import domain.model.BankingProduct;
import domain.model.ErrorCode;
import infrastructure.service.StatusDescriptionResolver;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.core.Response;

import java.util.List;

@ApplicationScoped
public class ResponseHelper {

    private final StatusDescriptionResolver statusDescriptionResolver;

    public ResponseHelper(StatusDescriptionResolver statusDescriptionResolver) {
        this.statusDescriptionResolver = statusDescriptionResolver;
    }

    public Response buildErrorResponse(String errorCodeKey, String requestId) {
        ErrorCode errorCode = statusDescriptionResolver.getCode(errorCodeKey);
        return this.buildErrorResponse(errorCode, requestId);
    }

    /**
     * Construye una respuesta de error estandarizada de forma genérica.
     * @param errorCode Objeto con el código de error interno.
     * @return Un objeto Response estándar de JAX-RS.
     */
    public Response buildErrorResponse(ErrorCode errorCode, String requestId) {

        var statusResponse = StatusResponse.builder()
                .status(errorCode.status())
                .statusCode(errorCode.statusCode())
                .message(errorCode.description())
                .traceId(requestId)
                .build();

        var response = new CustomerResponse(statusResponse);

        int httpStatus = errorCode.getHttpStatusCode();

        return Response.status(httpStatus)
                .entity(response)
                .build();
    }

    /**
     * Construye una respuesta de éxito (200) CON DATOS.
     * @param customerAccounts La lista de productos (el cuerpo de la respuesta).
     * @param successCode El ErrorCode "200" (para los detalles del status).
     * @param requestId El ID de traza.
     * @return Un objeto Response estándar de JAX-RS.
     */
    public Response buildSuccessResponse(List<BankingProduct> customerAccounts, ErrorCode successCode, String requestId) {

        var status = StatusResponse.builder()
                .status(successCode.status())
                .statusCode(successCode.statusCode())
                .message(successCode.description())
                .traceId(requestId)
                .build();

        var accounts = CustomerPositionStateResponse.builder()
                .bankingProducts(customerAccounts)
                .build();

        var response = new CustomerResponse(status, accounts);

        return Response.status(successCode.getHttpStatusCode())
                .entity(response)
                .build();
    }

}