import Card from '@/components/Card';
import Table, { TABLE_DEFAULT_STYLING } from '@/components/Table';
import { isResponseSuccess } from '@/lib/api-helper';
import { cn, formatCurrency, formatDate, formatNumber } from '@/lib/helper';
import { ClosingApi } from '@/services/api/closing';
import {
  ClosingGeneralInformation,
  Overhead,
  OverheadTotal,
} from '@/types/api/closing';
import { ProjectFlockKandang } from '@/types/api/production/project-flock-kandang';
import { Icon } from '@iconify/react';
import { ColumnDef } from '@tanstack/react-table';
import { useSearchParams } from 'next/navigation';
import { useMemo } from 'react';
import useSWR from 'swr';
import OverheadClosingSkeleton from '@/components/pages/closing/skeleton/OverheadClosingSkeleton';

interface OverheadClosingTableProps {
  projectFlockId: number;
  generalInformation?: ClosingGeneralInformation;
  kandangData?: ProjectFlockKandang;
}

const OverheadClosingTable = ({
  projectFlockId,
  generalInformation,
  kandangData,
}: OverheadClosingTableProps) => {
  const searchParams = useSearchParams();
  const kandangId = searchParams.get('kandangId');

  const { data: overhead, isLoading: isLoadingOverhead } = useSWR(
    `${ClosingApi.basePath}/${projectFlockId}/overhead`,
    () => ClosingApi.getOverhead(projectFlockId),
    {
      keepPreviousData: true,
    }
  );

  const { data: overheadKandang, isLoading: isLoadingOverheadKandang } = useSWR(
    kandangId
      ? `${ClosingApi.basePath}/${projectFlockId}/${kandangId}/overhead`
      : undefined,
    () =>
      ClosingApi.getOverhead(
        projectFlockId,
        kandangId ? Number(kandangId) : undefined
      ),
    {
      keepPreviousData: true,
    }
  );

  const chickinPopulation = useMemo(() => {
    if (kandangData) {
      return kandangData?.chickins?.reduce(
        (acc, chickin) => acc + chickin.usage_qty,
        0
      );
    }
    return 0;
  }, [kandangData]);

  const kandangTotal = useMemo(() => {
    if (!isResponseSuccess(overhead)) {
      return 0;
    }
    const total =
      ((chickinPopulation ?? 0) * overhead.data.total.actual_total_amount) /
      (generalInformation?.population ?? 0);
    return total;
  }, [overhead, chickinPopulation, generalInformation]);

  // Helper function to create columns with footer support
  const createColumns = (
    total?: OverheadTotal,
    kandangId?: number
  ): ColumnDef<Overhead>[] => {
    const flockColumn: ColumnDef<Overhead>[] = [
      {
        header: 'Budget Pengajuan',
        footer: '',
        columns: [
          {
            id: 'budget_quantity',
            header: 'Jumlah',
            accessorFn: (props) => formatNumber(props.budget_quantity),
            footer: total ? () => formatNumber(total.budget_quantity) : '',
          },
          {
            id: 'budget_unit_price',
            header: 'Harga Satuan',
            accessorFn: (props) => formatCurrency(props.budget_unit_price),
            footer: '',
          },
          {
            id: 'budget_total_amount',
            header: 'Total',
            accessorFn: (props) => formatCurrency(props.budget_total_amount),
            footer: total
              ? () => formatCurrency(total.budget_total_amount)
              : '0',
          },
        ],
      },
      {
        header: 'Realisasi',
        footer: '',
        columns: [
          {
            id: 'actual_date',
            header: 'Tanggal',
            accessorFn: (props) =>
              formatDate(props.actual_date, 'DD MMM, YYYY'),
            footer: '',
          },
          {
            id: 'actual_quantity',
            header: 'Jumlah',
            accessorFn: (props) => formatNumber(props.actual_quantity),
            footer: total ? () => formatNumber(total.actual_quantity) : '0',
          },
          {
            id: 'actual_unit_price',
            header: 'Harga Satuan',
            accessorFn: (props) => formatCurrency(props.actual_unit_price),
            footer: '',
          },
          {
            id: 'actual_total_amount',
            header: 'Total',
            accessorFn: (props) => formatCurrency(props.actual_total_amount),
            footer: total
              ? () => formatCurrency(total.actual_total_amount)
              : '0',
          },
        ],
      },
    ];

    const kandangColumn: ColumnDef<Overhead>[] = [
      {
        id: 'actual_date',
        header: 'Tanggal',
        accessorFn: (props) => formatDate(props.actual_date, 'DD MMM, YYYY'),
        footer: '',
      },
      {
        id: 'actual_quantity',
        header: 'Jumlah',
        accessorFn: (props) => formatNumber(props.actual_quantity),
        footer: total ? () => formatNumber(total.actual_quantity) : '',
      },
      {
        id: 'actual_unit_price',
        header: 'Harga Satuan',
        accessorFn: (props) => formatCurrency(props.actual_unit_price),
        footer: '',
      },
      {
        id: 'actual_total_amount',
        header: 'Total',
        accessorFn: (props) => formatCurrency(props.actual_total_amount),
        footer: total ? () => formatCurrency(total.actual_total_amount) : '',
      },
    ];

    const finalColumns: ColumnDef<Overhead>[] = [
      // Group untuk kolom tanpa footer
      {
        header: 'No',
        accessorFn: (_, index) => index,
        cell: (props) => props.row.index + 1,
      },
      {
        header: 'Nama Item',
        accessorFn: (props) => props.item_name,
        footer: 'Total Pengeluaran Overhead',
      },
      {
        header: 'Satuan',
        accessorFn: (props) => props.uom_name,
      },
      ...(kandangId ? kandangColumn : flockColumn),
      {
        id: 'cost_per_bird',
        header: 'Rp/Ekor',
        accessorFn: (props) => formatCurrency(props.cost_per_bird),
        footer: total ? () => formatCurrency(total.cost_per_bird) : '',
      },
    ];
    return finalColumns;
  };

  const columns = useMemo(
    () =>
      isResponseSuccess(overhead)
        ? createColumns(
            kandangId
              ? isResponseSuccess(overheadKandang)
                ? overheadKandang.data?.total
                : undefined
              : overhead.data?.total,
            kandangId ? Number(kandangId) : undefined
          )
        : createColumns(),
    [overhead, kandangId, overheadKandang]
  );

  return (
    <>
      <Card
        title='Pengeluaran Overhead'
        collapsible
        defaultCollapsed={false}
        className={{
          wrapper: 'w-full',
          body: 'p-4 shadow',
        }}
      >
        {isLoadingOverhead ? (
          <OverheadClosingSkeleton columns={columns} />
        ) : !isResponseSuccess(overhead) ||
          (!kandangId && overhead.data?.overheads.length === 0) ||
          (kandangId && !isResponseSuccess(overheadKandang)) ? (
          <OverheadClosingSkeleton
            columns={columns}
            iconName='heroicons:chart-bar'
            title='Data Overhead Tidak Ditemukan'
            subtitle='Tidak ada data overhead untuk periode ini.'
          />
        ) : (
          <Table<Overhead>
            data={
              kandangId
                ? isResponseSuccess(overheadKandang)
                  ? (overheadKandang.data?.overheads ?? [])
                  : []
                : isResponseSuccess(overhead)
                  ? (overhead.data?.overheads ?? [])
                  : []
            }
            columns={columns}
            className={{
              containerClassName: 'my-4',
              headerColumnClassName: cn(
                TABLE_DEFAULT_STYLING.headerColumnClassName,
                'whitespace-nowrap'
              ),
            }}
            isLoading={isLoadingOverhead}
            renderFooter={
              isResponseSuccess(overhead)
                ? overhead.data?.overheads.length > 0
                : false
            }
          />
        )}
        {kandangId && !isLoadingOverhead && isResponseSuccess(overhead) && (
          <Card
            className={{
              wrapper: 'w-full',
              body: 'p-4 shadow-button-soft border border-base-content/10 rounded-lg',
            }}
          >
            <div className='flex flex-row gap-3 w-full justify-center items-stretch'>
              <div className='flex flex-row items-center justify-between'>
                <h2 className='text-base font-bold'>Pembelian Kandang </h2>
              </div>
              <div className='flex flex-col items-center justify-center'>
                <Icon icon='heroicons:equals' className='inline' />
              </div>
              <div className='flex flex-col flex-1 gap-1.5'>
                <div className='flex flex-row gap-1.5 text-center items-center justify-center font-medium'>
                  Populasi Akhir KANDANG{' '}
                  <Icon icon='heroicons:x-mark' className='inline' /> Pemakaian
                  Di FARM
                </div>
                <hr className='w-full h-fit m-0 p-0 text-base-content/65' />
                <div className='flex flex-row gap-1.5 text-center items-center justify-center font-medium'>
                  Populasi Akhir Proyek
                </div>
              </div>
              <div className='flex flex-col items-center justify-center'>
                <Icon icon='heroicons:equals' className='inline' />
              </div>
              <div className='flex flex-col flex-1 gap-1.5'>
                <div className='flex flex-row gap-1.5 text-center items-center justify-center font-medium'>
                  {formatNumber(chickinPopulation ?? 0)}
                  <Icon icon='heroicons:x-mark' className='inline' />
                  {formatCurrency(
                    isResponseSuccess(overhead)
                      ? overhead.data?.total.actual_total_amount
                      : 0
                  )}
                </div>
                <hr className='w-full h-fit m-0 p-0 text-base-content/65' />
                <div className='flex flex-row gap-1.5 text-center items-center justify-center font-medium'>
                  {formatNumber(generalInformation?.population ?? 0)}
                </div>
              </div>
              <div className='flex flex-col items-center justify-center'>
                <Icon icon='heroicons:equals' className='inline' />
              </div>
              <div className='flex flex-row items-center justify-between'>
                <h2 className='text-base font-bold'>
                  {formatNumber(kandangTotal || 0)}
                </h2>
              </div>
            </div>
          </Card>
        )}
      </Card>
    </>
  );
};

export default OverheadClosingTable;
