// TODO: Edit Billable Rate
// TODO: Resend Email Invitation
// TODO: Remove Invitation
import { expect, test } from '../playwright/fixtures';
import { PLAYWRIGHT_BASE_URL } from '../playwright/config';

async function goToMembersPage(page) {
    await page.goto(PLAYWRIGHT_BASE_URL + '/members');
}

async function openInviteMemberModal(page) {
    await Promise.all([
        page.getByRole('button', { name: 'Invite Member' }).click(),
        expect(page.getByPlaceholder('Member Email')).toBeVisible(),
    ]);
}

test('test that new manager can be invited', async ({ page }) => {
    await goToMembersPage(page);
    await openInviteMemberModal(page);
    const editorId = Math.round(Math.random() * 10000);
    await page.getByLabel('Email').fill(`new+${editorId}@editor.test`);
    await page.getByRole('button', { name: 'Manager' }).click();
    await Promise.all([
        page
            .getByRole('button', { name: 'Invite Member', exact: true })
            .click(),
        expect(page.getByRole('main')).toContainText(
            `new+${editorId}@editor.test`
        ),
    ]);
});

test('test that new employee can be invited', async ({ page }) => {
    await goToMembersPage(page);
    await openInviteMemberModal(page);
    const editorId = Math.round(Math.random() * 10000);
    await page.getByLabel('Email').fill(`new+${editorId}@editor.test`);
    await page.getByRole('button', { name: 'Employee' }).click();
    await Promise.all([
        page
            .getByRole('button', { name: 'Invite Member', exact: true })
            .click(),
        await expect(page.getByRole('main')).toContainText(
            `new+${editorId}@editor.test`
        ),
    ]);
});

test('test that new admin can be invited', async ({ page }) => {
    await goToMembersPage(page);
    await openInviteMemberModal(page);
    const adminId = Math.round(Math.random() * 10000);
    await page.getByLabel('Email').fill(`new+${adminId}@admin.test`);
    await page.getByRole('button', { name: 'Administrator' }).click();
    await Promise.all([
        page
            .getByRole('button', { name: 'Invite Member', exact: true })
            .click(),
        expect(page.getByRole('main')).toContainText(
            `new+${adminId}@admin.test`
        ),
    ]);
});
test('test that error shows if no role is selected', async ({ page }) => {
    await goToMembersPage(page);
    await openInviteMemberModal(page);
    const noRoleId = Math.round(Math.random() * 10000);

    await page.getByLabel('Email').fill(`new+${noRoleId}@norole.test`);
    await Promise.all([
        page
            .getByRole('button', { name: 'Invite Member', exact: true })
            .click(),
        expect(page.getByText('Please select a role')).toBeVisible(),
    ]);
});

test('test that organization billable rate can be updated with all existing time entries', async ({
    page,
}) => {
    await goToMembersPage(page);
    const newBillableRate = Math.round(Math.random() * 10000);
    await page.getByRole('row').first().getByRole('button').click();
    await page.getByRole('button').getByText('Edit').first().click();
    await page.getByText('Organization Default Rate').click();
    await page.getByText('Custom Rate').click();
    await page
        .getByPlaceholder('Billable Rate')
        .fill(newBillableRate.toString());
    await page.getByRole('button', { name: 'Update Member' }).click();

    await Promise.all([
        page.getByRole('button', { name: 'Yes, update existing time' }).click(),
        page.waitForRequest(
            async (request) =>
                request.url().includes('/members/') &&
                request.method() === 'PUT' &&
                request.postDataJSON().billable_rate === newBillableRate * 100
        ),
        page.waitForResponse(
            async (response) =>
                response.url().includes('/organizations/') &&
                response.request().method() === 'PUT' &&
                response.status() === 200 &&
                (await response.json()).data.billable_rate ===
                    newBillableRate * 100
        ),
    ]);
});
