import Link from 'next/link';
import { redirect } from 'next/navigation';

import { loadCurrentUserAccount } from '@/app/home/(user)/_lib/server/load-user-account';
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 pathsConfig from '~/config/paths.config';
import { getAnalysisElements } from '~/lib/services/analysis-element.service';
import {
  PAGE_VIEW_ACTION,
  createPageViewLog,
} from '~/lib/services/audit/pageView.service';
import { AnalysisOrder, getAnalysisOrders } from '~/lib/services/order.service';
import { ButtonTooltip } from '~/components/ui/button-tooltip';

import Analysis from './_components/analysis';
import { loadUserAnalysis } from '../../_lib/server/load-user-analysis';

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 analysisResponses = await loadUserAnalysis();
  const analysisResponseElements = analysisResponses?.flatMap(
    ({ elements }) => elements,
  );

  const analysisOrders = await getAnalysisOrders().catch(() => null);

  if (!analysisOrders) {
    redirect(pathsConfig.auth.signIn);
  }

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

  const getAnalysisElementIds = (analysisOrders: AnalysisOrder[]) => [
    ...new Set(analysisOrders?.flatMap((order) => order.analysis_element_ids).filter(Boolean) as number[]),
  ];

  const analysisElementIds = getAnalysisElementIds(analysisOrders);
  const analysisElements = await getAnalysisElements({ ids: analysisElementIds });

  return (
    <PageBody className="gap-4">
      <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">
            {analysisResponses && analysisResponses.length > 0 ? (
              <Trans i18nKey="analysis-results:description" />
            ) : (
              <Trans i18nKey="analysis-results:descriptionEmpty" />
            )}
          </p>
        </div>
        <Button asChild>
          <Link href={pathsConfig.app.orderAnalysisPackage}>
            <Trans i18nKey="analysis-results:orderNewAnalysis" />
          </Link>
        </Button>
      </div>
      <div className="flex flex-col gap-8">
        {analysisOrders.length > 0 && analysisElements.length > 0 ? analysisOrders.map((analysisOrder) => {
          const analysisElementIds = getAnalysisElementIds([analysisOrder]);
          const analysisElementsForOrder = analysisElements.filter((element) => analysisElementIds.includes(element.id));
          return (
            <div key={analysisOrder.id} className="flex flex-col gap-4">
              <h4>
                <Trans i18nKey="analysis-results:orderTitle" values={{ orderNumber: analysisOrder.medusa_order_id }} />
              </h4>
              <h5>
                <Trans i18nKey={`orders:status.${analysisOrder.status}`} />
                <ButtonTooltip
                  content={`${new Date(analysisOrder.created_at).toLocaleString()}`}
                  className="ml-6"
                />
              </h5>
              <div className="flex flex-col gap-2">
                {analysisElementsForOrder.length > 0 ? analysisElementsForOrder.map((analysisElement) => {
                  const results = analysisResponseElements?.find((element) => element.analysis_element_original_id === analysisElement.analysis_id_original);
                  if (!results) {
                    return (
                      <Analysis key={`${analysisOrder.id}-${analysisElement.id}`} analysisElement={analysisElement} />
                    );
                  }
                  return (
                    <Analysis key={`${analysisOrder.id}-${analysisElement.id}`} analysisElement={analysisElement} results={results} />
                  );
                }) : (
                  <div className="text-muted-foreground text-sm">
                    <Trans i18nKey="analysis-results:noAnalysisElements" />
                  </div>
                )}
              </div>
            </div>
          );
        }) : (
          <div className="text-muted-foreground text-sm">
            <Trans i18nKey="analysis-results:noAnalysisOrders" />
          </div>
        )}
      </div>
    </PageBody>
  );
}

export default withI18n(AnalysisResultsPage);
