"""
导航测试模块
测试网站导航功能
"""

import pytest
from typing import Dict, Any

from pages.home_page import HomePage


class TestNavigation:
    """导航测试类"""
    
    @pytest.mark.navigation
    @pytest.mark.smoke
    def test_navigate_to_home(self, home_page: HomePage):
        """测试导航到首页"""
        home_page.navigate()
        home_page.assert_url_equals(home_page._get_full_url("/"))
    
    @pytest.mark.navigation
    @pytest.mark.smoke
    def test_navigate_to_contact_page(self, home_page: HomePage, contact_page):
        """测试导航到联系页面"""
        contact_page.navigate()
        contact_page.assert_url_equals(
            home_page._get_full_url("/contact")
        )
    
    @pytest.mark.navigation
    @pytest.mark.interactive
    def test_click_navigation_to_about(self, home_page: HomePage):
        """测试点击导航到关于区域"""
        home_page.navigate()
        home_page.click_navigation_link("about")
        home_page.assert_element_visible("#about", timeout=5000)
    
    @pytest.mark.navigation
    @pytest.mark.interactive
    def test_click_navigation_to_services(self, home_page: HomePage):
        """测试点击导航到服务区域"""
        home_page.navigate()
        home_page.click_navigation_link("services")
        home_page.assert_element_visible("#services", timeout=5000)
    
    @pytest.mark.navigation
    @pytest.mark.interactive
    def test_click_navigation_to_products(self, home_page: HomePage):
        """测试点击导航到产品区域"""
        home_page.navigate()
        home_page.click_navigation_link("products")
        home_page.assert_element_visible("#products", timeout=5000)
    
    @pytest.mark.navigation
    @pytest.mark.interactive
    def test_click_navigation_to_news(self, home_page: HomePage):
        """测试点击导航到新闻区域"""
        home_page.navigate()
        home_page.click_navigation_link("news")
        home_page.assert_element_visible("#news", timeout=5000)
    
    @pytest.mark.navigation
    @pytest.mark.interactive
    def test_click_navigation_to_contact(self, home_page: HomePage):
        """测试点击导航到联系区域"""
        home_page.navigate()
        home_page.click_navigation_link("contact")
        home_page.assert_element_visible("#contact", timeout=5000)
    
    @pytest.mark.navigation
    def test_smooth_scroll_to_section(self, home_page: HomePage):
        """测试平滑滚动到区域"""
        home_page.navigate()
        
        # 先滚动到页面底部
        home_page.scroll_to_bottom()
        
        # 然后滚动到顶部
        home_page.scroll_to_top()
        
        # 验证
        home_page.assert_element_visible("header")
    
    @pytest.mark.navigation
    def test_scroll_to_each_section(self, home_page: HomePage):
        """测试滚动到每个区域"""
        home_page.navigate()
        
        sections = ["home", "about", "services", "products", "news", "contact"]
        
        for section in sections:
            home_page.scroll_to_section(section)
            home_page.assert_element_visible(f"#{section}", timeout=5000)
    
    @pytest.mark.navigation
    def test_page_back(self, home_page: HomePage, contact_page):
        """测试返回上一页"""
        # 先访问联系页面
        contact_page.navigate()
        contact_page.assert_url_equals(home_page._get_full_url("/contact"))
        
        # 返回首页
        home_page.go_back()
        
        # 验证
        home_page.assert_url_equals(home_page._get_full_url("/"))
    
    @pytest.mark.navigation
    def test_page_forward(self, home_page: HomePage, contact_page):
        """测试前进到下一页"""
        # 访问首页
        home_page.navigate()
        
        # 后退（此时没有上一页，应该保持在首页）
        home_page.go_back()
        
        # 前进（此时没有下一页，应该保持在首页）
        home_page.go_forward()
        
        home_page.assert_url_equals(home_page._get_full_url("/"))
    
    @pytest.mark.navigation
    def test_page_reload(self, home_page: HomePage):
        """测试页面刷新"""
        home_page.navigate()
        home_page.reload()
        home_page.verify_page_loaded()
    
    @pytest.mark.navigation
    def test_navigation_link_count(self, home_page: HomePage):
        """测试导航链接数量"""
        home_page.navigate()
        
        nav_links = home_page._find_all("nav a")
        
        # 应该有6个导航链接
        assert len(nav_links) >= 5, f"导航链接数量不足，当前{len(nav_links)}个"
    
    @pytest.mark.navigation
    def test_navigation_link_text(self, home_page: HomePage):
        """测试导航链接文本"""
        home_page.navigate()
        
        expected_links = ["首页", "关于我们", "核心业务", "产品服务", "新闻动态", "联系我们"]
        
        for link_text in expected_links:
            link = home_page.page.locator(f"nav a:has-text('{link_text}')")
            assert link.count() > 0, f"未找到导航链接: {link_text}"
    
    @pytest.mark.navigation
    @pytest.mark.responsive
    def test_navigation_mobile(self, home_page: HomePage):
        """测试移动端导航"""
        # 设置移动端视口
        home_page.page.set_viewport_size({"width": 375, "height": 667})
        home_page.navigate()
        
        # 移动端应该显示汉堡菜单
        menu_button = home_page.page.locator("button:has-text('菜单'), .mobile-menu")
        
        if menu_button.count() > 0:
            home_page.logger.info("移动端显示汉堡菜单")
        else:
            home_page.logger.info("移动端导航可能已内联显示")
    
    @pytest.mark.navigation
    def test_url_hash_navigation(self, home_page: HomePage):
        """测试URL哈希导航"""
        home_page.navigate()
        
        # 直接访问带哈希的URL
        home_page.navigate(path="/#about")
        home_page.wait_for_load()
        
        # 验证滚动到指定区域
        home_page.assert_element_visible("#about", timeout=5000)
    
    @pytest.mark.navigation
    def test_browser_back_button(self, home_page: HomePage, contact_page):
        """测试浏览器后退按钮"""
        # 访问首页
        home_page.navigate()
        
        # 访问联系页面
        contact_page.navigate()
        
        # 使用浏览器后退
        home_page.page.go_back()
        
        # 验证返回首页
        home_page.assert_url_equals(home_page._get_full_url("/"))
    
    @pytest.mark.interactive
    def test_cta_button_navigation(self, home_page: HomePage):
        """测试CTA按钮导航"""
        home_page.navigate()
        
        # 查找CTA按钮（如果有）
        cta_button = home_page.page.locator(
            "a[href*='contact'], a.cta, a.button:has-text('联系')"
        )
        
        if cta_button.count() > 0:
            cta_button.first.click()
            home_page.wait_for_load()
            
            # 应该导航到联系区域
            home_page.assert_element_visible("#contact", timeout=5000)
