using foodmarket.Domain.Common;

namespace foodmarket.Domain.Integrations;

public enum ImportJobStatus
{
    Running = 0,
    Succeeded = 1,
    Failed = 2,
    Cancelled = 3,
}

/// <summary>Запись прогресса фонового импорта (MoySklad: products /
/// counterparties; cleanup: all). Пишется один раз при старте,
/// обновляется в процессе через <c>ImportJobRegistry.SaveAsync</c>,
/// финализируется в <c>finally</c>-блоке RunInBackgroundAsync.
///
/// Tenant-scoped — каждая орга видит только свои джобы. Errors хранятся
/// JSON-массивом строк (jsonb) — для UI достаточно, для разбора достаточно
/// `(SELECT * FROM import_jobs WHERE Id = ?)`.
///
/// Раньше состояние жило в <c>ConcurrentDictionary</c> внутри Singleton
/// сервиса (TD-5): при рестарте процесса вся история импортов терялась.
/// Теперь — БД, прогресс сохраняется через рестарт.</summary>
public class ImportJob : TenantEntity
{
    /// <summary>"products" | "counterparties" | "cleanup-all" | …</summary>
    public string Kind { get; set; } = "";

    public DateTime StartedAt { get; set; } = DateTime.UtcNow;
    public DateTime? FinishedAt { get; set; }
    public ImportJobStatus Status { get; set; } = ImportJobStatus.Running;

    /// <summary>Описание текущей фазы для UI («Загрузка страниц 3/10…»).</summary>
    public string? Stage { get; set; }

    public int Total { get; set; }
    public int Created { get; set; }
    public int Updated { get; set; }
    public int Skipped { get; set; }
    public int Deleted { get; set; }
    public int GroupsCreated { get; set; }

    /// <summary>Финальное сообщение / последняя ошибка для UI.</summary>
    public string? Message { get; set; }

    /// <summary>JSON-массив строк с накопленными ошибками (для разбора).</summary>
    public string ErrorsJson { get; set; } = "[]";
}
