import Card from "@/src/components/lib/elements/Card";
import H2 from "@/src/components/lib/layout/H2";
import H3 from "@/src/components/lib/layout/H3";
import Section from "@/src/components/lib/layout/Section";
import Span from "@/src/components/lib/layout/Span";
import Stack from "@/src/components/lib/layout/Stack";
import { skills } from "../(data)/skills";
import React from "react";
import Row from "@/src/components/lib/layout/Row";
import { twMerge } from "tailwind-merge";
import Divider from "@/src/components/lib/layout/Divider";
import ArrowedLink from "@/src/components/lib/layout/ArrowedLink";

type Props = {
    noTitle?: boolean;
    expand?: boolean;
};

export default function MySkillsSection({ noTitle, expand }: Props) {
    const [category, setCategory] =
        React.useState<keyof typeof skills>("Devops");
    const categories = Object.keys(skills) as (keyof typeof skills)[];

    const TitleSection = (
        <Row className="w-full justify-between">
            <Stack>
                {noTitle ? null : (
                    <React.Fragment>
                        <H2 className="leading-snug m-0">My Skills</H2>
                        <Span>
                            A summary of the tools I've mastered over the years
                        </Span>
                        <Divider className="opacity-0 my-2" />
                    </React.Fragment>
                )}
            </Stack>

            {noTitle ? null : (
                <ArrowedLink
                    link={{
                        url: `/skills`,
                        title: `See all my Skills`,
                    }}
                />
            )}
        </Row>
    );

    if (expand) {
        return (
            <Section>
                <Stack className="w-full">
                    {TitleSection}
                    <Stack className="items-stretch gap-20 flex-row xl:flex-col flex-wrap md:flex-nowrap">
                        {categories.map((ctgr, i) => {
                            return (
                                <Stack key={i}>
                                    <Stack className="gap-6">
                                        <Stack className="gap-2">
                                            <H3 className="m-0 text-lg">
                                                {ctgr}
                                            </H3>
                                            <Span className="text-sm !leading-5">
                                                {skills[ctgr].description}
                                            </Span>
                                        </Stack>

                                        <div className="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 w-full">
                                            {skills[ctgr].portfolio.map(
                                                (portfolio, index) => {
                                                    return (
                                                        <MySkillsCard
                                                            portfolio={
                                                                portfolio
                                                            }
                                                            key={index}
                                                        />
                                                    );
                                                },
                                            )}
                                        </div>
                                    </Stack>
                                </Stack>
                            );
                        })}
                    </Stack>
                </Stack>
            </Section>
        );
    }

    return (
        <Section>
            <Stack className="w-full">
                {TitleSection}
                <Row className="flex-nowrap items-start gap-x-10 flex-col xl:flex-row gap-y-10">
                    <Stack className="xl:max-w-[200px] items-stretch gap-10 flex-row xl:flex-col flex-wrap md:flex-nowrap">
                        {categories.map((ctgr, i) => {
                            const isActive = category === ctgr;
                            return (
                                <Stack
                                    key={i}
                                    className={twMerge(
                                        "cursor-pointer",
                                        isActive
                                            ? ""
                                            : "opacity-40 hover:opacity-70",
                                    )}
                                    onClick={() => setCategory(ctgr)}
                                >
                                    <Stack className="gap-1">
                                        <H3 className="m-0 text-lg">{ctgr}</H3>
                                        <Span className="text-sm !leading-5">
                                            {skills[ctgr].description}
                                        </Span>
                                    </Stack>
                                </Stack>
                            );
                        })}
                    </Stack>

                    <div className="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 w-full">
                        {skills[category].portfolio.map((portfolio, index) => {
                            return (
                                <MySkillsCard
                                    portfolio={portfolio}
                                    key={index}
                                />
                            );
                        })}
                    </div>
                </Row>
            </Stack>
        </Section>
    );
}

export function MySkillsCard({
    portfolio,
}: {
    portfolio: (typeof skills.Devops.portfolio)[number];
}) {
    return (
        <Card className="grow w-full items-start">
            <Stack className="gap-4">
                <H3 className="m-0">{portfolio.title}</H3>
                <Span>{portfolio.description}</Span>
                {portfolio.technologies?.[0] && (
                    <Row className="gap-4">
                        {portfolio.technologies.map((tch, _i) => (
                            <React.Fragment key={_i}>
                                <Span className="text-sm dark:text-white/40">
                                    {tch}
                                </Span>
                                {_i < portfolio.technologies.length - 1 && (
                                    <Divider vertical />
                                )}
                            </React.Fragment>
                        ))}
                    </Row>
                )}
            </Stack>
        </Card>
    );
}
