import { Schema } from './validationSchema';
import { validate } from './validate';
import { testZodSchema } from './zodSchema';

const testData = {
    name: "John Doe",
    age: 30,
    email: "john.doe@example.com",
    address: {
        street: "123 Main St",
        city: "Metropolis",
        postalCode: "12345",
        country: "USA",
        coordinates: {
            latitude: 40.7128,
            longitude: -74.0060,
        },
    },
    phoneNumbers: [
        { type: "mobile", number: "+1-202-555-0173" },
        { type: "home", number: "+1-202-555-0193" },
    ],
    roles: ["admin", "user", "editor"],
    preferences: {
        theme: "dark",
        notifications: {
            email: true,
            sms: false,
            push: true,
        },
        language: "en-US",
        currency: "USD",
    },
    orders: [
        {
            id: "order_001",
            items: [
                { productId: "p001", quantity: 2, price: 19.99 },
                { productId: "p002", quantity: 1, price: 49.99 },
            ],
            total: 89.97,
            status: "shipped",
            shipment: {
                trackingNumber: "1Z999AA10123456784",
                carrier: "UPS",
                estimatedDelivery: "2024-10-25",
                address: {
                    street: "123 Main St",
                    city: "Metropolis",
                    postalCode: "12345",
                    country: "USA",
                },
            },
        },
        {
            id: "order_002",
            items: [
                { productId: "p003", quantity: 5, price: 5.99 },
                { productId: "p004", quantity: 3, price: 29.99 },
            ],
            total: 149.92,
            status: "processing",
            shipment: null,
        },
    ],
    metadata: {
        createdAt: "2023-10-22T10:00:00Z",
        updatedAt: "2024-10-15T14:30:00Z",
        tags: ["new", "vip", "frequent-buyer"],
    },
    socialAccounts: [
        {
            platform: "twitter",
            username: "@johndoe",
            followers: 1500,
            verified: true,
        },
        {
            platform: "linkedin",
            username: "john-doe",
            connections: 500,
            verified: false,
        },
    ],
    documents: {
        passport: {
            number: "A12345678",
            issuedDate: "2018-05-20",
            expiryDate: "2028-05-20",
            country: "USA",
        },
        driverLicense: {
            number: "D12345678",
            issuedDate: "2016-11-15",
            expiryDate: "2026-11-15",
            state: "NY",
        },
    },
    purchaseHistory: Array.from({ length: 1000 }, (_, index) => ({
        purchaseId: `purchase_${index + 1}`,
        date: `2024-01-${(index % 30) + 1}`,
        amount: Math.random() * 100,
        product: `Product ${index + 1}`,
        status: index % 2 === 0 ? "completed" : "pending",
    })),
};

function measureValidation() {

    const customSchema: Schema = {
        name: {
            required: true,
            type: "string",
            minLength: 1,
            maxLength: 100,
        },
        age: {
            required: true,
            type: "number",
            min: 0,
            max: 120,
        },
        email: {
            required: true,
            type: "string",
            pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
        },
        address: {
            required: true,
            type: "object",
            properties: {
                street: { required: true, type: "string" },
                city: { required: true, type: "string" },
                postalCode: { required: true, type: "string" },
                country: { required: true, type: "string" },
                coordinates: {
                    required: true,
                    type: "object",
                    properties: {
                        latitude: { required: true, type: "number", min: -90, max: 90 },
                        longitude: { required: true, type: "number", min: -180, max: 180 },
                    },
                },
            },
        },
        phoneNumbers: {
            required: true,
            type: "array",
            properties: {
                type: { required: true, type: "string", enum: ["mobile", "home", "work"] },
                number: { required: true, type: "string" },
            },
        },
        roles: {
            required: true,
            type: "array:string",
            enum: ["admin", "user", "editor", "guest"],
        },
        preferences: {
            required: true,
            type: "object",
            properties: {
                theme: { required: true, type: "string", enum: ["dark", "light"] },
                notifications: {
                    required: true,
                    type: "object",
                    properties: {
                        email: { required: true, type: "boolean" },
                        sms: { required: true, type: "boolean" },
                        push: { required: true, type: "boolean" },
                    },
                },
                language: { required: true, type: "string" },
                currency: { required: true, type: "string" },
            },
        },
        orders: {
            required: true,
            type: "array",
            properties: {
                id: { required: true, type: "string" },
                items: {
                    required: true,
                    type: "array",
                    properties: {
                        productId: { required: true, type: "string" },
                        quantity: { required: true, type: "number", min: 1 },
                        price: { required: true, type: "number", min: 0 },
                    },
                },
                total: { required: true, type: "number", min: 0 },
                status: { required: true, type: "string", enum: ["shipped", "processing", "cancelled"] },
                shipment: {
                    required: false,
                    type: "object",
                    properties: {
                        trackingNumber: { required: true, type: "string" },
                        carrier: { required: true, type: "string" },
                        estimatedDelivery: { required: true, type: "date" },
                        address: {
                            required: true,
                            type: "object",
                            properties: {
                                street: { required: true, type: "string" },
                                city: { required: true, type: "string" },
                                postalCode: { required: true, type: "string" },
                                country: { required: true, type: "string" },
                            },
                        },
                    },
                },
            },
        },
        metadata: {
            required: true,
            type: "object",
            properties: {
                createdAt: { required: true, type: "date" },
                updatedAt: { required: true, type: "date" },
                tags: {
                    required: true,
                    type: "array:string",
                },
            },
        },
        socialAccounts: {
            required: true,
            type: "array",
            properties: {
                platform: { required: true, type: "string" },
                username: { required: true, type: "string" },
                followers: { required: false, type: "number", min: 0 },
                connections: { required: false, type: "number", min: 0 },
                verified: { required: true, type: "boolean" },
            },
        },
        documents: {
            required: true,
            type: "object",
            properties: {
                passport: {
                    required: true,
                    type: "object",
                    properties: {
                        number: { required: true, type: "string" },
                        issuedDate: { required: true, type: "date" },
                        expiryDate: { required: true, type: "date" },
                        country: { required: true, type: "string" },
                    },
                },
                driverLicense: {
                    required: true,
                    type: "object",
                    properties: {
                        number: { required: true, type: "string" },
                        issuedDate: { required: true, type: "date" },
                        expiryDate: { required: true, type: "date" },
                        state: { required: true, type: "string" },
                    },
                },
            },
        },
        purchaseHistory: {
            required: true,
            type: "array",
            properties: {
                purchaseId: { required: true, type: "string" },
                date: { required: true, type: "date" },
                amount: { required: true, type: "number", min: 0 },
                product: { required: true, type: "string" },
                status: { required: true, type: "string", enum: ["completed", "pending"] },
            },
        },
    };
    

    console.time('Custom Validation');
    const customErrors = validate(customSchema, testData);
    console.timeEnd('Custom Validation');
    console.log('Custom Validation Errors:', customErrors);

    // Measure Zod validation
    console.time('Zod Validation');
    const zodErrors = testZodSchema.safeParse(testData);
    console.timeEnd('Zod Validation');

    if (!zodErrors.success) {
        console.log('Zod Validation Errors:', zodErrors.error.errors);
    } else {
        console.log('Zod Validation Success:', zodErrors.data);
    }
}

measureValidation();
