use dioxus::prelude::*;

use crate::domain::entities::site::{Block, PageContent, Post};

use super::{meta, server::get_posts};

#[component]
pub fn Page() -> Element {
    let page = meta::page();
    let info = page.data.info;

    rsx! {
        h2 { "Page {info.title}" }
        match page.data.content {
            PageContent::Single { content } => rsx! {
                PostElement { post: content }
            },
            PageContent::Collection { kind: _, collection_id } => {
                rsx! {
                    SuspenseBoundary { fallback: |_context: SuspenseContext| rsx! { "..." },
                        Collection { collection_id }
                    }
                }
            }
        }
    }
}

#[component]
pub fn Collection(collection_id: String) -> Element {
    let site = meta::site();
    let posts =
        use_server_future(move || get_posts(site.info.domain.clone(), collection_id.clone()))?
            .suspend()?;

    let result = match &*posts.read() {
        Ok(posts) => rsx! {
            for post in posts.data.clone() {
                PostElement { post }
            }
        },
        Err(err) => {
            rsx! {
                h1 { "FATAL ERROR: {err}" }
            }
        }
    };

    result
}

#[component]
pub fn PostElement(post: Post) -> Element {
    rsx! {
        for block in post.blocks {
            BlockElement { block }
        }
    }
}

#[component]
pub fn BlockElement(block: Block) -> Element {
    match block {
        Block::Text { text } => rsx! {
            p { "{text}" }
        },
        Block::Gallery { images } => rsx! {
            for image in images {
                img { src: "{image.src}", alt: "{image.caption}" }
            }
        },
    }
}