// Imports here
import { ITestData } from "@business-logic/types/ITestData";
import { VehicleDamage, AppointmentType, VehicleLookupType } from "@business-logic/types/Enums";
import TestCase from "@business-logic/types/TestCase";
import { getNextWeekday } from "@impl/utils/DateUtils";
import { faker } from "@faker-js/faker";
import { defaultTestData } from "@business-logic/constants/DefaultTestData";

// Invalid zip (alert) - Combined test cases for all lookup types
const nextWeekday = getNextWeekday();

const baseInvalidZipData: Partial<ITestData> = {
    ...defaultTestData,  // Start with all defaults

    // Override specific fields with test-specific data
    customerDetails: {
        ...defaultTestData.customerDetails!,
        firstName: faker.person.firstName(),
        lastName: faker.person.lastName(),
        address: {
            street: faker.location.streetAddress(),
            city: 'Saco',
            state: 'Montana',
            postalCode: '99999',
            country: 'United States'
        }
    },
    vehicleDamage: [
        VehicleDamage.WindshieldCrack
    ],
    appointmentDetails: {
        serviceLocation: AppointmentType.DropOff,
        appointmentDate: nextWeekday
    },
    alertFlags: {
        isInvalidZip: true
    }
};

interface LookupTestCase {
    type: VehicleLookupType;
    vehicleDetails: {
        year: string;
        make: string;
        model: string;
        style: string;
        licensePlateNumber?: string;
        licensePlateState?: string;
        vin?: string;
    };
    enterFunnelWithZip?: boolean;
    customerDetails?: {
        address: {
            street: string;
            city: string;
            state: string;
            postalCode: string;
            country: string;
        };
    };
    tag: string;
    displayName: string;
}

const lookupTypesToTest: LookupTestCase[] = [
    {
        type: VehicleLookupType.Zip,
        displayName: 'Zip',
        tag: 'Zip',
        vehicleDetails: {
            year: '2020',
            make: 'Acura',
            model: 'ILX',
            style: '4 door sedan'
        }
    },
    {
        type: VehicleLookupType.LicensePlateNumber,
        displayName: 'License Plate',
        tag: 'Plate',
        vehicleDetails: {
            year: '2013',
            make: 'Hyundai',
            model: 'Sonata',
            style: '4 door sedan',
            licensePlateNumber: 'FTY 7776',
            licensePlateState: 'Texas'
        }
    },
    {
        type: VehicleLookupType.Vin,
        displayName: 'VIN',
        tag: 'Vin',
        vehicleDetails: {
            year: '2019',
            make: 'Toyota',
            model: 'C-HR',
            style: '4 door hatchback',
            vin: 'NMTKHMBX5KR086519'
        }
    }
];

const invalidZipTests: TestCase[] = [];

// Generate test cases for each lookup type
lookupTypesToTest.forEach((lookupType) => {
    const testData = {
        ...baseInvalidZipData,
        vehicleDetails: {
            ...lookupType.vehicleDetails,
            vehicleLookupType: lookupType.type
        }, 
        enterFunnelWithZip: lookupType.enterFunnelWithZip
    };

    // Handle special case for Address lookup which has different customer details
    if (lookupType.type === VehicleLookupType.Address && lookupType.customerDetails) {
        testData.customerDetails = {
            ...baseInvalidZipData.customerDetails!,
            address: lookupType.customerDetails.address
        };
    }

    const tc = new TestCase({
        name: `alert0006 ${lookupType.displayName} Lookup Invalid zip`,
        tags: ['@Alert', `@InvalidZip_${lookupType.tag}`, '@test_report'],
        testData: testData
    }, undefined, `InvalidZip_${lookupType.tag}`);

    invalidZipTests.push(tc);
});

export default invalidZipTests;