AnalyticsServiceImpl.java

package com.smartsupplypro.inventory.service.impl;

import java.time.LocalDate;
import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.smartsupplypro.inventory.dto.FinancialSummaryDTO;
import com.smartsupplypro.inventory.dto.ItemUpdateFrequencyDTO;
import com.smartsupplypro.inventory.dto.LowStockItemDTO;
import com.smartsupplypro.inventory.dto.MonthlyStockMovementDTO;
import com.smartsupplypro.inventory.dto.PriceTrendDTO;
import com.smartsupplypro.inventory.dto.StockPerSupplierDTO;
import com.smartsupplypro.inventory.dto.StockUpdateFilterDTO;
import com.smartsupplypro.inventory.dto.StockUpdateResultDTO;
import com.smartsupplypro.inventory.dto.StockValueOverTimeDTO;
import com.smartsupplypro.inventory.service.AnalyticsService;
import com.smartsupplypro.inventory.service.impl.analytics.FinancialAnalyticsService;
import com.smartsupplypro.inventory.service.impl.analytics.StockAnalyticsService;

import lombok.RequiredArgsConstructor;

/**
 * Analytics service facade delegating to specialized analytics implementations.
 *
 * <p><strong>Purpose</strong>:
 * Provides analytics functionality by delegating to focused, domain-specific service implementations.
 *
 * <p><strong>Delegation Strategy</strong>:
 * <ul>
 *   <li>{@link StockAnalyticsService} - Stock metrics, trends, and low stock alerts</li>
 *   <li>{@link FinancialAnalyticsService} - WAC-based financial summaries</li>
 * </ul>
 *
 * <p><strong>Design Rationale</strong>:
 * The original monolithic analytics service (733 lines) was split into specialized services
 * (200-300 lines each) for better maintainability, testability, and single responsibility.
 * This facade provides the original {@link AnalyticsService} interface by delegating to
 * these focused implementations.
 *
 * @author Smart Supply Pro Development Team
 * @version 2.0.0
 * @since 1.0.0
 * @see StockAnalyticsService
 * @see FinancialAnalyticsService
 */
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class AnalyticsServiceImpl implements AnalyticsService {

    private final StockAnalyticsService stockAnalytics;
    private final FinancialAnalyticsService financialAnalytics;

    @Override
    public List<StockValueOverTimeDTO> getTotalStockValueOverTime(LocalDate startDate,
                                                                  LocalDate endDate,
                                                                  String supplierId) {
        return stockAnalytics.getTotalStockValueOverTime(startDate, endDate, supplierId);
    }

    @Override
    public List<StockPerSupplierDTO> getTotalStockPerSupplier() {
        return stockAnalytics.getTotalStockPerSupplier();
    }

    @Override
    public List<ItemUpdateFrequencyDTO> getItemUpdateFrequency(String supplierId) {
        return stockAnalytics.getItemUpdateFrequency(supplierId);
    }

    @Override
    public List<LowStockItemDTO> getItemsBelowMinimumStock(String supplierId) {
        return stockAnalytics.getItemsBelowMinimumStock(supplierId);
    }

    @Override
    public List<MonthlyStockMovementDTO> getMonthlyStockMovement(LocalDate startDate,
                                                                 LocalDate endDate,
                                                                 String supplierId) {
        return stockAnalytics.getMonthlyStockMovement(startDate, endDate, supplierId);
    }

    @Override
    @Transactional(readOnly = true)
    public long lowStockCount() {
        return stockAnalytics.lowStockCount();
    }

    @Override
    public List<StockUpdateResultDTO> getFilteredStockUpdates(StockUpdateFilterDTO filter) {
        return stockAnalytics.getFilteredStockUpdates(filter);
    }

    @Override
    public List<PriceTrendDTO> getPriceTrend(String itemId, String supplierId, LocalDate start, LocalDate end) {
        return stockAnalytics.getPriceTrend(itemId, supplierId, start, end);
    }

    @Override
    public FinancialSummaryDTO getFinancialSummaryWAC(LocalDate from, LocalDate to, String supplierId) {
        return financialAnalytics.getFinancialSummaryWAC(from, to, supplierId);
    }
}