'use client';

import Link from 'next/link';

import type { AccountWithParams } from '@/packages/features/accounts/src/server/api';
import { Database } from '@/packages/supabase/src/database.types';
import { BlendingModeIcon, RulerHorizontalIcon } from '@radix-ui/react-icons';
import {
  Activity,
  ChevronRight,
  Clock9,
  Droplets,
  Pill,
  Scale,
  TrendingUp,
  User,
} from 'lucide-react';

import { InfoTooltip } from '@kit/shared/components/ui/info-tooltip';
import { pathsConfig } from '@kit/shared/config';
import { getPersonParameters } from '@kit/shared/utils';
import { Button } from '@kit/ui/button';
import {
  Card,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardProps,
} from '@kit/ui/card';
import { Trans } from '@kit/ui/trans';
import { cn } from '@kit/ui/utils';

import { isNil } from 'lodash';
import { BmiCategory } from '~/lib/types/bmi';
import {
  bmiFromMetric,
  getBmiBackgroundColor,
  getBmiStatus,
} from '~/lib/utils';

const getCardVariant = (isSuccess: boolean | null): CardProps['variant'] => {
  if (isSuccess === null) return 'default';
  if (isSuccess) return 'gradient-success';
  return 'gradient-destructive';
};

const cards = ({
  gender,
  age,
  height,
  weight,
  bmiStatus,
  smoking,
}: {
  gender?: string;
  age?: number;
  height?: number | null;
  weight?: number | null;
  bmiStatus: BmiCategory | null;
  smoking?: boolean | null;
}) => [
    {
      title: 'dashboard:gender',
      description: gender ?? 'dashboard:male',
      icon: <User />,
      iconBg: 'bg-success',
    },
    {
      title: 'dashboard:age',
      description: age ? `${age}` : '-',
      icon: <Clock9 />,
      iconBg: 'bg-success',
    },
    {
      title: 'dashboard:height',
      description: height ? `${height}cm` : '-',
      icon: <RulerHorizontalIcon className="size-4" />,
      iconBg: 'bg-success',
    },
    {
      title: 'dashboard:weight',
      description: weight ? `${weight}kg` : '-',
      icon: <Scale />,
      iconBg: 'bg-success',
    },
    {
      title: 'dashboard:bmi',
      description: bmiFromMetric(weight || 0, height || 0).toString(),
      icon: <TrendingUp />,
      iconBg: getBmiBackgroundColor(bmiStatus),
    },
    {
      title: 'dashboard:bloodPressure',
      description: '-',
      icon: <Activity />,
      iconBg: 'bg-warning',
    },
    {
      title: 'dashboard:cholesterol',
      description: '-',
      icon: <BlendingModeIcon className="size-4" />,
      iconBg: 'bg-destructive',
    },
    {
      title: 'dashboard:ldlCholesterol',
      description: '-',
      icon: <Pill />,
      iconBg: 'bg-warning',
    },
    // {
    //   title: 'Score 2',
    //   description: 'Normis',
    //   icon: <LineChart />,
    //   iconBg: 'bg-success',
    // },
    {
      title: 'dashboard:smoking',
      description:
        isNil(smoking)
          ? 'dashboard:respondToQuestion'
          : !!smoking
            ? 'common:yes'
            : 'common:no',
      descriptionColor: 'text-primary',
      icon:
        isNil(smoking) ? (
          <Link href={pathsConfig.app.personalAccountSettings}>
            <Button size="icon" variant="outline" className="px-2 text-black">
              <ChevronRight className="size-4 stroke-2" />
            </Button>
          </Link>
        ) : null,
      cardVariant: getCardVariant(isNil(smoking) ? null : !smoking),
    },
  ];

const dummyRecommendations = [
  {
    icon: <BlendingModeIcon className="size-4" />,
    color: 'bg-cyan/10 text-cyan',
    title: 'Kolesterooli kontroll',
    description: 'HDL-kolestrool',
    tooltipContent: 'Selgitus',
    price: '20,00 €',
    buttonText: 'Telli',
    href: '/home/booking',
  },
  {
    icon: <BlendingModeIcon className="size-4" />,
    color: 'bg-primary/10 text-primary',
    title: 'Kolesterooli kontroll',
    tooltipContent: 'Selgitus',
    description: 'LDL-Kolesterool',
    buttonText: 'Broneeri',
    href: '/home/booking',
  },
  {
    icon: <Droplets />,
    color: 'bg-destructive/10 text-destructive',
    title: 'Vererõhu kontroll',
    tooltipContent: 'Selgitus',
    description: 'Score-Risk 2',
    price: '20,00 €',
    buttonText: 'Telli',
    href: '/home/booking',
  },
];

export default function Dashboard({
  account,
  bmiThresholds,
}: {
  account: AccountWithParams;
  bmiThresholds: Omit<
    Database['medreport']['Tables']['bmi_thresholds']['Row'],
    'id'
  >[];
}) {
  const params = getPersonParameters(account.personal_code!);
  const bmiStatus = getBmiStatus(bmiThresholds, {
    age: params?.age || 0,
    height: account.accountParams?.height || 0,
    weight: account.accountParams?.weight || 0,
  });

  return (
    <>
      <div className="xs:grid-cols-2 grid auto-rows-fr gap-3 sm:grid-cols-4 lg:grid-cols-5">
        {cards({
          gender: params?.gender,
          age: params?.age,
          height: account.accountParams?.height,
          weight: account.accountParams?.weight,
          bmiStatus,
          smoking: account.accountParams?.isSmoker,
        }).map(
          ({
            title,
            description,
            icon,
            iconBg,
            cardVariant,
            // descriptionColor,
          }) => (
            <Card
              key={title}
              variant={cardVariant}
              className="flex flex-col justify-between"
            >
              <CardHeader className="items-end-safe">
                <div
                  className={cn(
                    'flex size-8 items-center-safe justify-center-safe rounded-full text-white',
                    iconBg,
                  )}
                >
                  {icon}
                </div>
              </CardHeader>
              <CardFooter className="flex flex-col items-start">
                <h5>
                  <Trans i18nKey={title} />
                </h5>
                <CardDescription
                // className={descriptionColor}
                >
                  <Trans i18nKey={description} />
                </CardDescription>
              </CardFooter>
            </Card>
          ),
        )}
      </div>
      <Card>
        <CardHeader className="items-start">
          <h4>
            <Trans i18nKey="dashboard:recommendedForYou" />
          </h4>
        </CardHeader>
        <CardContent className="space-y-6">
          {dummyRecommendations.map(
            (
              {
                icon,
                color,
                title,
                description,
                tooltipContent,
                price,
                buttonText,
                href,
              },
              index,
            ) => {
              return (
                <div
                  className="flex w-full justify-between gap-3 overflow-scroll"
                  key={index}
                >
                  <div className="mr-4 flex min-w-fit flex-row items-center gap-4">
                    <div
                      className={cn(
                        'flex size-8 items-center-safe justify-center-safe rounded-full text-white',
                        color,
                      )}
                    >
                      {icon}
                    </div>
                    <div className="min-w-fit">
                      <div className="inline-flex items-center gap-1 align-baseline text-sm font-medium">
                        {title}
                        <InfoTooltip content={tooltipContent} />
                      </div>
                      <p className="text-muted-foreground text-sm">
                        {description}
                      </p>
                    </div>
                  </div>
                  <div className="grid w-36 min-w-fit auto-rows-fr grid-cols-2 items-center gap-4">
                    <p className="text-sm font-medium"> {price}</p>
                    {href ? (
                      <Link href={href}>
                        <Button
                          size="sm"
                          variant="secondary"
                          className="w-full min-w-fit"
                        >
                          {buttonText}
                        </Button>
                      </Link>
                    ) : (
                      <Button
                        size="sm"
                        variant="secondary"
                        className="w-full min-w-fit"
                      >
                        {buttonText}
                      </Button>
                    )}
                  </div>
                </div>
              );
            },
          )}
        </CardContent>
      </Card>
    </>
  );
}
