 // src/client/entities/contractor/model/useContractorForm.ts
 // Hook for managing contractor form state and validation

 import { ref, computed } from 'vue';
 import type { ContractorUnifiedEntry, ContractorCreateRequest, ContractorUpdateRequest } from '@shared/contracts/contractors';
 import { formatPhoneNumberAsYouType, isValidPhoneNumber } from '@shared/utils/formatters';

 export function useContractorForm(initialItem: ContractorUnifiedEntry | null = null) {
   const formData = ref<ContractorCreateRequest>({
     name: initialItem?.name || '',
     category: initialItem?.category || '',
     contractNumber: initialItem?.contractNumber || '',
     // Strip leading + from phone if present (to avoid double + with visual prefix)
     phone: initialItem?.phone?.startsWith('+')
       ? initialItem.phone.substring(1)
       : (initialItem?.phone || ''),
     email: initialItem?.email || '',
     webLink: initialItem?.webLink || '',
     managerName: initialItem?.managerName || '',
     // Strip leading + from managerPhone if present (to avoid double + with visual prefix)
     managerPhone: initialItem?.managerPhone?.startsWith('+')
       ? initialItem.managerPhone.substring(1)
       : (initialItem?.managerPhone || ''),
     managerEmail: initialItem?.managerEmail || '',
     comment: initialItem?.comment || '',
   });

  const errors = ref<Record<string, string>>({});

  const isEditing = computed(() => !!initialItem);

  /**
   * Handle phone input - clean and format as user types
   * Takes event and field name to support both phone and managerPhone fields
   */
  function handlePhoneInput(event: Event, fieldName: 'phone' | 'managerPhone'): void {
    const target = event.target as HTMLInputElement;
    // Remove all "+" symbols first to ensure complete cleanup
    const valueWithoutPlus = target.value.replace(/\+/g, '');
    // Then format cleaned value
    formData.value[fieldName] = formatPhoneNumberAsYouType(valueWithoutPlus);
  }

  function validateForm(): boolean {
    errors.value = {};

    if (!formData.value.name.trim()) {
      errors.value.name = 'Название обязательно';
    }

    if (!formData.value.category.trim()) {
      errors.value.category = 'Категория обязательна';
    }

    if (!formData.value.phone.trim()) {
      errors.value.phone = 'Телефон обязателен';
    } else if (!isValidPhoneNumber(formData.value.phone)) {
      errors.value.phone = 'Номер телефона должен содержать от 10 до 15 цифр';
    }

    if (formData.value.email && !isValidEmail(formData.value.email)) {
      errors.value.email = 'Некорректный email';
    }

    if (formData.value.managerEmail && !isValidEmail(formData.value.managerEmail)) {
      errors.value.managerEmail = 'Некорректный email менеджера';
    }

    if (formData.value.webLink && !isValidUrl(formData.value.webLink)) {
      errors.value.webLink = 'Некорректный URL';
    }

    return Object.keys(errors.value).length === 0;
  }

  function resetForm() {
    formData.value = {
      name: initialItem?.name || '',
      category: initialItem?.category || '',
      contractNumber: initialItem?.contractNumber || null,
      // Strip leading + from phone if present (to avoid double + with visual prefix)
      phone: initialItem?.phone?.startsWith('+')
        ? initialItem.phone.substring(1)
        : (initialItem?.phone || ''),
      email: initialItem?.email || null,
      webLink: initialItem?.webLink || null,
      managerName: initialItem?.managerName || null,
      // Strip leading + from managerPhone if present (to avoid double + with visual prefix)
      managerPhone: initialItem?.managerPhone?.startsWith('+')
        ? initialItem.managerPhone.substring(1)
        : (initialItem?.managerPhone || null),
      managerEmail: initialItem?.managerEmail || null,
      comment: initialItem?.comment || null,
    };
    errors.value = {};
  }

  function getCreateRequest(): ContractorCreateRequest {
    return {
      name: formData.value.name.trim(),
      category: formData.value.category.trim(),
      contractNumber: formData.value.contractNumber || null,
      phone: formData.value.phone.trim(),
      email: formData.value.email || null,
      webLink: formData.value.webLink || null,
      managerName: formData.value.managerName || null,
      managerPhone: formData.value.managerPhone || null,
      managerEmail: formData.value.managerEmail || null,
      comment: formData.value.comment || null,
    };
  }

  function getUpdateRequest(): ContractorUpdateRequest {
    return {
      name: formData.value.name || undefined,
      category: formData.value.category || undefined,
      contractNumber: formData.value.contractNumber || null,
      phone: formData.value.phone || undefined,
      email: formData.value.email || null,
      webLink: formData.value.webLink || null,
      managerName: formData.value.managerName || null,
      managerPhone: formData.value.managerPhone || null,
      managerEmail: formData.value.managerEmail || null,
      comment: formData.value.comment || null,
    };
  }

  return {
    formData,
    errors,
    isEditing,
    validateForm,
    resetForm,
    getCreateRequest,
    getUpdateRequest,
    handlePhoneInput,
  };
}

function isValidEmail(email: string): boolean {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

function isValidUrl(url: string): boolean {
  try {
    new URL(url);
    return true;
  } catch {
    return false;
  }
}
