import Link from 'next/link';

import { createI18nServerInstance } from '@/lib/i18n/i18n.server';
import { withI18n } from '@/lib/i18n/with-i18n';

import { Trans } from '@kit/ui/makerkit/trans';
import { PageBody } from '@kit/ui/page';
import { Button } from '@kit/ui/shadcn/button';

import { loadUserAnalysis } from '../../_lib/server/load-user-analysis';
import Analysis from './_components/analysis';
import { listProductTypes } from '@lib/data/products';
import pathsConfig from '~/config/paths.config';
import { redirect } from 'next/navigation';
import { getOrders } from '~/lib/services/order.service';
import { AnalysisElement, getAnalysisElements } from '~/lib/services/analysis-element.service';
import type { UserAnalysisElement } from '@kit/accounts/types/accounts';
import { loadCurrentUserAccount } from '@/app/home/(user)/_lib/server/load-user-account';
import { createPageViewLog } from '~/lib/services/audit/pageView.service';

export const generateMetadata = async () => {
  const i18n = await createI18nServerInstance();
  const title = i18n.t('analysis-results:pageTitle');

  return {
    title,
  };
};

async function AnalysisResultsPage() {
  const account = await loadCurrentUserAccount()
  if (!account) {
    throw new Error('Account not found');
  }

  const analysisList = await loadUserAnalysis();

  const orders = await getOrders().catch(() => null);
  const { productTypes } = await listProductTypes();

  if (!orders || !productTypes) {
    redirect(pathsConfig.auth.signIn);
  }

  await createPageViewLog({
    accountId: account.id,
    action: 'VIEW_ANALYSIS_RESULTS',
  });

  const analysisElementIds = [
    ...new Set(orders?.flatMap((order) => order.analysis_element_ids).filter(Boolean) as number[]),
  ];
  const analysisElements = await getAnalysisElements({ ids: analysisElementIds });
  const analysisElementsWithResults = analysisElements.reduce((acc, curr) => {
    const analysisResponseWithElementResults = analysisList?.find((result) => result.elements.some((element) => element.analysis_element_original_id === curr.analysis_id_original));
    const elementResults = analysisResponseWithElementResults?.elements.find((element) => element.analysis_element_original_id === curr.analysis_id_original) as UserAnalysisElement | undefined;
    return {
      ...acc,
      [curr.id]: {
        analysisElement: curr,
        results: elementResults,
      },
    }
  }, {} as Record<number, { analysisElement: AnalysisElement; results: UserAnalysisElement | undefined }>);

  return (
    <PageBody>
      <div className="mt-8 flex flex-col sm:flex-row sm:items-center justify-between gap-4 sm:gap-0">
        <div>
          <h4>
            <Trans i18nKey="analysis-results:pageTitle" />
          </h4>
          <p className="text-muted-foreground text-sm">
            {analysisList && analysisList.length > 0 ? (
              <Trans i18nKey="analysis-results:description" />
            ) : (
              <Trans i18nKey="analysis-results:descriptionEmpty" />
            )}
          </p>
        </div>
        <Button asChild>
          <Link href={pathsConfig.app.orderAnalysis}>
            <Trans i18nKey="analysis-results:orderNewAnalysis" />
          </Link>
        </Button>
      </div>
      <div className="flex flex-col gap-2">
        {Object.entries(analysisElementsWithResults).map(([id, { analysisElement, results }]) => {
          return (
            <Analysis key={id} analysisElement={analysisElement} results={results} />
          );
        })}
      </div>
    </PageBody>
  );
}

export default withI18n(AnalysisResultsPage);
