import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { toast } from 'sonner';
import { api, ApiError, type ApiResponse } from '../lib/api';
import type { Branch, BranchWorkingHours, Room, RoomPayload, WorkingHoursPayload } from '../types';

/**
 * «شعبه» یک جدول تازه نیست — همان آدرس محل نوبت‌دهی است (`doctor_addresses`).
 * ساخت/ویرایش نام و آدرس همان‌جایی انجام می‌شود که همیشه (جزئیات کلینیک/پزشک)؛
 * این هوک فقط چیزهای شعبه‌ای را می‌دهد: فعال/غیرفعال، منطقهٔ زمانی، ساعت کاری، اتاق.
 */
const BRANCHES_KEY = ['branches'];

function fail(e: unknown, fallback: string) {
  toast.error(e instanceof ApiError ? e.message : fallback);
}

export function useBranches() {
  const qc = useQueryClient();

  const query = useQuery({
    queryKey: BRANCHES_KEY,
    queryFn: () => api.get<ApiResponse<Branch[]>>('/api/v1/branches'),
  });

  const update = useMutation({
    mutationFn: ({ uuid, d }: { uuid: string; d: { active?: boolean; timezone?: string } }) =>
      api.patch<ApiResponse<Branch>>(`/api/v1/branch/${uuid}`, d),
    onSuccess: () => {
      toast.success('شعبه به‌روزرسانی شد');
      qc.invalidateQueries({ queryKey: BRANCHES_KEY });
    },
    onError: (e) => fail(e, 'به‌روزرسانی شعبه ناموفق بود'),
  });

  // پاسخِ غیرآرایه (خطای سرور، شکل دیگر) نباید صفحه را با «map is not a function»
  // بترکاند؛ فهرست خالی رفتار درست است.
  const branches = Array.isArray(query.data?.data) ? query.data.data : [];

  return { branches, loading: query.isLoading, update };
}

export function useBranchWorkingHours(branchUuid: string | undefined) {
  const qc = useQueryClient();
  const key = ['branch-working-hours', branchUuid];

  const query = useQuery({
    queryKey: key,
    queryFn: () => api.get<ApiResponse<BranchWorkingHours>>(`/api/v1/branch/${branchUuid}/working-hours`),
    enabled: !!branchUuid,
  });

  /** PUT قرارداد جایگزینی کامل دارد: آرایهٔ خالی یعنی شعبه بسته، نه «تغییری نده». */
  const save = useMutation({
    mutationFn: (days: WorkingHoursPayload) =>
      api.put<ApiResponse<BranchWorkingHours>>(`/api/v1/branch/${branchUuid}/working-hours`, { days }),
    onSuccess: () => {
      toast.success('ساعت کاری ذخیره شد');
      qc.invalidateQueries({ queryKey: key });
      qc.invalidateQueries({ queryKey: BRANCHES_KEY });
    },
    onError: (e) => fail(e, 'ذخیرهٔ ساعت کاری ناموفق بود'),
  });

  return { workingHours: query.data?.data, loading: query.isLoading, save };
}

export function useBranchRooms(branchUuid: string | undefined) {
  const qc = useQueryClient();
  const key = ['branch-rooms', branchUuid];

  const invalidate = () => {
    qc.invalidateQueries({ queryKey: key });
    qc.invalidateQueries({ queryKey: BRANCHES_KEY });
  };

  const query = useQuery({
    queryKey: key,
    queryFn: () => api.get<ApiResponse<Room[]>>(`/api/v1/branch/${branchUuid}/rooms`),
    enabled: !!branchUuid,
  });

  const create = useMutation({
    mutationFn: (d: RoomPayload) =>
      api.post<ApiResponse<Room>>('/api/v1/room', { ...d, address_uuid: branchUuid }),
    onSuccess: () => { toast.success('اتاق افزوده شد'); invalidate(); },
    onError: (e) => fail(e, 'افزودن اتاق ناموفق بود'),
  });

  const update = useMutation({
    mutationFn: ({ uuid, d }: { uuid: string; d: RoomPayload }) =>
      api.patch<ApiResponse<Room>>(`/api/v1/room/${uuid}`, d),
    onSuccess: () => { toast.success('اتاق به‌روزرسانی شد'); invalidate(); },
    onError: (e) => fail(e, 'به‌روزرسانی اتاق ناموفق بود'),
  });

  const remove = useMutation({
    mutationFn: (uuid: string) => api.delete<ApiResponse<null>>(`/api/v1/room/${uuid}`),
    onSuccess: () => { toast.success('اتاق حذف شد'); invalidate(); },
    onError: (e) => fail(e, 'حذف اتاق ناموفق بود'),
  });

  return { rooms: query.data?.data ?? [], loading: query.isLoading, create, update, remove };
}
