import { describe, it, expect } from 'vitest';
import {
    tsToDateStr,
    dateStrToTs,
    profileToFormValues,
    formValuesToPayload,
} from '@/lib/patientForm';
import type { PatientProfile } from '@/types';
import type { PatientFormValues } from '@/components/PatientRecordInfoForm';

describe('date helpers', () => {
    it('timestamp ↔ YYYY-MM-DD رفت‌وبرگشت', () => {
        const ts = dateStrToTs('2025-01-07');
        expect(ts).toBe(Math.floor(Date.parse('2025-01-07T00:00:00Z') / 1000));
        expect(tsToDateStr(ts)).toBe('2025-01-07');
    });
    it('خالی/نامعتبر → مقدار تهی', () => {
        expect(tsToDateStr(null)).toBe('');
        expect(tsToDateStr(0)).toBe('');
        expect(dateStrToTs('')).toBeNull();
    });
});

describe('profileToFormValues', () => {
    it('فیلدهای جدید و تاریخ را درست مپ می‌کند', () => {
        const p: PatientProfile = {
            name: 'ساغر', fathers_name: 'رضا', national_code: '0012345678',
            date_of_birth: dateStrToTs('2000-05-10')!, field_of_study: 'نرم‌افزار',
            province_id: 8, city_id: 42, postal_code: '8913746351',
            referral_source: 'اینستاگرام', description: 'توضیح', mobile: '09131234567',
        };
        const v = profileToFormValues(p);
        expect(v.name).toBe('ساغر');
        expect(v.fathers_name).toBe('رضا');
        expect(v.birth_date).toBe('2000-05-10');
        expect(v.province_id).toBe(8);
        expect(v.city_id).toBe(42);
        expect(v.referral_source).toBe('اینستاگرام');
    });
    it('پروفایل تهی → مقادیر پیش‌فرض امن', () => {
        const v = profileToFormValues(null);
        expect(v.name).toBe('');
        expect(v.birth_date).toBe('');
        expect(v.province_id).toBeNull();
    });
});

describe('formValuesToPayload', () => {
    const base: PatientFormValues = {
        name: 'ساغر', mobile: '', national_code: '0012345678', gender: 'female',
        birth_date: '2000-05-10', fathers_name: 'رضا', marital_status: 'single',
        basic_insurance_id: '3', field_of_study: 'نرم‌افزار', education: 'کارشناسی',
        job: 'مهندس', province_id: 8, city_id: '42', home_phone: '', address: 'یزد',
        postal_code: '8913746351', referral_source: 'اینستاگرام', description: '',
    };

    it('تاریخ به timestamp و idها به عدد تبدیل می‌شوند', () => {
        const out = formValuesToPayload(base);
        expect(out.date_of_birth).toBe(dateStrToTs('2000-05-10'));
        expect(out.basic_insurance_id).toBe(3);
        expect(out.province_id).toBe(8);
        expect(out.city_id).toBe(42);
    });

    it('موبایل خالی ارسال نمی‌شود؛ موبایل پرشده ارسال می‌شود', () => {
        expect('mobile' in formValuesToPayload(base)).toBe(false);
        const withMobile = formValuesToPayload({ ...base, mobile: '09131234567' });
        expect(withMobile.mobile).toBe('09131234567');
    });

    it('id خالی → null', () => {
        const out = formValuesToPayload({ ...base, basic_insurance_id: null, province_id: '' });
        expect(out.basic_insurance_id).toBeNull();
        expect(out.province_id).toBeNull();
    });
});
