import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { api } from '../lib/api';
import type { ApiResponse } from '../lib/api';

/**
 * روش‌های پرداختِ **محیط فعال** (حساب بانکی + کارت‌خوان) برای صفحهٔ «مدیریت پرداخت».
 * منبع: /api/v1/my/payment-methods/... — این رکوردها بعداً از فاکتور مراجعه‌کننده
 * برای ثبت روش پرداختِ یک سرویس ارجاع داده می‌شوند.
 *
 * از فاز ۶، کارت‌ها به محیط تعلق دارند نه به کاربر: با تعویض محیط، فهرست عوض
 * می‌شود. کارت‌های بازمانده‌ای که هنوز محیطی ندارند با entity_type = null در همین
 * فهرست می‌آیند و باید پیش از استفاده به محیطی منتسب شوند.
 */

/** null یعنی «محیطش هنوز تعیین نشده». */
export type PaymentMethodEnvironment = 'doctor' | 'clinic' | null;

export interface BankAccount {
  uuid: string;
  bank_name: string;
  card_number: string | null;
  account_number: string;
  shaba_number: string | null;
  is_active: boolean;
  created_at: number;
  entity_type: PaymentMethodEnvironment;
}

export interface Pos {
  uuid: string;
  bank_name: string;
  serial_number: string | null;
  terminal_number: string;
  account_number: string | null;
  is_active: boolean;
  created_at: number;
  entity_type: PaymentMethodEnvironment;
}

export interface BankAccountInput {
  bank_name: string;
  account_number: string;
  card_number?: string;
  shaba_number?: string;
}

export interface PosInput {
  bank_name: string;
  terminal_number: string;
  serial_number?: string;
  account_number?: string;
}

const BANK_KEY = ['payment-methods', 'bank-accounts'] as const;
const POS_KEY = ['payment-methods', 'pos'] as const;

// ── Bank accounts ────────────────────────────────────────────────────────────

export function useBankAccounts() {
  return useQuery<ApiResponse<BankAccount[]>>({
    queryKey: BANK_KEY,
    queryFn: () => api.get('/api/v1/my/payment-methods/bank-accounts'),
  });
}

export function useCreateBankAccount() {
  const qc = useQueryClient();
  return useMutation<ApiResponse<BankAccount>, unknown, BankAccountInput>({
    mutationFn: (body) => api.post('/api/v1/my/payment-methods/bank-accounts', body),
    onSuccess: () => qc.invalidateQueries({ queryKey: BANK_KEY }),
  });
}

export function useUpdateBankAccount() {
  const qc = useQueryClient();
  return useMutation<ApiResponse<BankAccount>, unknown, { uuid: string; body: BankAccountInput }>({
    mutationFn: ({ uuid, body }) => api.put(`/api/v1/my/payment-methods/bank-accounts/${uuid}`, body),
    onSuccess: () => qc.invalidateQueries({ queryKey: BANK_KEY }),
  });
}

export function useToggleBankAccountStatus() {
  const qc = useQueryClient();
  return useMutation<ApiResponse<BankAccount>, unknown, string>({
    mutationFn: (uuid) => api.patch(`/api/v1/my/payment-methods/bank-accounts/${uuid}/status`, {}),
    onSuccess: () => qc.invalidateQueries({ queryKey: BANK_KEY }),
  });
}

/** کارتِ بی‌محیط را به محیط فعال می‌چسباند؛ پیش از آن قابل ویرایش نیست. */
export function useAssignBankAccountEnvironment() {
  const qc = useQueryClient();
  return useMutation<ApiResponse<BankAccount>, unknown, string>({
    mutationFn: (uuid) => api.patch(`/api/v1/my/payment-methods/bank-accounts/${uuid}/environment`, {}),
    onSuccess: () => qc.invalidateQueries({ queryKey: BANK_KEY }),
  });
}

// ── POS devices ──────────────────────────────────────────────────────────────

export function usePosDevices() {
  return useQuery<ApiResponse<Pos[]>>({
    queryKey: POS_KEY,
    queryFn: () => api.get('/api/v1/my/payment-methods/pos'),
  });
}

export function useCreatePos() {
  const qc = useQueryClient();
  return useMutation<ApiResponse<Pos>, unknown, PosInput>({
    mutationFn: (body) => api.post('/api/v1/my/payment-methods/pos', body),
    onSuccess: () => qc.invalidateQueries({ queryKey: POS_KEY }),
  });
}

export function useUpdatePos() {
  const qc = useQueryClient();
  return useMutation<ApiResponse<Pos>, unknown, { uuid: string; body: PosInput }>({
    mutationFn: ({ uuid, body }) => api.put(`/api/v1/my/payment-methods/pos/${uuid}`, body),
    onSuccess: () => qc.invalidateQueries({ queryKey: POS_KEY }),
  });
}

export function useTogglePosStatus() {
  const qc = useQueryClient();
  return useMutation<ApiResponse<Pos>, unknown, string>({
    mutationFn: (uuid) => api.patch(`/api/v1/my/payment-methods/pos/${uuid}/status`, {}),
    onSuccess: () => qc.invalidateQueries({ queryKey: POS_KEY }),
  });
}

/** قرینهٔ useAssignBankAccountEnvironment برای کارت‌خوان. */
export function useAssignPosEnvironment() {
  const qc = useQueryClient();
  return useMutation<ApiResponse<Pos>, unknown, string>({
    mutationFn: (uuid) => api.patch(`/api/v1/my/payment-methods/pos/${uuid}/environment`, {}),
    onSuccess: () => qc.invalidateQueries({ queryKey: POS_KEY }),
  });
}
