import { expect, type Locator, type Page } from '@playwright/test';
import { BasePage } from './BasePage';
import { IPaymentDetails } from 'safelite-playwright-core';

export class PaypalPage extends BasePage {
    readonly page: Page;
    readonly loginWithPasswordButton: Locator;
    readonly usernameTextBox: Locator;
    readonly nextButton: Locator;
    readonly usePasswordInsteadButton: Locator;
    readonly passwordTextBox: Locator;
    readonly paypalLoginButton: Locator;
    readonly completePurchaseButton: Locator;
    readonly payWithRadioButton: Locator;
    readonly payButton: Locator;
    readonly tryAnotherWayButton: Locator;

    constructor(page: Page) {
        super(page);
        this.page = page;
        this.usernameTextBox = page.locator('#email');
        this.nextButton = page.getByRole('button', { name: 'Next' });
        this.loginWithPasswordButton = page.getByRole('link', { name: 'Log in with a password instead' })
        this.usePasswordInsteadButton = page.getByRole('button', { name: 'Use password instead' });
        this.passwordTextBox = page.getByPlaceholder('Password');
        this.paypalLoginButton = page.getByRole('button', { name: 'Log In', exact: true });
        this.completePurchaseButton = page.getByTestId('submit-button-initial')
        this.payWithRadioButton = page.getByRole('button').filter({ hasText: 'Pay with' });
        this.payButton = page.locator('#one-time-cta');
        this.tryAnotherWayButton = page.getByRole('button', { name: 'Try another way' });
    }

    async completePaypalPurchase(paymentDetails: IPaymentDetails){
        // Wait for the PayPal login page to load
        await this.page.waitForFunction(() => window.location.href.includes('sandbox.paypal.com'), null, { timeout: 10000 });

        // handle flow with and without the "Log in with a password instead" link
        if (await this.loginWithPasswordButton.isVisible()) {
            await this.loginWithPasswordButton.click();
            await this.passwordTextBox.fill(paymentDetails.password!);
            await this.paypalLoginButton.click();
            await this.completePurchaseButton.click();
        } else {
            await this.usernameTextBox.fill(paymentDetails.username!);
            await this.nextButton.click();
            await this.tryAnotherWayButton.click();
            await this.usePasswordInsteadButton.click();
            await this.passwordTextBox.fill(paymentDetails.password!);
            await this.paypalLoginButton.click();
            await this.payWithRadioButton.click();
            await this.page.waitForTimeout(2000); // wait for 2 seconds to ensure the Pay button is clickable
            await this.payButton.dblclick();
        }
    }
}
