//! Node- og edge-typer fra databaseskjemaet.
//!
//! Disse typene speiler SQL-skjemaet i `docs/primitiver/nodes.md` og
//! `docs/primitiver/edges.md`. De er ment som delte FromRow-structs
//! for de vanligste spørringene.
//!
//! node_kind og edge_type er freeform-strenger — ikke enums — fordi
//! listen vokser organisk. Se docs for kjente verdier.

use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;

/// En rad fra `nodes`-tabellen.
///
/// Bruk med `sqlx::query_as::<_, NodeRow>(...)`. Husk å caste
/// enums i SQL: `node_kind::text`, `visibility::text`.
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)]
pub struct NodeRow {
    pub id: Uuid,
    pub node_kind: String,
    pub title: Option<String>,
    pub content: Option<String>,
    pub visibility: String,
    pub metadata: Option<serde_json::Value>,
    pub created_at: DateTime<Utc>,
    pub created_by: Option<Uuid>,
}

/// En rad fra `edges`-tabellen.
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)]
pub struct EdgeRow {
    pub id: Uuid,
    pub source_id: Uuid,
    pub target_id: Uuid,
    pub edge_type: String,
    pub metadata: Option<serde_json::Value>,
    pub system: bool,
    pub created_at: DateTime<Utc>,
    pub created_by: Option<Uuid>,
}

/// Forenklet node for listevisning og søkeresultater.
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)]
pub struct NodeSummary {
    pub id: Uuid,
    pub node_kind: String,
    pub title: Option<String>,
    pub visibility: String,
    pub created_at: DateTime<Utc>,
}
