'use client';

import { useState, useEffect, useCallback } from 'react';
import {
  getEmailSettings,
  createEmailSetting,
  updateEmailSetting,
  deleteEmailSetting,
  sendTestEmail,
} from '@/lib/api/email-settings.api';
import { mapEmailSettingsApiResponse } from "@/lib/api/mappers/email-settings.mappers";
import type {
  EmailSettingRow,
  UpsertEmailSettingDto,
  SendTestDto,
} from '@/lib/api/types/email-settings.types';

// ─── useEmailSettings ─────────────────────────────────────────────────────────
export function useEmailSettings() {
  const [data,    setData]    = useState<EmailSettingRow[]>([]);
  const [loading, setLoading] = useState(false);
  const [error,   setError]   = useState<string | null>(null);

  const fetch = useCallback(() => {
    setLoading(true);
    setError(null);
    getEmailSettings()
      .then(rows => setData(mapEmailSettingsApiResponse(rows)))
      .catch((err: Error) => setError(err.message))
      .finally(() => setLoading(false));
  }, []);

  useEffect(() => { fetch(); }, [fetch]);

  return { data, loading, error, refresh: fetch };
}

// ─── useEmailSettingMutations ─────────────────────────────────────────────────
export function useEmailSettingMutations(onSuccess?: () => void) {
  const [saving,        setSaving]        = useState(false);
  const [deleting,      setDeleting]      = useState(false);
  const [testing,       setTesting]       = useState(false);
  const [mutationError, setMutationError] = useState<string | null>(null);

  const create = async (dto: UpsertEmailSettingDto) => {
    setSaving(true); setMutationError(null);
    try   { const r = await createEmailSetting(dto); onSuccess?.(); return r; }
    catch (err: any) { setMutationError(err.message); return null; }
    finally { setSaving(false); }
  };

  const update = async (id: number, dto: UpsertEmailSettingDto) => {
    setSaving(true); setMutationError(null);
    try   { const r = await updateEmailSetting(id, dto); onSuccess?.(); return r; }
    catch (err: any) { setMutationError(err.message); return null; }
    finally { setSaving(false); }
  };

  const remove = async (id: number) => {
    setDeleting(true); setMutationError(null);
    try   { await deleteEmailSetting(id); onSuccess?.(); return true; }
    catch (err: any) { setMutationError(err.message); return false; }
    finally { setDeleting(false); }
  };

  const sendTest = async (id: number, dto: SendTestDto) => {
    setTesting(true); setMutationError(null);
    try   { const r = await sendTestEmail(id, dto); return r; }
    catch (err: any) { setMutationError(err.message); return null; }
    finally { setTesting(false); }
  };

  return { create, update, remove, sendTest, saving, deleting, testing, mutationError };
}
