# Personal ontology schema — types for content artifacts and career opportunities.
# Used by PersonalOntology projects to track what to write, where to apply, and how to present work.
#
# Design decisions:
# - Content and Opportunity are independent types; linked_nodes connects them to core.ncl node IDs.
# - audience and fit_signals use closed enums to force explicit categorization.
# - PersonalConfig is the export contract for .ontology/personal.ncl in consumer projects.

let content_kind_type = [|
  'BlogPost,
  'ConferenceProposal,
  'CV,
  'Application,
  'Email,
  'Thread,
|] in

let content_status_type = [|
  'Idea,
  'Draft,
  'Review,
  'Published,
  'Rejected,
  'Archived,
|] in

let opportunity_kind_type = [|
  'Conference,
  'Job,
  'Grant,
  'Collaboration,
  'Podcast,
|] in

let opportunity_status_type = [|
  'Watching,
  'Evaluating,
  'Active,
  'Submitted,
  'Closed,
|] in

let audience_type = [|
  'Technical,
  'HiringManager,
  'GeneralPublic,
  'Community,
  'Academic,
|] in

let content_type = {
  id           | String,
  kind         | content_kind_type,
  title        | String              | default = "",
  status       | content_status_type,
  linked_nodes | Array String        | default = [],
  audience     | audience_type,
  note         | String              | default = "",
} in

let opportunity_type = {
  id           | String,
  kind         | opportunity_kind_type,
  name         | String,
  status       | opportunity_status_type,
  fit_signals  | Array String | default = [],
  linked_nodes | Array String | default = [],
  deadline     | String       | default = "",
  note         | String       | default = "",
} in

{
  ContentKind       = content_kind_type,
  ContentStatus     = content_status_type,
  OpportunityKind   = opportunity_kind_type,
  OpportunityStatus = opportunity_status_type,
  Audience          = audience_type,
  Content           = content_type,
  Opportunity       = opportunity_type,

  PersonalConfig = {
    contents      | Array content_type     | default = [],
    opportunities | Array opportunity_type | default = [],
  },
}
