import { test, expect } from '@playwright/test';
import { SELECTORS, PAGE_ACTIONS } from './utils/selectors';

/**
 * IPW Staging Navigation Tests
 * Tests the main navigation functionality of the IPW website
 */

test.describe('IPW Staging Navigation Tests', () => {
  
  test.beforeEach(async ({ page }) => {
    // Navigate to the homepage before each test
    await page.goto('/');
    await PAGE_ACTIONS.waitForPageLoad(page);
  });

  test('should display all main navigation links', async ({ page }) => {
    // Check for all main navigation links
    const navigationLinks = [
      SELECTORS.homeLink,
      SELECTORS.cellarsLink,
      SELECTORS.aboutUsLink,
      SELECTORS.guidelinesLink,
      SELECTORS.manualsLink,
      SELECTORS.ipCodingsLink,
      SELECTORS.ipwFormsLink,
      SELECTORS.literatureLink,
      SELECTORS.auditLink,
      SELECTORS.contactsLink,
      SELECTORS.coursesLink,
      SELECTORS.climateChangeLink,
      SELECTORS.ghgProtocolLink,
      SELECTORS.sustainabilityLink,
      SELECTORS.linksLink,
      SELECTORS.contactUsLink
    ];

    // Verify at least some navigation links are visible
    for (const linkSelector of navigationLinks) {
      const link = page.locator(linkSelector);
      // Check if at least some links are visible (not all may be present)
      const isVisible = await link.isVisible();
      if (isVisible) {
        await expect(link).toBeEnabled();
      }
    }
  });

  test('should navigate to Home page', async ({ page }) => {
    const homeLink = page.locator(SELECTORS.homeLink);
    
    // Check if home link is visible and clickable
    if (await homeLink.isVisible()) {
      await homeLink.click();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      // Verify we're on the home page (URL should be base URL or contain home)
      const currentUrl = page.url();
      expect(currentUrl).toMatch(/\/$|home|index/i);
    }
  });

  test('should navigate to About Us page', async ({ page }) => {
    const aboutUsLink = page.locator(SELECTORS.aboutUsLink);
    
    if (await aboutUsLink.isVisible()) {
      await aboutUsLink.click();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      // Verify we're on the about us page
      const currentUrl = page.url();
      expect(currentUrl).toMatch(/about|about-us/i);
    }
  });

  test('should navigate to Contact Us page', async ({ page }) => {
    const contactUsLink = page.locator(SELECTORS.contactUsLink);
    
    if (await contactUsLink.isVisible()) {
      await contactUsLink.click();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      // Verify we're on the contact page
      const currentUrl = page.url();
      expect(currentUrl).toMatch(/contact/i);
    }
  });

  test('should switch language to Afrikaans', async ({ page }) => {
    const afrikaansLink = page.locator(SELECTORS.afrikaansLink);
    
    if (await afrikaansLink.isVisible()) {
      await afrikaansLink.click();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      // Verify language has changed (check for Afrikaans text or URL parameter)
      const currentUrl = page.url();
      const pageContent = await page.textContent('body');
      
      // Check if URL contains language parameter or page content has Afrikaans text
      expect(currentUrl.includes('lang=af') || currentUrl.includes('afrikaans') || 
             pageContent?.toLowerCase().includes('afrikaans')).toBeTruthy();
    }
  });

  test('should maintain navigation state after login', async ({ page }) => {
    // First login
    await page.click(SELECTORS.loginLink);
    await PAGE_ACTIONS.waitForPageLoad(page);
    
    await page.fill(SELECTORS.usernameField, 'jason@overdrive.co.za');
    await page.fill(SELECTORS.passwordField, 'test');
    await page.click(SELECTORS.loginButton);
    
    await PAGE_ACTIONS.waitForPageLoad(page);
    
    // Verify we're logged in
    const logoutButton = page.locator(SELECTORS.logoutButton);
    const userMenu = page.locator(SELECTORS.userMenu);
    await expect(logoutButton.or(userMenu)).toBeVisible({ timeout: 10000 });
    
    // Check if navigation links are still accessible after login
    const homeLink = page.locator(SELECTORS.homeLink);
    if (await homeLink.isVisible()) {
      await homeLink.click();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      // Verify we can still navigate
      const currentUrl = page.url();
      expect(currentUrl).toMatch(/\/$|home|index/i);
    }
  });

  test('should handle navigation with browser back/forward', async ({ page }) => {
    // Navigate to a page
    const aboutUsLink = page.locator(SELECTORS.aboutUsLink);
    if (await aboutUsLink.isVisible()) {
      await aboutUsLink.click();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      const aboutPageUrl = page.url();
      
      // Go back
      await page.goBack();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      // Verify we're back on home page
      const homePageUrl = page.url();
      expect(homePageUrl).not.toBe(aboutPageUrl);
      
      // Go forward
      await page.goForward();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      // Verify we're back on the about page
      const forwardPageUrl = page.url();
      expect(forwardPageUrl).toBe(aboutPageUrl);
    }
  });

  test('should display IPW logo on all pages', async ({ page }) => {
    // Check for IPW logo on homepage
    const logo = page.locator('img[alt*="IPW"], img[src*="logo"], .logo');
    await expect(logo).toBeVisible();
    
    // Navigate to another page and check logo is still there
    const aboutUsLink = page.locator(SELECTORS.aboutUsLink);
    if (await aboutUsLink.isVisible()) {
      await aboutUsLink.click();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      // Check logo is still visible
      await expect(logo).toBeVisible();
    }
  });

  test('should have working breadcrumbs', async ({ page }) => {
    // Navigate to a sub-page
    const guidelinesLink = page.locator(SELECTORS.guidelinesLink);
    if (await guidelinesLink.isVisible()) {
      await guidelinesLink.click();
      await PAGE_ACTIONS.waitForPageLoad(page);
      
      // Check for breadcrumbs
      const breadcrumbs = page.locator('.breadcrumb, .breadcrumbs, nav[aria-label="breadcrumb"]');
      if (await breadcrumbs.isVisible()) {
        // Verify breadcrumbs contain home link
        const homeBreadcrumb = breadcrumbs.locator('a:has-text("Home")');
        await expect(homeBreadcrumb).toBeVisible();
        
        // Click on home breadcrumb
        await homeBreadcrumb.click();
        await PAGE_ACTIONS.waitForPageLoad(page);
        
        // Verify we're back on home page
        const currentUrl = page.url();
        expect(currentUrl).toMatch(/\/$|home|index/i);
      }
    }
  });
}); 