using PowderCoating.Application.DTOs.Import;
namespace PowderCoating.Application.Interfaces;
///
/// Service for bulk importing data via CSV files.
/// Supports customers, catalog items, and inventory items.
///
public interface ICsvImportService
{
///
/// Generate a CSV template file for customer imports.
///
/// CSV file content as byte array
byte[] GenerateCustomerTemplate();
///
/// Generate a CSV template file for catalog item imports.
///
/// CSV file content as byte array
byte[] GenerateCatalogItemTemplate();
///
/// Generate a CSV template file for inventory item imports.
///
/// CSV file content as byte array
byte[] GenerateInventoryItemTemplate();
///
/// Import customers from a CSV stream.
///
/// CSV file stream
/// Company ID for multi-tenancy
/// Import result with success/error counts
Task ImportCustomersAsync(Stream csvStream, int companyId);
///
/// Import catalog items from a CSV stream.
/// Creates categories on-the-fly if they don't exist.
///
/// CSV file stream
/// Company ID for multi-tenancy
/// Optional revenue account to assign to all imported items
/// Optional COGS account to assign to all imported items
/// Import result with success/error counts
Task ImportCatalogItemsAsync(Stream csvStream, int companyId, int? revenueAccountId = null, int? cogsAccountId = null);
///
/// Import inventory items from a CSV stream.
///
/// CSV file stream
/// Company ID for multi-tenancy
/// Optional inventory asset account to assign to all imported items
/// Optional COGS account to assign to all imported items
/// Import result with success/error counts
Task ImportInventoryItemsAsync(Stream csvStream, int companyId, int? inventoryAccountId = null, int? cogsAccountId = null);
///
/// Generate a CSV template file for quote imports.
///
/// CSV file content as byte array
byte[] GenerateQuoteTemplate();
///
/// Import quotes from a CSV stream.
///
/// CSV file stream
/// Company ID for multi-tenancy
/// Import result with success/error counts
Task ImportQuotesAsync(Stream csvStream, int companyId);
///
/// Generate a CSV template file for job imports.
///
/// CSV file content as byte array
byte[] GenerateJobTemplate();
///
/// Import jobs from a CSV stream.
///
/// CSV file stream
/// Company ID for multi-tenancy
/// Import result with success/error counts
Task ImportJobsAsync(Stream csvStream, int companyId);
///
/// Generate a CSV template file for appointment imports.
///
/// CSV file content as byte array
byte[] GenerateAppointmentTemplate();
///
/// Import appointments from a CSV stream.
///
/// CSV file stream
/// Company ID for multi-tenancy
/// Import result with success/error counts
Task ImportAppointmentsAsync(Stream csvStream, int companyId);
///
/// Generate a CSV template file for equipment imports.
///
/// CSV file content as byte array
byte[] GenerateEquipmentTemplate();
///
/// Import equipment from a CSV stream.
///
/// CSV file stream
/// Company ID for multi-tenancy
/// Import result with success/error counts
Task ImportEquipmentAsync(Stream csvStream, int companyId);
///
/// Generate a CSV template file for maintenance record imports.
///
/// CSV file content as byte array
byte[] GenerateMaintenanceTemplate();
///
/// Import maintenance records from a CSV stream.
///
/// CSV file stream
/// Company ID for multi-tenancy
/// Import result with success/error counts
Task ImportMaintenanceAsync(Stream csvStream, int companyId);
///
/// Generate a CSV template file for vendor imports.
///
byte[] GenerateVendorTemplate();
///
/// Import vendors from a CSV stream.
/// Updates existing vendors matched by CompanyName; creates new ones otherwise.
///
Task ImportVendorsAsync(Stream csvStream, int companyId);
///
/// Generate a CSV template file for prep service imports.
///
byte[] GeneratePrepServiceTemplate();
///
/// Import prep services from a CSV stream.
/// Updates existing services matched by ServiceName; creates new ones otherwise.
///
Task ImportPrepServicesAsync(Stream csvStream, int companyId);
///
/// Generate a CSV template file for expense imports.
///
byte[] GenerateExpenseTemplate();
///
/// Import expenses from a CSV stream.
/// ExpenseAccountNumber and PaymentAccountNumber are resolved by Account.AccountNumber.
/// VendorName and JobNumber are optional lookups. ExpenseNumber is auto-generated when blank.
///
Task ImportExpensesAsync(Stream csvStream, int companyId);
///
/// Generate a CSV template file for Chart of Accounts imports.
///
byte[] GenerateChartOfAccountsTemplate();
///
/// Import Chart of Accounts entries from a CSV stream.
/// Existing accounts matched by AccountNumber are updated; new ones are created.
/// System accounts (IsSystem=true) are never modified by import.
///
Task ImportChartOfAccountsAsync(Stream csvStream, int companyId);
///
/// Generate a CSV template file for invoice imports with headers matching the native export.
///
byte[] GenerateInvoiceTemplate();
///
/// Import invoice headers from a CSV stream. Customers are resolved by CustomerEmail then
/// CustomerName. Duplicate detection uses InvoiceNumber as the unique key. Existing invoices
/// are updated; new ones are created. Line items are not part of the CSV format.
///
Task ImportInvoicesAsync(Stream csvStream, int companyId);
/// Generate a CSV template file for payment imports.
byte[] GeneratePaymentTemplate();
///
/// Import payment records from a CSV stream. Invoices are resolved by InvoiceNumber.
/// Duplicates are detected by InvoiceNumber + PaymentDate + Amount and skipped.
///
Task ImportPaymentsAsync(Stream csvStream, int companyId);
/// Generate a CSV template file for purchase order imports.
byte[] GeneratePurchaseOrderTemplate();
///
/// Import purchase order headers from a CSV stream. Vendors are resolved by company name.
/// Existing POs matched by PoNumber are updated; new ones are created.
///
Task ImportPurchaseOrdersAsync(Stream csvStream, int companyId);
}