using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;

namespace JobTrackerApi.Models
{
    public class Correspondence
    {
        public int Id { get; set; }
        public int JobApplicationId { get; set; }

        [JsonIgnore]
        public JobApplication JobApplication { get; set; } = null!;
        public string From { get; set; } = ""; // "Me" or "Company"
        public string? Direction { get; set; } // inbound, outbound, internal, unknown
        public string? Subject { get; set; }
        public string? Channel { get; set; } // e.g. Email, Call, Note
        public string? ExternalMessageId { get; set; }
        public string? ExternalThreadId { get; set; }
        public string? ExternalFrom { get; set; }
        public string? ExternalTo { get; set; }
        public string? ExternalLabelsJson { get; set; }
        public string? AttachmentMetadataJson { get; set; }
        // Provider discriminator: "gmail" | "microsoft" | "imap" | "manual". Set at the write
        // site (import controller or the manual-entry endpoint), not inferred from other fields,
        // so it stays correct even for hand-entered rows that happen to carry external-looking data.
        public string? Provider { get; set; }
        public string Content { get; set; } = "";
        public DateTime Date { get; set; } = DateTime.Now;

        [JsonIgnore]
        public IReadOnlyList<string> ExternalLabels => string.IsNullOrWhiteSpace(ExternalLabelsJson)
            ? Array.Empty<string>()
            : (System.Text.Json.JsonSerializer.Deserialize<List<string>>(ExternalLabelsJson) ?? new List<string>());

        [JsonIgnore]
        public IReadOnlyList<CorrespondenceAttachmentMetadata> AttachmentMetadata => string.IsNullOrWhiteSpace(AttachmentMetadataJson)
            ? Array.Empty<CorrespondenceAttachmentMetadata>()
            : (System.Text.Json.JsonSerializer.Deserialize<List<CorrespondenceAttachmentMetadata>>(AttachmentMetadataJson) ?? new List<CorrespondenceAttachmentMetadata>());
    }

    public sealed class CorrespondenceAttachmentMetadata
    {
        public string? FileName { get; set; }
        public string? MimeType { get; set; }
        public long? SizeBytes { get; set; }
        public string? GmailAttachmentId { get; set; }
        public bool Inline { get; set; }
    }
}
