namespace JobTrackerApi.Models;

// Phase 5.5 — Interview preparation the USER owns.
//
// Distinct from InterviewPrepNote and AiWorkspaceNote, which are AI caches: both are regenerated when
// their context changes, so anything a user typed there would eventually be overwritten. This is the
// durable side — company research, technical notes, behavioural answers, STAR examples and the user's
// own questions — and nothing regenerates it.
//
// One table for every category rather than a table per category: they differ only by label, and a new
// category must not need a migration. Migration-owned through an additive provider-aware adoption.
public sealed class InterviewPrepItem
{
    public int Id { get; set; }
    public string OwnerUserId { get; set; } = string.Empty;
    public int JobApplicationId { get; set; }
    public JobApplication? JobApplication { get; set; }

    // company-research | technical | behavioural | star | question | note
    public string Category { get; set; } = InterviewPrepCategories.Note;

    // The prompt side: a question to answer, or the heading of a research note.
    public string Title { get; set; } = string.Empty;

    // The user's own words. Always theirs to edit — an AI suggestion only lands here once saved.
    public string? Content { get; set; }

    // user | ai — whether the user wrote this or accepted it from a suggestion. Recorded for honesty
    // in the UI, not to restrict editing: an accepted suggestion is fully editable afterwards.
    public string Source { get; set; } = InterviewPrepSources.User;

    // Practice tracking, so the section doubles as the preparation checklist.
    public bool IsPrepared { get; set; }

    public int SortOrder { get; set; }
    public DateTimeOffset CreatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
    public DateTimeOffset UpdatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
}

public static class InterviewPrepCategories
{
    public const string CompanyResearch = "company-research";
    public const string Technical = "technical";
    public const string Behavioural = "behavioural";
    public const string Star = "star";
    public const string Question = "question";
    public const string Note = "note";

    // Display order in the workspace: understand the company, then the role, then yourself, then what
    // you want to ask them.
    public static readonly string[] Order =
    {
        CompanyResearch, Technical, Behavioural, Star, Question, Note,
    };

    public static int Rank(string? category)
    {
        var i = Array.IndexOf(Order, category ?? Note);
        return i < 0 ? Order.Length : i;
    }

    public static bool IsValid(string? value) => Array.IndexOf(Order, value ?? string.Empty) >= 0;
}

public static class InterviewPrepSources
{
    public const string User = "user";
    public const string Ai = "ai";

    public static bool IsValid(string? value) => value is User or Ai;
}
