namespace JobTrackerApi.Models;

public sealed class StructuredCvProfile
{
    public string Version { get; set; } = "1";
    public StructuredCvMetadata Metadata { get; set; } = new();
    public StructuredCvContact Contact { get; set; } = new();
    public List<string> Summary { get; set; } = new();
    public List<StructuredCvJob> Jobs { get; set; } = new();
    public List<StructuredCvEducation> Education { get; set; } = new();
    public List<StructuredCvCertification> Certifications { get; set; } = new();
    public List<StructuredCvProject> Projects { get; set; } = new();
    public List<string> Skills { get; set; } = new();
    public List<StructuredCvLanguage> Languages { get; set; } = new();
    public List<string> Interests { get; set; } = new();
    public List<string> Awards { get; set; } = new();
    public List<string> Publications { get; set; } = new();
    public List<string> Organisations { get; set; } = new();
    public List<string> References { get; set; } = new();
    public List<StructuredCvOtherSection> OtherSections { get; set; } = new();
    public List<StructuredCvSection> Sections { get; set; } = new();
}

public sealed class StructuredCvMetadata
{
    public int? ProfileVersion { get; set; }
    public int? AppliedExtractionRunId { get; set; }
    public DateTimeOffset? UpdatedAtUtc { get; set; }
    public Dictionary<string, StructuredCvFieldMetadata> Fields { get; set; } = new();
}

public sealed class StructuredCvFieldMetadata
{
    public double? Confidence { get; set; }
    public string? Method { get; set; }
    public string? SourceSnippet { get; set; }
    public int? SourcePage { get; set; }
    public string? SourceBlockId { get; set; }
    public string? ReviewState { get; set; }
    public DateTimeOffset? LastUpdatedAtUtc { get; set; }
}

public sealed class StructuredCvContact
{
    public string? FullName { get; set; }
    public string? Headline { get; set; }
    public string? Email { get; set; }
    public string? Phone { get; set; }
    public string? Location { get; set; }
    public string? Website { get; set; }
    public string? LinkedIn { get; set; }
    public string? GitHub { get; set; }
    public List<StructuredCvLink> Links { get; set; } = new();
}

public sealed class StructuredCvLink
{
    public string? Label { get; set; }
    public string? Url { get; set; }
}

public sealed class StructuredCvJob
{
    // Stable item ID (assigned by CareerProfileService on first save). Required for CV variants
    // to reference "this job" across profile edits, instead of by array position. Nullable/empty
    // on freshly-parsed or legacy data until the first save assigns it.
    public string? Id { get; set; }
    public string? Title { get; set; }
    public string? Company { get; set; }
    public string? Location { get; set; }
    public string? Start { get; set; }
    public string? End { get; set; }
    // Best-effort "YYYY-MM" normalization of Start/End, computed alongside Id assignment.
    // Null when Start/End can't be parsed; the free-string fields above remain the display source.
    public string? StartDate { get; set; }
    public string? EndDate { get; set; }
    public bool IsCurrent { get; set; }
    public List<string> Bullets { get; set; } = new();
    public List<string> Skills { get; set; } = new();
}

public sealed class StructuredCvEducation
{
    public string? Id { get; set; }
    public string? Qualification { get; set; }
    public string? QualificationLevel { get; set; }
    public string? Institution { get; set; }
    public string? Location { get; set; }
    public string? Start { get; set; }
    public string? End { get; set; }
    public string? StartDate { get; set; }
    public string? EndDate { get; set; }
    public List<string> Details { get; set; } = new();
}

public sealed class StructuredCvCertification
{
    public string? Id { get; set; }
    public string? Name { get; set; }
    public string? Issuer { get; set; }
    public string? Location { get; set; }
    public string? Date { get; set; }
    public string? DateNormalized { get; set; }
    public List<string> Details { get; set; } = new();
}

public sealed class StructuredCvProject
{
    public string? Id { get; set; }
    public string? Name { get; set; }
    public string? Role { get; set; }
    public string? Location { get; set; }
    public string? Start { get; set; }
    public string? End { get; set; }
    public string? StartDate { get; set; }
    public string? EndDate { get; set; }
    public List<string> Bullets { get; set; } = new();
    public List<string> Skills { get; set; } = new();
}

public sealed class StructuredCvLanguage
{
    public string? Name { get; set; }
    public string? Level { get; set; }
    public string? Notes { get; set; }
}

public sealed class StructuredCvOtherSection
{
    public string? Title { get; set; }
    public List<string> Items { get; set; } = new();
}

public sealed class StructuredCvSection
{
    public string Name { get; set; } = string.Empty;
    public string Content { get; set; } = string.Empty;
    public int WordCount { get; set; }
}
