import { Observable } from 'rxjs';
import { ArticleMetadata } from '../../components/organisms/article/types';
import { ContentDocument, ContentDocumentType, ContentLoadOptions } from './types';
import * as i0 from "@angular/core";
/**
 * Servicio de la plataforma de contenido (ADR-020 §2.5).
 *
 * Une dos orígenes (**híbrido**):
 *  - **Estático** — `staticSources` lazy por locale, generadas build-time.
 *  - **Backend** — DynamoDB + API (`/v2/content*`), publicación sin redeploy.
 *
 * Reglas de merge:
 *  - `list()` une ambos orígenes por `type`. Colisión de `slug` → **estático
 *    gana** (contenido curado). Ordena por `publishedAt` desc (sin fecha al final).
 *  - `load()` resuelve estático primero, con **fallback** al backend.
 *
 * Render: `toArticle(doc)` convierte `doc.body` (Markdown) a `ArticleMetadata`
 * vía el `markdown-article-parser` existente — la page hace `<val-article [props]="...">`.
 *
 * Requiere `provideValtechContent({ apiUrl, appId, staticSources? })` en `main.ts`.
 * Sin provider, el servicio queda inerte (`isConfigured() === false`).
 */
export declare class ContentService {
    private readonly config;
    private readonly http;
    private readonly parser;
    private readonly auth;
    /** `true` si `provideValtechContent()` fue llamado en el bootstrap. */
    readonly isConfigured: import("@angular/core").WritableSignal<boolean>;
    /** Cache de las promesas de cada factory estática, keyed por locale. */
    private readonly staticCache;
    constructor();
    /**
     * Lista los documentos publicados de un `type`, uniendo estático + backend.
     * Colisión de `slug` → estático gana. Ordenados por `publishedAt` desc.
     *
     * @param type - Tipo de contenido (`'blog'`, `'news'`, …).
     * @param options - `{ locale }` (default `'es'`).
     */
    list(type: ContentDocumentType, options?: ContentLoadOptions): Observable<ContentDocument[]>;
    /**
     * Carga un documento por `slug`: estático primero, fallback al backend.
     *
     * @param type - Tipo de contenido.
     * @param slug - Slug del documento.
     * @param options - `{ locale }` (default `'es'`).
     */
    load(type: ContentDocumentType, slug: string, options?: ContentLoadOptions): Observable<ContentDocument>;
    /**
     * Convierte el `body` (Markdown) de un documento en `ArticleMetadata` para
     * renderizar con `<val-article [props]="...">`. Usa el parser existente.
     *
     * @param doc - Documento de contenido a renderizar.
     * @param config - Override parcial de la `ArticleMetadata` resultante.
     */
    toArticle(doc: ContentDocument, config?: Partial<ArticleMetadata>): ArticleMetadata;
    /** Limpia la cache de fuentes estáticas. Llamar al cambiar de locale en runtime. */
    invalidate(): void;
    /**
     * Lista los documentos publicados de la org activa del usuario autenticado.
     *
     * Requiere sesión activa (`AuthService.isAuthenticated()`). El interceptor de
     * auth agrega automáticamente `Authorization: Bearer {token}` a la request.
     *
     * @param type  - Tipo de contenido (`'blog'`, `'news'`, …).
     * @param options - `{ locale }` (default `'es'`).
     * @returns Documentos de la org o `[]` si no hay config/sesión.
     */
    listForOrg(type: ContentDocumentType, options?: ContentLoadOptions): Observable<ContentDocument[]>;
    /**
     * Carga un documento de la org activa del usuario autenticado por `slug`.
     *
     * Requiere sesión activa. El interceptor de auth agrega el Bearer token.
     *
     * @param type  - Tipo de contenido.
     * @param slug  - Slug del documento.
     * @param options - `{ locale }` (default `'es'`).
     * @returns El documento o error si no se encuentra / no hay sesión.
     */
    loadForOrg(type: ContentDocumentType, slug: string, options?: ContentLoadOptions): Observable<ContentDocument>;
    /** Une estático + backend: estático gana por slug; orden por publishedAt desc. */
    private merge;
    /** Comparador: más reciente primero; sin `publishedAt` al final. */
    private byPublishedDesc;
    /** Carga (y cachea) los documentos estáticos de un locale, si hay factory. */
    private loadStatic;
    /** GET `{apiUrl}/v2/content?type=&locale=` — solo publicados. */
    private listBackend;
    /** GET `{apiUrl}/v2/content/{type}/{locale}/{slug}` — detalle publicado. */
    private loadBackend;
    /**
     * GET `{apiUrl}/v2/content/org?type=&locale=` — publicados de la org activa.
     * El Bearer token lo añade el interceptor de auth automáticamente.
     */
    private listBackendOrg;
    /**
     * GET `{apiUrl}/v2/content/org/{type}/{locale}/{slug}` — detalle de la org activa.
     * El Bearer token lo añade el interceptor de auth automáticamente.
     */
    private loadBackendOrg;
    static ɵfac: i0.ɵɵFactoryDeclaration<ContentService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<ContentService>;
}
