using PowderCoating.Core.Entities;

namespace PowderCoating.Application.Interfaces;

/// <summary>
/// Placeholder return types for operational reports. These will be replaced with proper
/// Application DTOs as each report is migrated from ReportsController in Phase 2/3.
/// </summary>
public record JobCycleTimeReport(List<JobCycleTimeRow> Rows, int Months);
public record JobCycleTimeRow(string StatusName, double AvgDaysInStatus, int JobCount);

public record PowderUsageReport(List<PowderUsageRow> Rows, int Months);
public record PowderUsageRow(string ColorName, string VendorName, decimal TotalLbs, decimal TotalCost);

/// <summary>
/// Read-only service for operational aggregate reports. All methods query the database
/// with AsNoTracking and return pre-shaped objects — no tracked entities are returned.
/// Implemented in Infrastructure; uses ApplicationDbContext directly.
/// </summary>
public interface IOperationalReportService
{
    /// <summary>Returns average time jobs spend in each status over the given lookback period.</summary>
    Task<JobCycleTimeReport> GetJobCycleTimeAsync(int companyId, int months);

    /// <summary>Returns powder usage (lbs and cost) broken down by color and vendor.</summary>
    Task<PowderUsageReport> GetPowderUsageAsync(int companyId, int months);

    /// <summary>
    /// Returns all active (non-deleted, non-voided) bills with their Vendor and non-deleted
    /// Payments navigations loaded. Used by Analytics, ExpensesAp, and AI accounting actions
    /// so those controllers do not need a direct ApplicationDbContext reference.
    /// </summary>
    Task<List<Bill>> GetActiveBillsAsync();

    /// <summary>
    /// Returns all non-deleted direct expenses with their ExpenseAccount navigation loaded.
    /// Used by Analytics, ExpensesAp, and AI accounting actions so those controllers do not
    /// need a direct ApplicationDbContext reference.
    /// </summary>
    Task<List<Expense>> GetAllExpensesAsync();

    /// <summary>
    /// Returns the full job status history log with FromStatus and ToStatus navigations
    /// loaded. Used by Analytics and JobCycleTime so those actions do not need a direct
    /// ApplicationDbContext reference.
    /// </summary>
    Task<List<JobStatusHistory>> GetAllJobStatusHistoryAsync();
}
