using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Persistence.Models.State;
using Microsoft.EntityFrameworkCore;
namespace Cleanuparr.Persistence.Models.Events;
///
/// Represents an event in the system
///
[Index(nameof(Timestamp), IsDescending = [true])]
[Index(nameof(EventType))]
[Index(nameof(Severity))]
[Index(nameof(Message))]
[Index(nameof(StrikeId))]
[Index(nameof(JobRunId))]
[Index(nameof(InstanceType))]
[Index(nameof(DownloadClientType))]
[Index(nameof(CycleId))]
public class AppEvent : IEvent
{
[Key]
public Guid Id { get; set; } = Guid.CreateVersion7();
public DateTime Timestamp { get; set; } = DateTime.UtcNow;
[Required]
public EventType EventType { get; set; }
[Required]
[MaxLength(1000)]
public string Message { get; set; } = string.Empty;
///
public string? Data { get; set; }
[Required]
public required EventSeverity Severity { get; set; }
///
/// Optional correlation ID to link related events
///
public Guid? TrackingId { get; set; }
public Guid? StrikeId { get; set; }
[JsonIgnore]
public Strike? Strike { get; set; }
public Guid? JobRunId { get; set; }
[JsonIgnore]
public JobRun? JobRun { get; set; }
///
/// The type of arr instance that generated this event (e.g., Sonarr, Radarr)
///
public InstanceType? InstanceType { get; set; }
///
/// The URL of the arr instance that generated this event
///
[MaxLength(500)]
public string? InstanceUrl { get; set; }
///
/// The type of download client involved in this event
///
public DownloadClientTypeName? DownloadClientType { get; set; }
///
/// The name of the download client involved in this event
///
[MaxLength(200)]
public string? DownloadClientName { get; set; }
///
/// Status of the search command (only set for SearchTriggered events)
///
public SearchCommandStatus? SearchStatus { get; set; }
///
/// When the search command completed (only set for SearchTriggered events)
///
public DateTime? CompletedAt { get; set; }
///
/// The Seeker cycle ID associated with this event (only set for SearchTriggered events)
///
public Guid? CycleId { get; set; }
public bool IsDryRun { get; set; }
}