"use client";

import { Fragment, useState, useCallback } from "react";
import { Loader2 } from "lucide-react";
import { api } from "@/lib/trpc/client";
import { ArticleList, transformPostsToArticleList } from "@/features/posts/_lib/transformers";
import { PostOrderEnum } from "@/config/enums";
import DynamicArticle from "@/components/shared/articles/dynamic-article";

export default function EmneList({ slug }: { slug: string }) {
    const [limit, setLimit] = useState(8);
    const { data: items = [], isFetching } = api.posts.list.useQuery(
        {
            with: ["project", "tags", "review", "primaryTag", "author", "vision"],
            tagSlug: slug,
            limit,
            orderBy: PostOrderEnum.PUBLISHED_AT
        },
        {
            select: transformPostsToArticleList,
            placeholderData: (data) => data
        }
    );

    const { data: total = 0 } = api.posts.count.useQuery({
        tagSlug: slug
    });

    const hasMore = items.length < total;

    const onLoadMoreClick = useCallback(() => {
        setLimit((prev) => prev + 8);
    }, []);

    const viewList = (data: ArticleList) => {
        return data.map((item: ArticleList[number], index: number) => {
            const isLastInRowSm = (index + 1) % 2 === 0;
            const isLastInRowLg = (index + 1) % 4 === 0;
            const isLastItem = index === data.length - 1;

            return (
                <Fragment key={index}>
                    <li
                        key={index}
                        className={`relative before:absolute before:bottom-0 before:hidden before:h-full before:w-px before:bg-neutral-200 sm:before:-right-[10px] sm:before:block lg:before:-right-[20px] ${isLastItem ? "before:hidden" : ""} ${isLastInRowSm ? "sm:max-lg:before:hidden" : ""} ${isLastInRowLg ? "lg:before:hidden" : ""}`}
                    >
                        <DynamicArticle data={item} />
                    </li>
                    {(index + 1) % 4 === 0 && index < data.length - 1 && (
                        <li aria-hidden className="col-span-full hidden border-t border-neutral-200 sm:block"></li>
                    )}
                </Fragment>
            );
        });
    };

    if (!items.length) {
        return (
            <section className="relative mx-auto w-full max-w-[1362px] grow p-3 md:p-[30px] xl:border-x">
                <div className="flex flex-col gap-y-3 xl:flex-row">
                    <div className="shrink-0 xl:w-68"></div>
                    <div className="grid w-full gap-5">
                        <p className="text-lg font-medium">Intet fundet</p>
                    </div>
                </div>
            </section>
        );
    }

    return (
        <section className="relative mx-auto w-full max-w-[1362px] grow p-3 md:p-[30px] xl:border-x">
            <div className="flex flex-col gap-y-3 pt-3 xl:flex-row xl:pt-5">
                <div className="shrink-0 xl:w-68"></div>
                <div className="w-full">
                    <ul className="grid gap-x-5 gap-y-5 sm:grid-cols-2 lg:grid-cols-4 lg:gap-x-10">
                        {viewList(items)}
                    </ul>

                    {hasMore && (
                        <button
                            className="text-client-red relative mt-4 flex w-fit items-center gap-2 text-sm tracking-wider"
                            disabled={isFetching}
                            onClick={onLoadMoreClick}
                        >
                            <svg
                                xmlns="http://www.w3.org/2000/svg"
                                viewBox="0 0 512 512"
                                className="size-3 shrink-0"
                                fill="currentColor"
                            >
                                <path d="M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zm-28.9 143.6l75.5 72.4H120c-13.3 0-24 10.7-24 24v16c0 13.3 10.7 24 24 24h182.6l-75.5 72.4c-9.7 9.3-9.9 24.8-.4 34.3l11 10.9c9.4 9.4 24.6 9.4 33.9 0L404.3 273c9.4-9.4 9.4-24.6 0-33.9L271.6 106.3c-9.4-9.4-24.6-9.4-33.9 0l-11 10.9c-9.5 9.6-9.3 25.1.4 34.4z" />
                            </svg>

                            <span className="before:absolute before:top-0 before:left-0 before:z-1 before:block before:size-full hover:underline">
                                flere resultater
                            </span>
                            {isFetching && <Loader2 className="size-5 animate-spin" />}
                        </button>
                    )}
                </div>
            </div>
        </section>
    );
}
