import { useCallback, useMemo, useState } from 'react';
import { ProTable } from '@ant-design/pro-components';
import { createCustomerColumns } from './columns';
import CustomerDetailDrawer from './components/CustomerDetailDrawer';
import FollowUpRecordsDrawer from './components/FollowUpRecordsDrawer';
import { getCustomerList } from './server';
import type { CustomerListQuery, CustomerVO } from './types';

const CustomerList = () => {
  const [detailId, setDetailId] = useState<number | null>(null);
  const [followUpCustomer, setFollowUpCustomer] = useState<{ id: number; name: string } | null>(
    null,
  );

  const openDetail = useCallback((record: CustomerVO) => {
    setDetailId(record.id);
  }, []);

  const openFollowUps = useCallback((record: CustomerVO) => {
    setFollowUpCustomer({ id: record.id, name: record.name });
  }, []);

  const closeDetail = useCallback(() => {
    setDetailId(null);
  }, []);

  const closeFollowUps = useCallback(() => {
    setFollowUpCustomer(null);
  }, []);

  const columns = useMemo(
    () => createCustomerColumns({ onDetail: openDetail, onFollowUp: openFollowUps }),
    [openDetail, openFollowUps],
  );

  return (
    <div className="customer-list-page">
      <ProTable<CustomerVO, CustomerListQuery>
        rowKey="id"
        columns={columns}
        cardProps={{ bodyStyle: { padding: 20 } }}
        search={{ labelWidth: 'auto', defaultCollapsed: false }}
        scroll={{ x: 1660 }}
        options={false}
        pagination={{
          defaultPageSize: 10,
          showSizeChanger: true,
          hideOnSinglePage: false,
          showTotal: (total) => `共 ${total} 条`,
        }}
        request={async (params) => {
          const result = await getCustomerList({
            page: params.current,
            size: params.pageSize,
            ownerId: params.ownerId,
          });

          return {
            data: result.records ?? [],
            total: result.total ?? 0,
            success: true,
          };
        }}
      />

      <CustomerDetailDrawer open={detailId !== null} customerId={detailId} onClose={closeDetail} />

      <FollowUpRecordsDrawer
        open={followUpCustomer !== null}
        customer={followUpCustomer}
        onClose={closeFollowUps}
      />
    </div>
  );
};

export default CustomerList;
