import { describe, it, expect } from 'vitest';

import { extractInquiryFields } from '@/lib/services/website-intake-fields';

describe('extractInquiryFields', () => {
  it('maps a berth inquiry payload (berth -> mooringNumber)', () => {
    const f = extractInquiryFields({
      first_name: 'Jane',
      last_name: 'Doe',
      email: 'jane@example.com',
      phone: '+15551234',
      berth: 'A1',
      interest: 'berths',
    });
    expect(f).toMatchObject({
      firstName: 'Jane',
      lastName: 'Doe',
      fullName: 'Jane Doe',
      email: 'jane@example.com',
      phone: '+15551234',
      mooringNumber: 'A1',
      placeOfResidence: null,
    });
  });

  it('maps a residence inquiry payload (address -> placeOfResidence, no mooring)', () => {
    const f = extractInquiryFields({
      first_name: 'Sam',
      last_name: 'Lee',
      email: 's@example.com',
      phone: '2',
      address: 'London',
      interest: 'residences',
    });
    expect(f.mooringNumber).toBeNull();
    expect(f.placeOfResidence).toBe('London');
    expect(f.fullName).toBe('Sam Lee');
  });

  it('maps residence_types[] + method_of_contact from the register form', () => {
    const f = extractInquiryFields({
      first_name: 'Mia',
      last_name: 'Ng',
      email: 'mia@example.com',
      interest: 'residences',
      residence_types: ['Two Bedroom Marina Villa', 'Five Bedroom Oceanfront Villa'],
      method_of_contact: 'phone',
    });
    expect(f.residenceTypes).toEqual(['Two Bedroom Marina Villa', 'Five Bedroom Oceanfront Villa']);
    expect(f.preferredContact).toBe('phone');
  });

  it('coerces a lone residence_types string to a single-item array and filters blanks', () => {
    const f = extractInquiryFields({
      residence_types: ['Two Bedroom Marina Villa', '', 7 as unknown as string],
      method_of_contact: 'EMAIL',
    });
    expect(f.residenceTypes).toEqual(['Two Bedroom Marina Villa']);
    expect(f.preferredContact).toBe('email');

    const single = extractInquiryFields({ residence_types: 'Four Bedroom Oceanfront Villa' });
    expect(single.residenceTypes).toEqual(['Four Bedroom Oceanfront Villa']);
  });

  it('maps a contact form payload (interest[] -> joined interestType + comments)', () => {
    const f = extractInquiryFields({
      first_name: 'Ann',
      last_name: 'Poe',
      email: 'a@example.com',
      interest: ['owner', 'broker'],
      comments: 'Please call me',
    });
    expect(f.interestType).toBe('owner, broker');
    expect(f.comments).toBe('Please call me');
    expect(f.phone).toBe('');
  });

  it('trims whitespace and degrades missing/garbage fields safely', () => {
    const f = extractInquiryFields({ first_name: '  Jo  ', last_name: 42 as unknown });
    expect(f.firstName).toBe('Jo');
    expect(f.fullName).toBe('Jo');
    expect(f.email).toBe('');
    expect(f.mooringNumber).toBeNull();
    expect(f.interestType).toBeNull();
  });

  it('returns all-empty for an empty payload', () => {
    expect(extractInquiryFields({})).toMatchObject({
      firstName: '',
      lastName: '',
      fullName: '',
      email: '',
      phone: '',
      mooringNumber: null,
      placeOfResidence: null,
      comments: null,
      interestType: null,
      residenceTypes: [],
      preferredContact: null,
    });
  });
});
