// 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";

// Vin not found (alert) - Combined test cases for all lookup types
const nextWeekday = getNextWeekday();

const baseVinNotFoundData: 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: 'Raleigh',
            state: 'North Carolina',
            postalCode: '44089',
            country: 'United States'
        }
    },
    vehicleDamage: [
        VehicleDamage.WindshieldCrack
    ],
    appointmentDetails: {
        serviceLocation: AppointmentType.DropOff,
        appointmentDate: nextWeekday
    },
    alertFlags: {
        isVinNotFound: 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.Address,
        displayName: 'Address',
        tag: 'Addr',
        vehicleDetails: {
            year: '2013',
            make: 'Hyundai',
            model: 'Sonata',
            style: '4 door sedan'
        },
        customerDetails: {
            address: {
                street: '4076 Spectacle Dr',
                city: 'Columbus',
                state: 'Ohio',
                postalCode: '59261',
                country: 'United States'
            }
        },
        enterFunnelWithZip: true
    },
    {
        type: VehicleLookupType.LicensePlateNumber,
        displayName: 'License Plate',
        tag: 'Plate',
        vehicleDetails: {
            year: '2013',
            make: 'Hyundai',
            model: 'Sonata',
            style: '4 door sedan',
            licensePlateNumber: '6WYN462',
            licensePlateState: 'Texas'
        }
    },
    {
        type: VehicleLookupType.Vin,
        displayName: 'VIN',
        tag: 'Vin',
        vehicleDetails: {
            year: '2019',
            make: 'Toyota',
            model: 'C-HR',
            style: '4 door hatchback',
            vin: '1MMHK8F81CGA45982'
        }
    }
];

const vinNotFoundTests: TestCase[] = [];

// Generate test cases for each lookup type
lookupTypesToTest.forEach((lookupType) => {
    const testData = {
        ...baseVinNotFoundData,
        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 = {
            ...baseVinNotFoundData.customerDetails!,
            address: lookupType.customerDetails.address
        };
    }

    const tc = new TestCase({
        name: `alert0007 ${lookupType.displayName} Lookup Vin Not Found`,
        tags: ['@Alert', `@VinNotFound_${lookupType.tag}`, '@test_report'],
        testData: testData
    }, undefined, `VinNotFound_${lookupType.tag}`);

    vinNotFoundTests.push(tc);
});

export default vinNotFoundTests;