package com.nebula.erp.sales.utility;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@Component
public class CreateLogger {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${logger.api}")
    private String loggerApiUrl;

    @Autowired
    private JwtRequestUtils jwtRequestUtils;

    @Autowired
    private JwtUtils jwtUtils;

    @Autowired
    private HttpServletRequest httpServletRequest;

    // Method to get Authorization Headers
    public HttpHeaders getAuthorizationHeaders() {
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.AUTHORIZATION, httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION));
        return headers;
    }

    // Method to extract token and user id
    public String getUserId() {
        HttpHeaders headers = getAuthorizationHeaders();
        // Extract the JWT token from the Authorization header
        String token = jwtUtils.extractTokenFromHeaders(headers);

        // Get the user id using the token
        String userId = jwtUtils.getUserId(token);
        if (userId == null || userId.isEmpty()) {
            throw new RuntimeException("User ID is missing in the token.");
        }

        return userId;
    }

    // Method to extract token and tenant name
    public String getTenantName() {
        HttpHeaders headers = getAuthorizationHeaders();
        // Extract the JWT token from the Authorization header
        String token = jwtUtils.extractTokenFromHeaders(headers);

        // Get the tenant name using the token
        String tenantName = jwtUtils.getTenantName(token);
        if (tenantName == null || tenantName.isEmpty()) {
            return "";
        }
        return tenantName;
    }

    public String createLogger(String type, String route, String method, String message, String error_type) {

        String userId = getUserId();
        String tenantName = getTenantName();

        String loggerUrl = loggerApiUrl;

        String module = route.startsWith("/") ? route.substring(1) : route;

        // Prepare the payload with the required fields
        Map<String, Object> payload = new HashMap<>();
        payload.put("type", type);
        payload.put("service", "purchase");
        payload.put("module", module);
        payload.put("route", route);
        payload.put("method", method);
        payload.put("user_id", userId);
        payload.put("message", message);
        payload.put("tenant", tenantName);
        payload.put("error_type", error_type);

        HttpHeaders authHeader = jwtRequestUtils.getAuthorizationHeaders();
        HttpEntity<Map<String, Object>> entity = new HttpEntity<>(payload, authHeader);

        try {
            ResponseEntity<Map> loggerApiResponse = restTemplate.exchange(loggerUrl, HttpMethod.POST, entity, Map.class);
            return "";
        } catch (Exception e) {
            throw new RuntimeException("Error sending log: " + e.getMessage());
        }
    }
}
