'use client';

import type { StringBundle } from '@/lib/i18n';
import { useT, useLocale } from '@/lib/i18n/react';
import { AdminListPage } from '@/components/ui/domain/admin/AdminListPage';
import { ErrorBoundary } from '@/components/ui/feedback/ErrorBoundary';
import { Toast, ToastProvider, ToastTitle, ToastViewport } from '@/components/ui/overlays/Toast';
import { useToast } from '@/components/ui/overlays/Toast/useToast';
import { Pagination } from '@/components/ui/primitives/Pagination';
import { Button } from '@/components/ui/primitives/Button';
import { AdminRoleConfirmDialog } from './AdminRoleConfirmDialog';
import { BulkFreezeDialog } from './BulkFreezeDialog';
import { QuickFreezeDialog } from './QuickFreezeDialog';
import { UsersMgmtActionDrawer } from './UsersMgmtActionDrawer';
import { UsersMgmtFilterBar } from './UsersMgmtFilterBar';
import { UsersMgmtTable } from './UsersMgmtTable';
import { applySegmentParams, useUsersMgmtController } from './useUsersMgmtController';

export type UserMatchKind = 'email' | 'phone' | 'uuid' | 'name';

export interface UserRow {
  id: string;
  displayName?: string | null;
  realName?: string | null;
  defaultCity?: string | null;
  email?: string | null;
  phoneHint?: string | null;
  accountState: string;
  purchaseCount: number;
  isAdmin: boolean;
  createdAt: string;
}

export interface UsersMgmtProps {
  initialUsers: UserRow[];
  initialTotal: number;
  initialPage?: number;
  initialMatchKind?: UserMatchKind | null;
}

type AdminUsersKey = keyof StringBundle['admin_users'];
type AdminActionDrawerKey = keyof StringBundle['admin_action_drawer'];
type CommonKey = keyof StringBundle['common'];

export function UsersMgmt(props: UsersMgmtProps) {
  const t = useT('admin_users');
  const tList = useT('admin_list');
  const tD = useT('admin_action_drawer');
  const tCommon = useT('common');
  const { locale } = useLocale();
  const { toasts, toast, dismiss } = useToast();
  const model = useUsersMgmtController({ ...props, t, tList, tD, locale, toast });
  const tForStringKey = (key: string) => t(key as AdminUsersKey);
  const tDForStringKey = (key: string) => tD(key as AdminActionDrawerKey);
  const tCommonForStringKey = (key: string) => tCommon(key as CommonKey);

  return (
    <ErrorBoundary>
      <ToastProvider swipeDirection="left">
        <>
          <AdminListPage
            subtitle={model.subtitle}
            status={model.query.error ? 'error' : model.query.isInitialLoading ? 'loading' : 'idle'}
            busy={model.query.isRefetching}
            onRetry={() => model.query.setPage(model.query.page)}
            primaryAction={
              <Button
                variant="secondary"
                size="sm"
                loading={model.exporting}
                onClick={model.handleExportCsv}
                title={t('export_csv_tooltip')}
              >
                {t('export_csv')}
              </Button>
            }
            filterBar={
              <UsersMgmtFilterBar
                t={tForStringKey}
                segments={model.segments}
                recentIds={model.recentIds}
                applySegmentParams={applySegmentParams}
                trackRecent={model.trackRecent}
                stateMultiChips={model.stateMultiChips}
                activityChips={model.activityChips}
                completenessChips={model.completenessChips}
                filterSelects={model.filterSelects}
                suggestions={model.suggestions}
                searchPlaceholder={t('search_placeholder')}
                rangeLabel={model.rangeLabel}
              />
            }
            table={
              <UsersMgmtTable
                tableWrapRef={model.tableWrapRef}
                columns={model.columns}
                data={model.query.data}
                isInitialLoading={model.query.isInitialLoading}
                actions={model.actions}
                selectedIds={model.selectedIds}
                setSelectedIds={model.setSelectedIds}
                bulkActions={model.bulkActions}
                bulkSelectedLabel={t('bulk_selected').replace(
                  '{n}',
                  String(model.selectedIds.length),
                )}
                bulkClearLabel={t('bulk_clear')}
                selectAllLabel={t('select_all_rows')}
                rowSelectLabel={t('select_row')}
                highlightedIndex={model.highlightedIndex}
                isLoading={model.query.isLoading}
              />
            }
            pagination={
              model.query.totalPages > 1 ? (
                <Pagination
                  page={model.query.page}
                  totalPages={model.query.totalPages}
                  onPageChange={model.query.setPage}
                />
              ) : undefined
            }
          />

          <UsersMgmtActionDrawer
            t={tForStringKey}
            tD={tDForStringKey}
            drawerOpen={model.drawerOpen}
            setDrawerOpen={model.setDrawerOpen}
            drawerUser={model.drawerUser}
            freezeReason={model.actionsApi.freezeReason}
            setFreezeReason={model.actionsApi.setFreezeReason}
            actionError={model.actionsApi.actionError}
            actionSuccess={model.actionsApi.actionSuccess}
            actionLoading={model.actionsApi.actionLoading}
            onFreeze={() => {
              if (model.drawerUser) {
                void model.actionsApi.freezeUser(
                  model.drawerUser.id,
                  model.actionsApi.freezeReason,
                );
              }
            }}
            onUnfreeze={() => {
              if (model.drawerUser) {
                void model.actionsApi.unfreezeUser(model.drawerUser.id);
              }
            }}
            onOpenAdminConfirm={() => model.actionsApi.setAdminConfirmOpen(true)}
          />

          <QuickFreezeDialog
            t={tForStringKey}
            tCommon={tCommonForStringKey}
            quickFreezeUser={model.actionsApi.quickFreezeUser}
            setQuickFreezeUser={model.actionsApi.setQuickFreezeUser}
            quickFreezeReason={model.actionsApi.quickFreezeReason}
            setQuickFreezeReason={model.actionsApi.setQuickFreezeReason}
            actionLoading={model.actionsApi.actionLoading}
            onConfirm={() => {
              void model.actionsApi.handleQuickFreeze();
            }}
          />

          <BulkFreezeDialog
            t={tForStringKey}
            tCommon={tCommonForStringKey}
            bulkFreezeOpen={model.actionsApi.bulkFreezeOpen}
            setBulkFreezeOpen={model.actionsApi.setBulkFreezeOpen}
            selectedCount={model.selectedIds.length}
            bulkFreezeReason={model.actionsApi.bulkFreezeReason}
            setBulkFreezeReason={model.actionsApi.setBulkFreezeReason}
            actionLoading={model.actionsApi.actionLoading}
            onConfirm={() => {
              void model.actionsApi.handleBulkFreeze();
            }}
          />

          <AdminRoleConfirmDialog
            t={tForStringKey}
            tD={tDForStringKey}
            tCommon={tCommonForStringKey}
            drawerUser={model.drawerUser}
            adminConfirmOpen={model.actionsApi.adminConfirmOpen}
            setAdminConfirmOpen={model.actionsApi.setAdminConfirmOpen}
            actionLoading={model.actionsApi.actionLoading}
            onConfirm={() => {
              if (model.drawerUser) {
                void model.actionsApi.toggleAdminFlag(model.drawerUser);
              }
            }}
          />

          <ToastViewport />
          {toasts.map((item) => (
            <Toast
              key={item.id}
              tone={item.tone}
              duration={item.duration}
              open
              onOpenChange={() => dismiss(item.id)}
            >
              <ToastTitle>{item.title}</ToastTitle>
            </Toast>
          ))}
        </>
      </ToastProvider>
    </ErrorBoundary>
  );
}
