import { describe, it, expect } from 'vitest';
import {
    changeNumToDefault,
    formatPhoneNumber,
    validatePhoneNumber,
    isValidIranNationalCode,
    getCleanNumberValue,
    imageUrl,
    QueryForDoctorsFilter,
} from '@/helper';

describe('changeNumToDefault', () => {
    it('رقم فارسی و عربی → انگلیسی', () => {
        expect(changeNumToDefault('۰۹۱۲')).toBe('0912');
        expect(changeNumToDefault('٠٩١٢')).toBe('0912');
    });
    it('ورودی falsy → رشته خالی', () => {
        expect(changeNumToDefault('')).toBe('');
        expect(changeNumToDefault(null)).toBe('');
    });
});

describe('formatPhoneNumber', () => {
    it('۹ رقم را به فرمت "## ### ####" در می‌آورد', () => {
        expect(formatPhoneNumber('912345678')).toBe('91 234 5678');
    });
    it('رقم فارسی را نرمال و به ۹ رقم محدود می‌کند', () => {
        expect(formatPhoneNumber('۰۹۱۲۳۴۵۶۷۸۹')).toBe('09 123 4567');
    });
    it('کاراکترهای غیررقمی را حذف می‌کند', () => {
        expect(formatPhoneNumber('912-345-678')).toBe('91 234 5678');
    });
});

describe('validatePhoneNumber', () => {
    it.each([
        ['09123456789', true],
        ['9123456789', false],
        ['08123456789', false],
        ['0912345678', false],
        ['', false],
    ])('%s → valid=%s', (input, valid) => {
        expect(validatePhoneNumber(input).valid).toBe(valid);
    });
    it('رقم غیرانگلیسی → پیام مخصوص', () => {
        const r = validatePhoneNumber('۰۹۱۲۳۴۵۶۷۸۹');
        expect(r.valid).toBe(false);
        expect(r.text).toBe('فقط از اعداد انگلیسی استفاده کنید.');
    });
    it('ورودی معتبر → text=null', () => {
        expect(validatePhoneNumber('09123456789')).toEqual({ valid: true, text: null });
    });
});

describe('isValidIranNationalCode', () => {
    it('کدملی معتبر را می‌پذیرد', () => {
        expect(isValidIranNationalCode('0013542419')).toBe(true);
    });
    it.each([
        ['1111111111', false], // ارقام یکسان
        ['123', false], // طول نادرست
        ['0013542410', false], // رقم کنترلی غلط
        ['', false],
    ])('%s → %s', (input, expected) => {
        expect(isValidIranNationalCode(input)).toBe(expected);
    });
});

describe('getCleanNumberValue', () => {
    it('رقم فارسی + جداکننده → عدد', () => {
        expect(getCleanNumberValue('۱۲۳۴')).toBe(1234);
    });
    it('اعشار را حفظ می‌کند', () => {
        expect(getCleanNumberValue('12.5')).toBe(12.5);
    });
    it('ورودی نامعتبر → مقدار پیش‌فرض', () => {
        expect(getCleanNumberValue('abc')).toBe(0);
        expect(getCleanNumberValue('abc', 7)).toBe(7);
    });
});

describe('imageUrl', () => {
    it('URL مطلق دست‌نخورده', () => {
        expect(imageUrl('https://x.com/a.jpg')).toBe('https://x.com/a.jpg');
    });
    it('/uploads با NEXT_PUBLIC_API_URL پیشوند می‌گیرد', () => {
        expect(imageUrl('/uploads/a.jpg')).toBe('http://api.test.local/uploads/a.jpg');
    });
    it('مسیر /assets دست‌نخورده', () => {
        expect(imageUrl('/assets/images/x.png')).toBe('/assets/images/x.png');
    });
    it('خالی → fallback', () => {
        expect(imageUrl('')).toBe('/assets/images/user.png');
    });
});

describe('QueryForDoctorsFilter', () => {
    it('فیلدهای معتبر را نگاشت و فیلدهای پیش‌فرض را حذف می‌کند', () => {
        const q = QueryForDoctorsFilter({
            active: 1,
            specialty: { name: 'قلب' },
            city: { name: 'یزد' },
            gender: 'مرد',
            degree: 'همه موارد', // باید حذف شود
            name: '   ', // باید حذف شود
            sort: 4,
        });
        expect(q).toEqual({ active: 1, specialty: 'قلب', city: 'یزد', gender: 'مرد', sort: 4 });
    });
    it('gender «هر دو» و sort خارج از 3..5 حذف می‌شوند', () => {
        const q = QueryForDoctorsFilter({ gender: 'هر دو', sort: 9 });
        expect(q.gender).toBeUndefined();
        expect(q.sort).toBeUndefined();
    });
});
