use std::sync::Arc;

use apb::Collection;
use leptos::*;
use leptos_router::*;
use crate::prelude::*;

#[component]
pub fn SearchPage() -> impl IntoView {
	let auth = use_context::<Auth>().expect("missing auth context");

	let query = Signal::derive(||
		use_query_map().with(|x| x.get("q").cloned().unwrap_or_default())
	);

	let user = create_local_resource(
		move || use_query_map().get().get("q").cloned().unwrap_or_default(),
		move |q| {
			let user_fetch = Uri::api(U::Actor, &q, true);
			async move { Some(Arc::new(Http::fetch::<serde_json::Value>(&user_fetch, auth).await.ok()?)) }
		}
	);
	
	let object = create_local_resource(
		move || use_query_map().get().get("q").cloned().unwrap_or_default(),
		move |q| {
			let object_fetch = Uri::api(U::Object, &q, true);
			async move { Some(Arc::new(Http::fetch::<serde_json::Value>(&object_fetch, auth).await.ok()?)) }
		}
	);

	let text_search = create_local_resource(
		move || use_query_map().get().get("q").cloned().unwrap_or_default(),
		move |q| {
			let search = format!("{URL_BASE}/search?q={q}");
			async move {
				let items = Http::fetch::<serde_json::Value>(&search, auth).await.ok()?;
				Some(crate::timeline::process_activities(items.ordered_items().collect(), auth).await)
			}
		}
	);


	view! {

		<blockquote class="mt-3 mb-3">
			<details open>
				<summary class="mb-2">
					<code class="cw center color ml-s w-100">actor</code>
				</summary>
				<div class="pb-1">
				{move || match user.get() {
					None => view! { <p class="center"><small>searching...</small></p> },
					Some(None) => view! { <p class="center"><code>N/A</code></p> },
					Some(Some(u)) => view! { <p><ActorBanner object=u /></p> },
				}}
				</div>
			</details>
		</blockquote>

		<blockquote class="mt-3 mb-3">
			<details open>
				<summary class="mb-2">
					<code class="cw center color ml-s w-100">object</code>
				</summary>
				<div class="pb-1">
				{move || match object.get() {
					None => view! { <p class="center"><small>searching...</small></p> },
					Some(None) => view!{ <p class="center"><code>N/A</code></p> },
					Some(Some(o)) => view! { <p><Object object=o /></p> },
				}}
				</div>
			</details>
		</blockquote>

		<blockquote>
			<details open>
				<summary class="mb-2">
					<code class="cw center color ml-s w-100">hashtags</code>
				</summary>
				<div class="pb-1">
					<ul>
						<li><a href={format!("/web/tags/{}", query.get())}>#{query}</a></li>
					</ul>
				</div>
			</details>
		</blockquote>


		<blockquote class="mt-3 mb-3">
			<details open>
				<summary class="mb-2">
					<code class="cw center color ml-s w-100">full text</code>
				</summary>
				<div class="pb-1">
					{move || match text_search.get() {
						None => Some(view! { <p class="center"><small>searching...</small></p> }.into_view()),
						Some(None) => None,
						Some(Some(items)) => Some(view! {
							// TODO ughhh too many clones
							<For
								each=move || items.clone()
								key=|id| id.clone()
								children=move |item| {
									cache::OBJECTS.get(&item)
										.map(|x| view! { <Item item=x always=true /> }.into_view())
								}
							/ >
						}.into_view())
					}}
				</div>
			</details>
		</blockquote>
	}
}