package com.saas.tenant.service;

import com.saas.shared.core.ErrorLogger;
import com.saas.shared.core.TenantContext;
import com.saas.tenant.entity.TenantErrorLog;
import com.saas.tenant.repository.TenantErrorLogRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Slf4j
public class TenantErrorLogService implements ErrorLogger {

    private final TenantErrorLogRepository errorLogRepository;

    @Override
    @Transactional(transactionManager = "tenantTransactionManager", propagation = Propagation.REQUIRES_NEW)
    public void logError(String errorCode, String message, String stackTrace, String path, String method, String source,
            String user) {
        if (!TenantContext.isTenantSet()) {
            return; // Don't log if no tenant context (e.g. admin error or public endpoint)
        }

        try {
            TenantErrorLog logEntry = TenantErrorLog.builder()
                    .errorCode(errorCode)
                    .errorMessage(message)
                    .stackTrace(stackTrace)
                    .path(path)
                    .method(method)
                    .source(source)
                    .userPrincipal(user)
                    .build();

            errorLogRepository.save(logEntry);
            log.info("Saved error log to tenant DB: {}", message);
        } catch (Exception e) {
            log.error("Failed to save tenant error log", e);
        }
    }

    @Transactional(transactionManager = "tenantTransactionManager")
    public void logError(TenantErrorLog errorLog) {
        logError(errorLog.getErrorCode(), errorLog.getErrorMessage(), errorLog.getStackTrace(),
                errorLog.getPath(), errorLog.getMethod(), errorLog.getSource(), errorLog.getUserPrincipal());
    }
}
