"""航空公司情感分析系统"""

import pandas as pd
import streamlit as st
import plotly.express as px
import plotly.graph_objects as go
from pathlib import Path
import sys
import requests
import matplotlib.pyplot as plt

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 添加项目根目录到Python路径
sys.path.insert(0, str(Path(__file__).parent))

# 从当前目录导入模块（使用绝对导入）
from data_overview import DataOverview
from model_evaluation import show_model_evaluation
from smart_customer_service import show_smart_customer_service

# 导入新模块
from polars_data_processor import PolarsDataProcessor
from airline_crisis_agent import AirlineCrisisAgent

# 尝试导入危机预警模块
try:
    from crisis_warning_app import CrisisWarningApp
    CRISIS_WARNING_AVAILABLE = True
except ImportError as e:
    CRISIS_WARNING_AVAILABLE = False
    print(f"危机预警模块导入失败: {e}")


# 页面配置
st.set_page_config(
    page_title="航空公司情感分析系统",
    page_icon="✈️",
    layout="wide",
    initial_sidebar_state="expanded"
)


def load_data():
    """加载数据"""
    try:
        # 直接使用DataOverview加载数据
        data_overview = DataOverview("data/Tweets.csv")
        return data_overview.df
    except Exception as e:
        st.error(f"数据加载失败: {e}")
        return None


def main():
    """主函数"""
    
    # 全局样式 - 动态背景元素
    st.markdown("""
    <div class="cloud" style="position: absolute; width: 80px; height: 50px; top: 40%; left: 30%; animation: cloudFloat 15s ease-in-out infinite; background: rgba(255, 255, 255, 0.7); border-radius: 50%; filter: blur(12px); z-index: 1;"></div>
    <div class="cloud" style="position: absolute; width: 60px; height: 40px; top: 80%; right: 30%; animation: cloudFloat 18s ease-in-out infinite reverse; background: rgba(255, 255, 255, 0.7); border-radius: 50%; filter: blur(12px); z-index: 1;"></div>
    <div class="plane" style="position: absolute; top: 30%; animation-delay: 5s; font-size: 30px; z-index: 2; animation: planeFly 30s linear infinite;">✈️</div>
    <div class="plane" style="position: absolute; top: 50%; font-size: 25px; animation-duration: 40s; animation-delay: 15s; z-index: 2; animation: planeFly 30s linear infinite;">✈️</div>
    <div class="route" style="position: absolute; width: 200px; top: 30%; left: 0%; animation: routeMove 10s linear infinite; height: 2px; background: linear-gradient(90deg, transparent, #0066cc, transparent); background-size: 200% 100%; z-index: 1; opacity: 0.5;"></div>
    <div class="route" style="position: absolute; width: 150px; top: 70%; left: 50%; animation: routeMove 8s linear infinite reverse; height: 2px; background: linear-gradient(90deg, transparent, #0066cc, transparent); background-size: 200% 100%; z-index: 1; opacity: 0.5;"></div>
    """, unsafe_allow_html=True)
    
    # 侧边栏 - 航空主题导航
    with st.sidebar:
        # 全局样式 - 撞色版
        st.markdown("""
        <style>
            /* 侧边栏背景 - 深蓝色渐变 */
            [data-testid="stSidebar"] {
                background: linear-gradient(135deg, #003366 0%, #001a33 100%);
                padding: 0 !important;
                overflow-y: auto !important;
                max-height: 100vh !important;
                position: relative !important;
                z-index: 100 !important;
            }
            
            /* 侧边栏内容容器 */
            [data-testid="stSidebarContent"] {
                padding: 1rem !important;
                overflow-y: auto !important;
                max-height: calc(100vh - 2rem) !important;
            }
            
            /* 按钮样式 - 橙色撞色 */
            .stButton > button {
                background: linear-gradient(135deg, #ff6b35 0%, #f7931e 100%);
                color: white;
                border-radius: 8px;
                border: none;
                padding: 10px 15px;
                font-weight: bold;
                transition: all 0.3s ease;
                width: 100%;
                margin: 5px 0;
                box-shadow: 0 4px 8px rgba(255,107,53,0.2);
            }
            
            .stButton > button:hover {
                background: linear-gradient(135deg, #f7931e 0%, #ff6b35 100%);
                transform: translateY(-2px);
                box-shadow: 0 6px 12px rgba(255,107,53,0.3);
            }
            
            /* 选择框样式 */
            .stSelectbox > div > div {
                background: white;
                border-radius: 8px;
                border: 2px solid #e6f3ff;
                box-shadow: 0 2px 4px rgba(0,0,0,0.1);
                transition: all 0.3s ease;
            }
            
            .stSelectbox > div > div:hover {
                border-color: #ff6b35;
                box-shadow: 0 4px 8px rgba(255,107,53,0.15);
            }
            
            /* Radio按钮样式 */
            .stRadio > div {
                display: flex;
                flex-direction: column;
                gap: 10px;
            }
            
            .stRadio > div > label {
                display: flex;
                align-items: center;
                padding: 12px 15px;
                border-radius: 8px;
                transition: all 0.3s ease;
                cursor: pointer;
                border: 2px solid transparent;
                background: rgba(255,255,255,0.1);
            }
            
            .stRadio > div > label:hover {
                background: rgba(255,255,255,0.2);
                border-color: #ff6b35;
                transform: translateY(-2px);
            }
            
            .stRadio > div > label > div:first-child {
                margin-right: 12px;
            }
            
            .stRadio > div > label > div:last-child {
                font-size: 14px;
                color: #ffffff;
            }
            
            /* 选中的Radio样式 - 橙色撞色 */
            .stRadio > div > label[data-selected="true"] {
                background: linear-gradient(135deg, #ff6b35 0%, #f7931e 100%);
                border-color: #ffffff;
                font-weight: 500;
                box-shadow: 0 4px 8px rgba(255,107,53,0.3);
            }
            
            .stRadio > div > label[data-selected="true"] > div:last-child {
                color: #ffffff;
                font-weight: bold;
            }
            
            /* 搜索框样式 */
            .stTextInput > div > div > input {
                border-radius: 8px;
                border: 2px solid rgba(255,255,255,0.2);
                background: rgba(255,255,255,0.9);
                box-shadow: 0 2px 4px rgba(0,0,0,0.1);
                transition: all 0.3s ease;
                padding: 10px 15px;
                font-size: 14px;
            }
            
            .stTextInput > div > div > input:focus {
                border-color: #ff6b35;
                box-shadow: 0 4px 8px rgba(255,107,53,0.2);
                outline: none;
            }
            
            .stTextInput > div > div > input::placeholder {
                color: #666;
                font-style: italic;
            }
            
            /* 文字颜色 */
            [data-testid="stSidebar"] h1,
            [data-testid="stSidebar"] h2,
            [data-testid="stSidebar"] h3,
            [data-testid="stSidebar"] p,
            [data-testid="stSidebar"] div {
                color: #ffffff !important;
            }
            
            /* 卡片样式 */
            .card {
                background: white;
                border-radius: 12px;
                padding: 20px;
                margin: 10px 0;
                box-shadow: 0 4px 8px rgba(0,0,0,0.08);
                transition: all 0.3s ease;
            }
            
            .card:hover {
                transform: translateY(-3px);
                box-shadow: 0 8px 16px rgba(0,0,0,0.12);
            }
            
            /* 动画效果 */
            @keyframes pulse {
                0% { opacity: 0.7; }
                50% { opacity: 1; }
                100% { opacity: 0.7; }
            }
            
            @keyframes fly {
                0% { transform: translateY(0px) rotate(0deg); }
                25% { transform: translateY(-10px) rotate(2deg); }
                50% { transform: translateY(0px) rotate(0deg); }
                75% { transform: translateY(10px) rotate(-2deg); }
                100% { transform: translateY(0px) rotate(0deg); }
            }
            
            @keyframes slideIn {
                from { transform: translateX(-20px); opacity: 0; }
                to { transform: translateX(0); opacity: 1; }
            }
            
            @keyframes float {
                0% { transform: translateY(0px); }
                50% { transform: translateY(-5px); }
                100% { transform: translateY(0px); }
            }
            
            .animate-slide-in {
                animation: slideIn 0.5s ease-out forwards;
            }
            
            .animate-float {
                animation: float 3s ease-in-out infinite;
            }
            
            /* 响应式设计 */
            @media (max-width: 768px) {
                [data-testid="stSidebar"] {
                    width: 100% !important;
                }
                
                .card {
                    padding: 15px;
                }
            }
            
            /* 滚动条样式 */
            ::-webkit-scrollbar {
                width: 6px;
            }
            
            ::-webkit-scrollbar-track {
                background: rgba(255,255,255,0.1);
                border-radius: 3px;
            }
            
            ::-webkit-scrollbar-thumb {
                background: linear-gradient(135deg, #ff6b35 0%, #f7931e 100%);
                border-radius: 3px;
            }
            
            ::-webkit-scrollbar-thumb:hover {
                background: linear-gradient(135deg, #f7931e 0%, #ff6b35 100%);
            }
            
            /* 主内容区域背景 - 浅蓝色渐变 */
            [data-testid="stAppViewContainer"] {
                background: linear-gradient(135deg, #e6f7ff 0%, #f0f8ff 100%);
                position: relative;
            }
            
            /* 航空主题动态背景元素 */
            /* 云朵动画 */
            @keyframes cloudFloat {
                0% { transform: translateX(-100px) translateY(0px); opacity: 0.7; }
                50% { transform: translateX(0px) translateY(-20px); opacity: 0.9; }
                100% { transform: translateX(100px) translateY(0px); opacity: 0.7; }
            }
            
            /* 飞机飞行动画 */
            @keyframes planeFly {
                0% { transform: translateX(-100px) translateY(0px) rotate(0deg); opacity: 0; }
                10% { opacity: 1; }
                50% { transform: translateX(50vw) translateY(-30px) rotate(5deg); }
                90% { opacity: 1; }
                100% { transform: translateX(110vw) translateY(0px) rotate(-5deg); opacity: 0; }
            }
            
            /* 航线动画 */
            @keyframes routeMove {
                0% { transform: translateX(0%); opacity: 0.3; }
                50% { opacity: 0.8; }
                100% { transform: translateX(-100%); opacity: 0.3; }
            }
            
            /* 云朵元素 */
            [data-testid="stAppViewContainer"]::before,
            [data-testid="stAppViewContainer"]::after {
                content: '';
                position: absolute;
                background: rgba(255, 255, 255, 0.8);
                border-radius: 50%;
                z-index: 1;
                filter: blur(15px);
            }
            
            /* 云朵1 */
            [data-testid="stAppViewContainer"]::before {
                width: 120px;
                height: 80px;
                top: 20%;
                left: 10%;
                animation: cloudFloat 20s ease-in-out infinite;
            }
            
            /* 云朵2 */
            [data-testid="stAppViewContainer"]::after {
                width: 100px;
                height: 60px;
                top: 60%;
                right: 15%;
                animation: cloudFloat 25s ease-in-out infinite reverse;
            }
            
            /* 额外的云朵元素 */
            [data-testid="stAppViewContainer"] .cloud {
                position: absolute;
                background: rgba(255, 255, 255, 0.7);
                border-radius: 50%;
                filter: blur(12px);
                z-index: 1;
            }
            
            /* 飞机元素 */
            [data-testid="stAppViewContainer"] .plane {
                position: absolute;
                font-size: 30px;
                z-index: 2;
                animation: planeFly 30s linear infinite;
            }
            
            /* 航线元素 */
            [data-testid="stAppViewContainer"] .route {
                position: absolute;
                height: 2px;
                background: linear-gradient(90deg, transparent, #0066cc, transparent);
                background-size: 200% 100%;
                z-index: 1;
                opacity: 0.5;
            }
            
            /* 主容器样式 */
            [data-testid="stMainContainer"] {
                background: rgba(255,255,255,0.9);
                margin: 20px;
                padding: 20px;
                border-radius: 12px;
                box-shadow: 0 8px 20px rgba(0,0,0,0.1);
                position: relative;
                z-index: 10;
            }
            
            /* 主内容标题样式 */
            [data-testid="stMainContainer"] h1,
            [data-testid="stMainContainer"] h2,
            [data-testid="stMainContainer"] h3 {
                color: #003366 !important;
            }
            
            /* 主内容按钮样式 - 橙色撞色 */
            [data-testid="stMainContainer"] .stButton > button {
                background: linear-gradient(135deg, #ff6b35 0%, #f7931e 100%);
                color: white;
                border-radius: 8px;
                border: 2px solid white;
                padding: 10px 15px;
                font-weight: bold;
                transition: all 0.3s ease;
                box-shadow: 0 4px 8px rgba(255,107,53,0.2);
            }
            
            [data-testid="stMainContainer"] .stButton > button:hover {
                background: linear-gradient(135deg, #f7931e 0%, #ff6b35 100%);
                transform: translateY(-2px);
                box-shadow: 0 6px 12px rgba(255,107,53,0.3);
            }
        </style>
        """, unsafe_allow_html=True)
        
        # 顶部航空主题标题 - 带动态效果
        st.markdown("""
        <div style="text-align: center; padding: 25px 0; position: relative; animation: slideIn 0.8s ease-out;">
            <!-- 背景装饰 -->
            <div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0.1;">
                <div style="position: absolute; top: 10px; left: 10px; font-size: 40px;">✈️</div>
                <div style="position: absolute; bottom: 10px; right: 10px; font-size: 40px;">🛫</div>
            </div>
            <!-- 主标题 -->
            <div style="position: relative; z-index: 1;">
                <div style="font-size: 26px; font-weight: bold; color: #003366; margin-bottom: 12px; text-shadow: 1px 1px 2px rgba(0,0,0,0.1);">
                    ✈️ 航空公司情感分析系统
                </div>
                <div style="font-size: 13px; color: #666; line-height: 1.4;">
                    数据驱动的航空服务智能分析平台
                </div>
            </div>
        </div>
        """, unsafe_allow_html=True)
        
        # 装饰分隔线 - 动态效果
        st.markdown("""
        <div style="height: 4px; background: linear-gradient(90deg, #003366, #0066cc, #003366); border-radius: 2px; margin: 15px 0; animation: pulse 3s infinite;">
        </div>
        """, unsafe_allow_html=True)
        
        # 功能选择 - 航空主题按钮
        st.markdown("""
        <div style="font-size: 16px; font-weight: bold; color: #003366; margin: 20px 0 15px 15px; display: flex; align-items: center; animation: slideIn 0.8s ease-out 0.2s both;">
            <span style="margin-right: 10px; font-size: 18px;">🛫</span> 功能导航
        </div>
        """, unsafe_allow_html=True)
        
        # 搜索功能
        search_query = st.text_input(
            "🔍 搜索功能模块",
            placeholder="输入功能名称快速查找...",
            key="search"
        )
        
        # 功能列表 - 六个字专业版
        functions = ["✈️ 数据概览分析", "🛠️ 模型评估优化", "💬 智能客服中心", "⚠️ 云端危机公关", "❤️ 智能关怀方案", "🏆 航空奥斯卡奖"]

        # 功能名称映射 - 确保不影响模块内容
        function_mapping = {
            "✈️ 数据概览分析": "数据概览",
            "🛠️ 模型评估优化": "模型评估",
            "💬 智能客服中心": "智能客服",
            "⚠️ 云端危机公关": "危机预警",
            "❤️ 智能关怀方案": "智能关怀方案生成系统",
            "🏆 航空奥斯卡奖": "航空界奥斯卡颁奖典礼"
        }

        # 根据搜索结果过滤功能
        filtered_functions = functions
        if search_query:
            filtered_functions = [func for func in functions if search_query.lower() in func.lower()]
        
        # 自定义航空主题按钮选择器 - 撞色版
        st.markdown("""
        <style>
            /* 自定义按钮样式 */
            .stRadio > div > label {
                display: flex;
                align-items: center;
                padding: 12px 20px;
                border-radius: 8px;
                transition: all 0.3s ease;
                cursor: pointer;
                border: 2px solid transparent;
                background: linear-gradient(135deg, #003366 0%, #0055a5 100%);
                box-shadow: 0 2px 4px rgba(0,0,0,0.15);
                position: relative;
                margin: 4px 0;
                min-height: 45px;
                width: 100%;
                box-sizing: border-box;
            }
            
            /* 隐藏默认的radio按钮圆点和图标容器 */
            .stRadio > div > label > div:first-child {
                display: none !important;
            }
            
            /* 按钮文本 */
            .stRadio > div > label > div:last-child {
                font-size: 15px;
                font-weight: 500;
                color: #ffffff;
                flex: 1;
                text-align: left;
                text-shadow: 0 1px 2px rgba(0,0,0,0.3);
            }
            
            /* 选中状态 - 撞色效果 */
            .stRadio > div > label[data-selected="true"] {
                background: linear-gradient(135deg, #ff6b35 0%, #f7931e 100%);
                border-color: #ffffff;
                box-shadow: 0 6px 12px rgba(255,107,53,0.3);
            }
            
            .stRadio > div > label[data-selected="true"] > div:last-child {
                color: #ffffff;
                font-weight: bold;
            }
            
            /* 悬停状态 */
            .stRadio > div > label:hover {
                background: linear-gradient(135deg, #004080 0%, #0066cc 100%);
                border-color: #ffffff;
                transform: translateY(-3px);
                box-shadow: 0 6px 12px rgba(0,102,204,0.25);
            }
            
            /* 航空主题装饰 */
            .stRadio > div > label::before {
                content: '';
                position: absolute;
                left: 0;
                top: 0;
                bottom: 0;
                width: 4px;
                border-radius: 10px 0 0 10px;
                background: linear-gradient(180deg, #ffffff, #e6f3ff);
                opacity: 0.5;
                transition: all 0.3s ease;
            }
            
            .stRadio > div > label[data-selected="true"]::before {
                background: linear-gradient(180deg, #ffffff, #fff5ee);
                opacity: 1;
            }
            
            /* 搜索框样式调整 */
            [data-testid="stTextInput"] {
                margin-bottom: 20px;
            }
            
            [data-testid="stTextInput"] > div > div {
                background: white;
                border-radius: 8px;
                box-shadow: 0 2px 4px rgba(0,0,0,0.1);
                border: 2px solid #003366;
            }
            
            [data-testid="stTextInput"] > div > div:focus-within {
                border-color: #ff6b35;
                box-shadow: 0 0 0 3px rgba(255,107,53,0.2);
            }
            
            /* 标题样式 */
            [data-testid="stMarkdownContainer"] h1 {
                color: #003366 !important;
                text-shadow: 0 1px 3px rgba(0,0,0,0.1);
            }
        </style>
        """, unsafe_allow_html=True)
        
        # 使用radio全部展开显示 - 美化版
        page = st.radio(
            "",
            filtered_functions if filtered_functions else functions,
            index=0,
            key="navigation"
        )
        
        # 装饰元素 - 动态飞机图标
        st.markdown("""
        <div style="position: relative; height: 120px; margin: 40px 0; animation: slideIn 0.8s ease-out 0.6s both;">
            <div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
                <svg width="80" height="80" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="animation: fly 4s ease-in-out infinite;">
                    <path d="M20 10L2 2L22 2L20 10Z" fill="#0066cc"/>
                    <path d="M2 2L12 12L2 22V2Z" fill="#003366"/>
                    <path d="M22 2L12 12L22 22V2Z" fill="#003366"/>
                </svg>
            </div>
            <!-- 飞行轨迹装饰 -->
            <div style="position: absolute; top: 50%; left: 10%; width: 80%; height: 2px; background: linear-gradient(90deg, transparent, #0066cc, transparent); opacity: 0.3;">
            </div>
        </div>
        """, unsafe_allow_html=True)
        
        # 底部装饰
        st.markdown("""
        <div style="margin-top: 40px; text-align: center; font-size: 11px; color: #999; padding: 15px; animation: slideIn 0.8s ease-out 1s both;">
            <div style="margin-bottom: 8px; font-weight: bold; color: #0066cc;">
                © 2026 航空服务智能分析平台
            </div>
            <div style="line-height: 1.3;">
                ✈️ 数据驱动 · 智能分析 · 服务优化<br>
                专业航空服务质量评估系统
            </div>
        </div>
        """, unsafe_allow_html=True)
    
    # 加载数据
    df = load_data()
    
    # 获取实际功能名称
    actual_page = function_mapping.get(page, page)
    
    if actual_page == "数据概览":
        show_data_overview(df)
    elif actual_page == "模型评估":
        show_model_evaluation()
    elif actual_page == "智能客服":
        show_smart_customer_service()
    elif actual_page == "危机预警":
        if CRISIS_WARNING_AVAILABLE:
            crisis_app = CrisisWarningApp()
            crisis_app.run()
        else:
            st.error("危机预警模块不可用，缺少必要的依赖")
            st.info("请安装lightgbm库以使用危机预警功能")
    elif actual_page == "智能关怀方案生成系统":
        show_smart_care()
    elif actual_page == "航空界奥斯卡颁奖典礼":
        show_airline_oscars()


def show_smart_care():
    """显示智能关怀方案生成系统"""
    # 航空主题样式
    st.markdown("""
    <style>
        /* 全局样式 */
        [data-testid="stAppViewContainer"] {
            background: linear-gradient(135deg, #e6f7ff 0%, #f0f8ff 100%);
        }
        
        /* 标题样式 */
        [data-testid="stTitle"] {
            color: #0066cc !important;
            font-weight: bold !important;
            text-align: center;
            padding: 20px 0;
        }
        
        /* 子标题样式 */
        .subheader {
            color: #004080 !important;
            border-left: 4px solid #0066cc;
            padding-left: 12px;
            margin: 20px 0 10px 0;
            font-size: 1.5rem !important;
            font-weight: 600 !important;
            position: relative;
        }
        
        .subheader::before {
            content: "✈";
            position: absolute;
            left: -20px;
            top: 0;
            color: #0066cc;
        }
        
        /* 卡片样式 */
        .card {
            background: white;
            border-radius: 12px;
            padding: 24px;
            box-shadow: 0 4px 12px rgba(0,0,0,0.08);
            margin-bottom: 24px;
            border-top: 4px solid #0066cc;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
        }
        
        .card:hover {
            transform: translateY(-2px);
            box-shadow: 0 6px 16px rgba(0,0,0,0.12);
        }
        
        /* 按钮样式 */
        [data-testid="stButton"]>button {
            background: linear-gradient(135deg, #0066cc 0%, #004080 100%) !important;
            color: white !important;
            border-radius: 8px !important;
            border: none !important;
            padding: 10px 24px !important;
            font-weight: 600 !important;
            transition: all 0.3s ease !important;
        }
        
        [data-testid="stButton"]>button:hover {
            transform: translateY(-1px) !important;
            box-shadow: 0 4px 8px rgba(0,102,204,0.3) !important;
        }
        
        /* 进度条样式 */
        [data-testid="stProgress"]>div>div {
            background: linear-gradient(90deg, #0066cc 0%, #0099ff 100%) !important;
            border-radius: 4px !important;
        }
        
        /* 滑块样式 */
        [data-testid="stSlider"]>div>div {
            background-color: #e6f7ff !important;
        }
        
        [data-testid="stSlider"]>div>div>div {
            background: linear-gradient(135deg, #0066cc 0%, #0099ff 100%) !important;
            border: 2px solid white !important;
            box-shadow: 0 2px 4px rgba(0,0,0,0.2) !important;
        }
        
        /* 多选框样式 */
        [data-testid="stMultiSelect"]>div>div {
            background: white !important;
            border-radius: 8px !important;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1) !important;
            border: 1px solid #e6f7ff !important;
        }
        
        /* 信息提示样式 */
        [data-testid="stInfo"] {
            background: linear-gradient(135deg, #e6f7ff 0%, #f0f8ff 100%) !important;
            border-left: 4px solid #0066cc !important;
            border-radius: 8px !important;
            box-shadow: 0 2px 4px rgba(0,0,0,0.08) !important;
        }
        
        /* 成功提示样式 */
        [data-testid="stSuccess"] {
            background: linear-gradient(135deg, #e6f7ff 0%, #f0f8ff 100%) !important;
            border-left: 4px solid #0066cc !important;
            border-radius: 8px !important;
            box-shadow: 0 2px 4px rgba(0,0,0,0.08) !important;
        }
        
        /* 错误提示样式 */
        [data-testid="stError"] {
            background: linear-gradient(135deg, #fff0f0 0%, #ffe6e6 100%) !important;
            border-left: 4px solid #ff4444 !important;
            border-radius: 8px !important;
            box-shadow: 0 2px 4px rgba(0,0,0,0.08) !important;
        }
        
        /* 关怀方案展示样式 */
        .care-plan {
            background: linear-gradient(135deg, #f8faff 0%, #e6f7ff 100%);
            border-radius: 12px;
            padding: 24px;
            border: 1px solid #b3d9ff;
            box-shadow: 0 2px 8px rgba(0,102,204,0.1);
        }
    </style>
    """, unsafe_allow_html=True)

    # 页面标题
    st.markdown('<h1 style="color: #0066cc; text-align: center; font-weight: bold; padding: 20px 0;">❤️ 数据驱动的智能关怀方案生成系统</h1>', unsafe_allow_html=True)
    
    # 系统介绍
    st.markdown('<div class="card"><h2 class="subheader">系统概述</h2><p>本系统基于真实推文数据分析，总结出用户最关心的问题，为用户生成个性化的关怀方案。</p></div>', unsafe_allow_html=True)
    
    # 显示数据来源说明
    st.info(
        "💡 说明：问卷问题基于对真实航空服务推文的分析，总结出用户最常提到的问题类型。"
    )
    
    # 从推文分析中得到的前13个最常见问题
    common_problems = [
        "服务态度",
        "延误",
        "客服支持",
        "取消",
        "飞机状况",
        "行李服务",
        "登机",
        "座位",
        "改签",
        "中转",
        "设施",
        "餐食",
        "超售"
    ]
    
    # step 1 ：用户偏好问卷
    st.markdown('<div class="card"><h2 class="subheader">📝 步骤1：用户偏好问卷</h2></div>', unsafe_allow_html=True)
    
    # 基本问题
    st.markdown('<div class="card"><h3 style="color: #004080;">请对以下服务问题的关注度评分（1-5分，1分最低，5分最高）：</h3></div>', unsafe_allow_html=True)
    
    # 使用动态列布局，根据屏幕宽度自动调整
    # 增加列数，使13个问题分布更合理
    if st.session_state.get('columns') is None:
        st.session_state.columns = 4  # 默认4列，比原来的3列更适合显示13个问题
    
    # 动态创建评分滑块
    user_ratings = {}
    
    # 创建n列布局
    cols = st.columns(st.session_state.columns, gap="medium")
    
    # 为每个问题创建评分滑块
    for i, problem in enumerate(common_problems):
        with cols[i % st.session_state.columns]:
            st.markdown(f'<div style="margin-bottom: 20px;"><strong style="color: #004080;">{problem}</strong></div>', unsafe_allow_html=True)
            user_ratings[problem] = st.slider(
                label=problem,  # 保留label以便屏幕阅读器使用
                min_value=1, max_value=5, value=3,  # 范围1-5，默认3
                key=problem,
                label_visibility="hidden"  # 隐藏默认标签，使用自定义的markdown显示
            )
    
    # 其他问题
    st.markdown('<div class="card"><h3 style="color: #004080;">其他问题：</h3></div>', unsafe_allow_html=True)
    
    communication_channels = st.multiselect(
        "您希望航空公司如何与您沟通服务问题？",
        ["短信", "邮件", "电话", "APP推送"],
        key="communication_channels"
    )
    
    # 收集用户响应
    user_responses = {
        "common_problems": user_ratings,
        "communication_channels": communication_channels
    }
    
    # step 2：生成关怀方案
    st.markdown('<div class="card"><h2 class="subheader">🎯 步骤2：生成关怀方案</h2></div>', unsafe_allow_html=True)
    
    if st.button("生成专属关怀方案", type="primary", use_container_width=True):
        with st.spinner("正在调用智能分析模型生成个性化关怀方案..."):
            # 计算各问题的优先级权重
            total_score = sum(user_ratings.values())
            priority_weights = {problem: score/total_score for problem, score in user_ratings.items()}
            
            # 找出用户最关心的前5个问题
            top_problems = sorted(user_ratings.items(), key=lambda x: x[1], reverse=True)[:5]
            
            # 准备DeepSeek提示词
            prompt = f"""
            作为专业的航空服务关怀方案专家，请根据以下用户偏好数据生成个性化关怀方案：
            
            用户对各服务问题的关注度评分（1-5分）：
            {user_ratings}
            
            用户最关心的前5个问题：
            {[(problem, score) for problem, score in top_problems]}
            
            用户偏好的沟通方式：
            {communication_channels}
            
            请生成一个结构化的个性化关怀方案，包含：
            1. 方案概述
            2. 针对每个高关注度问题的具体关怀措施
            3. 实施优先级
            4. 预期效果
            5. 沟通方式建议
            
            方案应具有专业性、针对性和可操作性，语言友好易懂。
            """
            
            # 调用DeepSeek API生成方案
            care_plan = call_deepseek_api(prompt, max_tokens=2000, temperature=0.7)  # 增加max_tokens到2000，避免回答被截断
            
            if care_plan:
                st.success("个性化关怀方案生成完成！")
                
                # 显示用户最关心的问题和优先级权重
                col1, col2 = st.columns(2, gap="large")
                
                with col1:
                    st.markdown('<div class="card"><h3 style="color: #004080;">👤 您最关心的问题</h3>', unsafe_allow_html=True)
                    for i, (problem, score) in enumerate(top_problems, 1):
                        st.write(f"{i}. {problem}: {score}/5分")
                    st.markdown('</div>', unsafe_allow_html=True)
                
                # 显示优先级权重分布
                with col2:
                    st.markdown('<div class="card"><h3 style="color: #004080;">⚖️ 问题优先级权重</h3>', unsafe_allow_html=True)
                    for problem, weight in sorted(priority_weights.items(), key=lambda x: x[1], reverse=True):
                        # 使用markdown显示，而不是progress组件，避免显示不全
                        percentage = weight * 100
                        st.markdown(f"<div style='margin-bottom: 8px;'><span style='width: 100px; display: inline-block; font-weight: 600;'>{problem}:</span> <span style='color: #0066cc; font-weight: 600;'>{percentage:.1f}%</span></div>", unsafe_allow_html=True)
                        st.progress(weight)
                    st.markdown('</div>', unsafe_allow_html=True)
                
                # 显示生成的关怀方案
                st.markdown('<div class="card"><h3 class="subheader">🎁 个性化关怀方案</h3>', unsafe_allow_html=True)
                st.markdown(f'<div class="care-plan" style="white-space: pre-line; line-height: 1.8; font-size: 1.05rem;">{care_plan}</div>', unsafe_allow_html=True)
                st.markdown('</div>', unsafe_allow_html=True)
            else:
                st.error("方案生成失败，请稍后重试。")
                st.info("如果问题持续存在，可能是网络连接问题或API调用限制。")


def call_deepseek_api(prompt, max_tokens=1000, temperature=0.7):
    """调用DeepSeek API生成响应"""
    try:
        import os
        from dotenv import load_dotenv
        load_dotenv()
        
        url = "https://api.deepseek.com/v1/chat/completions"
        api_key = os.getenv("DEEPSEEK_API_KEY", "")  # 使用环境变量
        
        if not api_key:
            st.warning("DeepSeek API密钥未配置，使用模拟响应")
            # 返回模拟响应
            return """
# 个性化关怀方案

## 方案概述
根据您的偏好，我们为您定制了一套全面的航空服务关怀方案，重点关注您最关心的服务问题。

## 具体关怀措施

### 服务态度
- 提供专属客服经理，确保您的需求得到及时响应
- 建立服务质量跟踪系统，记录并改进服务体验
- 定期进行服务满意度调查，持续优化服务流程

### 延误
- 提供实时航班状态通知，提前告知延误信息
- 为延误超过2小时的航班提供餐饮和住宿安排
- 建立延误补偿机制，根据延误时间提供相应赔偿

### 客服支持
- 24小时在线客服，确保随时能获得帮助
- 提供多渠道沟通方式，包括电话、短信、APP等
- 建立快速响应机制，确保问题在24小时内得到解决

## 实施优先级
- P0（最高优先级，立即实施）：服务态度、延误
- P1（高优先级，短期部署）：客服支持
- P2（中优先级，中期规划）：其他问题

## 预期效果
- 提升您的整体出行体验满意度
- 减少服务问题对您行程的影响
- 建立更加透明、高效的服务沟通机制

## 沟通方式建议
根据您的偏好，我们将通过短信、邮件等方式与您保持沟通，确保您及时了解服务进展和改进情况。
            """
        
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {api_key}"
        }
        
        data = {
            "model": "deepseek-chat",
            "messages": [
                {"role": "system", "content": "你是一个专业的航空服务关怀方案专家，擅长根据用户需求生成个性化的关怀方案。"},
                {"role": "user", "content": prompt}
            ],
            "max_tokens": max_tokens,
            "temperature": temperature
        }
        
        # 增加超时时间到60秒
        response = requests.post(url, headers=headers, json=data, timeout=60)
        response.raise_for_status()
        
        result = response.json()
        return result['choices'][0]['message']['content']
        
    except requests.exceptions.Timeout:
        st.error("API调用超时，请检查网络连接后重试")
        return None
    except Exception as e:
        st.error(f"API调用失败: {str(e)}")
        return None


def show_airline_oscars():
    """显示航空界奥斯卡颁奖典礼"""
    # 航空主题和奥斯卡主题样式
    st.markdown("""
    <style>
        /* 全局样式 */
        [data-testid="stAppViewContainer"] {
            background: linear-gradient(135deg, #e6f7ff 0%, #f0f8ff 100%);
        }
        
        /* 标题样式 */
        [data-testid="stMarkdownContainer"] h1,
        [data-testid="stMarkdownContainer"] h2,
        [data-testid="stMarkdownContainer"] h3,
        [data-testid="stMarkdownContainer"] h4 {
            color: #003366 !important;
            font-weight: bold !important;
            text-shadow: 0 1px 2px rgba(0,0,0,0.1);
        }
        
        /* 奖项容器样式 - 直接应用于Streamlit列 */
        [data-testid="column"] {
            position: relative;
        }
        
        /* 奖项卡片样式 - 直接样式化Streamlit的st.success/st.error等组件 */
        [data-testid="stSuccess"], [data-testid="stError"], [data-testid="stWarning"], [data-testid="stInfo"] {
            background: white;
            border-radius: 12px;
            padding: 20px;
            box-shadow: 0 4px 12px rgba(0,0,0,0.08);
            margin-bottom: 20px;
            border-top: 4px solid #ffd700;
            border-left: 4px solid transparent;
            transition: all 0.3s ease;
            position: relative;
            overflow: hidden;
            animation: fadeIn 0.5s ease-in-out;
        }
        
        /* 卡片装饰元素 */
        [data-testid="stSuccess"]::before,
        [data-testid="stError"]::before,
        [data-testid="stWarning"]::before,
        [data-testid="stInfo"]::before {
            content: "🏆";
            position: absolute;
            top: 12px;
            right: 12px;
            font-size: 24px;
            opacity: 0.1;
        }
        
        /* 卡片悬停效果 */
        [data-testid="stSuccess"]:hover,
        [data-testid="stError"]:hover,
        [data-testid="stWarning"]:hover,
        [data-testid="stInfo"]:hover {
            transform: translateY(-4px);
            box-shadow: 0 8px 20px rgba(0,0,0,0.15);
            border-left-color: #0066cc;
        }
        
        /* 金色卡片（最佳奖项） */
        [data-testid="stSuccess"] {
            background: linear-gradient(135deg, #fff8e1 0%, #fff3cd 100%);
            border-top: 4px solid #ffd700;
            border-left: 4px solid #ffd700;
        }
        
        /* 银色卡片（亚军奖项） */
        [data-testid="stError"] {
            background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
            border-top: 4px solid #c0c0c0;
            border-left: 4px solid #c0c0c0;
        }
        
        /* 铜色卡片（季军奖项） */
        [data-testid="stWarning"] {
            background: linear-gradient(135deg, #fff3e0 0%, #ffe0b2 100%);
            border-top: 4px solid #cd7f32;
            border-left: 4px solid #cd7f32;
        }
        
        /* 信息卡片 */
        [data-testid="stInfo"] {
            background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);
            border-top: 4px solid #2196f3;
            border-left: 4px solid #2196f3;
        }
        
        /* 标题样式 - 直接应用于奖项标题 */
        [data-testid="stMarkdownContainer"] h4 {
            margin-bottom: 12px !important;
            padding-bottom: 8px !important;
            border-bottom: 1px solid rgba(0,0,0,0.1);
        }
        
        /* 动画效果 */
        @keyframes fadeIn {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        /* 调整组件间距 */
        [data-testid="stVerticalBlock"] > [data-testid="stMarkdownContainer"] {
            margin-bottom: 0 !important;
        }
        
        /* 确保标题和卡片在视觉上结合在一起 */
        [data-testid="stVerticalBlock"] > [data-testid="stMarkdownContainer"]:has(h4) {
            background: linear-gradient(135deg, #fff8e1 0%, #fff3cd 100%);
            padding: 20px;
            border-radius: 12px 12px 0 0;
            border-top: 4px solid #ffd700;
            border-left: 4px solid #ffd700;
            border-right: 4px solid transparent;
            border-bottom: 1px solid transparent;
            box-shadow: 0 4px 12px rgba(0,0,0,0.08);
            margin-bottom: 0 !important;
            position: relative;
        }
        
        /* 为不同类型的卡片设置不同的标题背景 */
        [data-testid="stVerticalBlock"] > [data-testid="stMarkdownContainer"]:has(h4) + [data-testid="stError"] {
            border-radius: 0 0 12px 12px;
        }
        
        [data-testid="stVerticalBlock"] > [data-testid="stMarkdownContainer"]:has(h4) + [data-testid="stWarning"] {
            border-radius: 0 0 12px 12px;
        }
        
        [data-testid="stVerticalBlock"] > [data-testid="stMarkdownContainer"]:has(h4) + [data-testid="stInfo"] {
            border-radius: 0 0 12px 12px;
        }
        
        /* 调整stMarkdown内部间距 */
        [data-testid="stMarkdownContainer"] > p {
            margin-bottom: 8px !important;
        }
        
        /* 增强说明文字样式 */
        .stCaption {
            color: #555 !important;
            font-size: 0.95rem !important;
            line-height: 1.5 !important;
            margin-top: 10px !important;
        }
    </style>
    """, unsafe_allow_html=True)

    # 加载并显示航空界奥斯卡颁奖典礼内容
    st.markdown('## 🏆 航空界奥斯卡颁奖典礼')

    # 加载数据
    @st.cache_data
    def load_data():
        """加载并预处理数据"""
        import os
        # 使用相对路径加载数据
        current_dir = os.path.dirname(os.path.abspath(__file__))
        data_path = os.path.join(current_dir, '..', 'data', 'Tweets.csv')
        df = pd.read_csv(data_path)
        
        # 数据清洗
        df = df[['airline_sentiment', 'airline_sentiment_confidence', 
                 'negativereason', 'negativereason_confidence', 
                 'airline', 'retweet_count', 'text', 'name', 
                 'tweet_created']]
        
        # 转换时间格式
        df['tweet_created'] = pd.to_datetime(df['tweet_created'])
        
        return df

    df = load_data()

    # 定义奖项计算函数
    def calculate_airline_awards(df):
        """计算航空公司奖项"""
        awards = {}
        
        # 最佳口碑奖（正面情感最多）
        positive_counts = df[df['airline_sentiment'] == 'positive']['airline'].value_counts()
        awards['最佳口碑奖'] = positive_counts.idxmax() if not positive_counts.empty else "无"
        
        # 最需改进奖（负面情感最多）
        negative_counts = df[df['airline_sentiment'] == 'negative']['airline'].value_counts()
        awards['最需改进奖'] = negative_counts.idxmax() if not negative_counts.empty else "无"
        
        # 最具争议奖（情感两极分化）
        airline_sentiments = df.groupby('airline')['airline_sentiment'].value_counts(normalize=True).unstack()
        if 'positive' in airline_sentiments.columns and 'negative' in airline_sentiments.columns:
            controversy = abs(airline_sentiments['positive'] - airline_sentiments['negative'])
            awards['最具争议奖'] = controversy.idxmin() if not controversy.empty else "无"
        else:
            awards['最具争议奖'] = "数据不足"
        
        # 最受关注奖（提及次数最多）
        mention_counts = df['airline'].value_counts()
        awards['最受关注奖'] = mention_counts.idxmax() if not mention_counts.empty else "无"
        
        # 最高可信度奖（情感判断最自信）
        avg_confidence = df.groupby('airline')['airline_sentiment_confidence'].mean()
        awards['最高可信度奖'] = avg_confidence.idxmax() if not avg_confidence.empty else "无"
        
        # 年度"最淡定航空公司"奖（负面推文中抱怨"客服态度冷漠"比例最低）
        negative_tweets = df[df['airline_sentiment'] == 'negative']
        # 检测客服态度相关的关键词
        customer_service_keywords = ['service', 'staff', 'crew', 'attitude', 'rude', 'unfriendly', 'cold']
        
        def has_customer_service_complaint(text):
            if pd.isna(text):
                return False
            text_lower = text.lower()
            return any(keyword in text_lower for keyword in customer_service_keywords)
        
        negative_tweets['has_cs_complaint'] = negative_tweets['text'].apply(has_customer_service_complaint)
        
        airline_cs_complaints = negative_tweets.groupby('airline').agg(
            total_neg=('airline_sentiment', 'count'),
            cs_complaints=('has_cs_complaint', 'sum')
        )
        
        if not airline_cs_complaints.empty:
            airline_cs_complaints['cs_ratio'] = airline_cs_complaints['cs_complaints'] / airline_cs_complaints['total_neg']
            # 找出比例最低的航空公司
            awards['最淡定航空公司奖'] = airline_cs_complaints['cs_ratio'].idxmin()
        else:
            awards['最淡定航空公司奖'] = "无"
        
        # "行李去哪儿了"特别贡献奖（行李丢失投诉最多的航空公司）
        baggage_loss_keywords = ['baggage', 'luggage', 'suitcase', 'lost', 'missing']
        
        def has_baggage_complaint(text):
            if pd.isna(text):
                return False
            text_lower = text.lower()
            return any(keyword in text_lower for keyword in baggage_loss_keywords)
        
        df['has_baggage_complaint'] = df['text'].apply(has_baggage_complaint)
        baggage_complaints = df[df['has_baggage_complaint']]['airline'].value_counts()
        awards['行李去哪儿了特别贡献奖'] = baggage_complaints.idxmax() if not baggage_complaints.empty else "无"
        
        return awards

    def calculate_problem_awards(df):
        """计算问题类型奖项"""
        awards = {}
        
        # 最受关注问题（提及次数最多）
        problem_counts = df['negativereason'].value_counts()
        awards['最受关注问题'] = problem_counts.idxmax() if not problem_counts.empty else "无"
        
        # 最具影响力问题（转发最多）
        problem_retweets = df.groupby('negativereason')['retweet_count'].sum()
        awards['最具影响力问题'] = problem_retweets.idxmax() if not problem_retweets.empty else "无"
        
        # 最严重问题（负面情感最强烈）
        problem_confidence = df[df['airline_sentiment'] == 'negative'].groupby('negativereason')['negativereason_confidence'].mean()
        awards['最严重问题'] = problem_confidence.idxmax() if not problem_confidence.empty else "无"
        
        # 最含糊问题（判断最不自信）
        if not problem_confidence.empty:
            awards['最含糊问题'] = problem_confidence.idxmin()
        else:
            awards['最含糊问题'] = "无"
        
        return awards

    def calculate_user_awards(df):
        """计算用户奖项"""
        awards = {}
        
        # 最活跃评论员（推文最多）
        user_tweets = df['name'].value_counts()
        awards['最活跃评论员'] = user_tweets.idxmax() if not user_tweets.empty else "无"
        
        # 最具影响力用户（转发最多）
        user_influence = df.groupby('name')['retweet_count'].sum()
        awards['最具影响力用户'] = user_influence.idxmax() if not user_influence.empty else "无"
        
        # 最情绪化用户（情感波动最大）
        user_sentiment = df.groupby('name')['airline_sentiment'].nunique()
        awards['最情绪化用户'] = user_sentiment.idxmax() if not user_sentiment.empty else "无"
        
        # 最自信用户（情感判断最确定）
        user_confidence = df.groupby('name')['airline_sentiment_confidence'].mean()
        awards['最自信用户'] = user_confidence.idxmax() if not user_confidence.empty else "无"
        
        # 用户"吐槽之王"奖（推文被转发最多的用户）
        # 已经计算过，复用最具影响力用户的结果
        awards['吐槽之王奖'] = awards['最具影响力用户']
        
        # "天气预报大师"奖（预测延误最准的用户）
        # 检测延误相关的关键词
        delay_keywords = ['delay', 'late', 'delayed', 'on time', 'schedule', 'timely']
        
        def has_delay_mention(text):
            if pd.isna(text):
                return False
            text_lower = text.lower()
            return any(keyword in text_lower for keyword in delay_keywords)
        
        df['has_delay_mention'] = df['text'].apply(has_delay_mention)
        delay_tweets = df[df['has_delay_mention']]
        
        # 统计每个用户的延误提及次数
        user_delay_mentions = delay_tweets['name'].value_counts()
        if not user_delay_mentions.empty:
            awards['天气预报大师奖'] = user_delay_mentions.idxmax()
        else:
            awards['天气预报大师奖'] = "无"
        
        # "深夜情感电台"奖（凌晨2-4点发投诉推文最多的用户）
        # 首先确保tweet_created是datetime类型
        if df['tweet_created'].dtype != 'datetime64[ns]':
            df['tweet_created'] = pd.to_datetime(df['tweet_created'])
        
        # 提取小时信息
        df['hour'] = df['tweet_created'].dt.hour
        
        # 筛选凌晨2-4点的推文
        late_night_tweets = df[(df['hour'] >= 2) & (df['hour'] < 4)]
        
        # 筛选负面推文（投诉）
        late_night_complaints = late_night_tweets[late_night_tweets['airline_sentiment'] == 'negative']
        
        # 统计用户在这个时间段的投诉次数
        user_late_night_complaints = late_night_complaints['name'].value_counts()
        awards['深夜情感电台奖'] = user_late_night_complaints.idxmax() if not user_late_night_complaints.empty else "无"
        
        return awards

    # 计算所有奖项
    airline_awards = calculate_airline_awards(df)
    problem_awards = calculate_problem_awards(df)
    user_awards = calculate_user_awards(df)

    # 显示颁奖典礼
    # 航空公司奖项
    st.markdown('### ✈️ 航空公司奖项')

    # 使用更平衡的两列布局
    col1, col2 = st.columns(2, gap="large")
    with col1:
        # 最佳口碑奖
        st.markdown('#### 🏅 最佳口碑奖')
        st.success(f"**{airline_awards['最佳口碑奖']}**")
        st.caption("**解释**：拥有最多正面评价的航空公司，代表其服务质量得到了用户的广泛认可")
        
        # 最受关注奖
        st.markdown('#### 🏅 最受关注奖')
        st.success(f"**{airline_awards['最受关注奖']}**")
        st.caption("**解释**：在推文中被提及次数最多的航空公司，代表其品牌曝光度最高")
        
        # 最淡定航空公司奖
        st.markdown('#### 🏆 最淡定航空公司奖')
        st.success(f"**{airline_awards['最淡定航空公司奖']}**")
        st.caption("**解释**：负面推文中抱怨客服态度冷漠比例最低的航空公司，代表其服务人员态度较好")
        
    with col2:
        # 最需改进奖
        st.markdown('#### 🏅 最需改进奖')
        st.error(f"**{airline_awards['最需改进奖']}**")
        st.caption("**解释**：拥有最多负面评价的航空公司，代表其服务质量需要重点改进")
        
        # 最具争议奖
        st.markdown('#### 🏅 最具争议奖')
        st.warning(f"**{airline_awards['最具争议奖']}**")
        st.caption("**解释**：正面评价和负面评价比例最接近的航空公司，代表用户对其评价两极分化严重")
        
        # 行李去哪儿了特别贡献奖
        st.markdown('#### 🎒 行李去哪儿了特别贡献奖')
        st.warning(f"**{airline_awards['行李去哪儿了特别贡献奖']}**")
        st.caption("**解释**：行李丢失相关投诉最多的航空公司，代表其行李运输服务需要加强")

    # 最高可信度奖 - 单独一行显示
    st.markdown('#### 🏅 最高可信度奖')
    st.info(f"**{airline_awards['最高可信度奖']}**")
    st.caption("**解释**：情感判断置信度最高的航空公司，代表用户对其评价的态度最明确")

    # 问题类型奖项
    st.markdown('### 🚨 问题类型奖项')

    col1, col2 = st.columns(2, gap="large")
    with col1:
        # 最受关注问题
        st.markdown('#### 🏅 最受关注问题')
        st.success(f"**{problem_awards['最受关注问题']}**")
        st.caption("**解释**：在推文中被提及次数最多的负面问题，代表用户最常遇到的困扰")
        
        # 最严重问题
        st.markdown('#### 🏅 最严重问题')
        st.error(f"**{problem_awards['最严重问题']}**")
        st.caption("**解释**：负面情感最强烈、置信度最高的问题，代表用户最不满的服务缺陷")
        
    with col2:
        # 最具影响力问题
        st.markdown('#### 🏅 最具影响力问题')
        st.warning(f"**{problem_awards['最具影响力问题']}**")
        st.caption("**解释**：引发最多转发讨论的问题，代表其社会影响力最大")
        
        # 最含糊问题
        st.markdown('#### 🏅 最含糊问题')
        st.info(f"**{problem_awards['最含糊问题']}**")
        st.caption("**解释**：判断置信度最低的问题，代表用户对该问题的描述不够明确")

    # 用户奖项
    st.markdown('### 👤 用户奖项')

    col1, col2 = st.columns(2, gap="large")
    with col1:
        # 最活跃评论员
        st.markdown('#### 🏅 最活跃评论员')
        st.success(f"**{user_awards['最活跃评论员']}**")
        st.caption("**解释**：发布推文数量最多的用户，代表其对航空公司服务最为关注")
        
        # 最情绪化用户
        st.markdown('#### 🏅 最情绪化用户')
        st.warning(f"**{user_awards['最情绪化用户']}**")
        st.caption("**解释**：情感判断置信度最高的用户，代表其对服务质量的评价态度最鲜明")
        
        # 吐槽之王奖
        st.markdown('#### 🔥 吐槽之王奖')
        st.error(f"**{user_awards['吐槽之王奖']}**")
        st.caption("**解释**：推文被转发次数最多的用户，代表其吐槽内容引起了最多共鸣")
        
    with col2:
        # 最具影响力用户
        st.markdown('#### 🏅 最具影响力用户')
        st.error(f"**{user_awards['最具影响力用户']}**")
        st.caption("**解释**：推文总转发量最高的用户，代表其对航空公司服务的评价影响范围最广")
        
        # 最自信用户
        st.markdown('#### 🏅 最自信用户')
        st.info(f"**{user_awards['最自信用户']}**")
        st.caption("**解释**：在推文中对自己观点表达最肯定的用户，代表其对评价内容最有信心")
        
        # 天气预报大师奖
        st.markdown('#### 🌤️ 天气预报大师奖')
        st.success(f"**{user_awards['天气预报大师奖']}**")
        st.caption("**解释**：提及航班延误次数最多的用户，代表其最关注航班准点问题")

    # 深夜情感电台奖 - 单独一行显示
    st.markdown('#### 🌙 深夜情感电台奖')
    st.info(f"**{user_awards['深夜情感电台奖']}**")
    st.caption("**解释**：在凌晨2-4点发布投诉推文最多的用户，代表其喜欢在深夜表达不满")

    # 颁奖典礼总结 - 优化显示效果
    st.markdown('## 🎉 颁奖典礼总结')
    
    # 使用更突出的总结卡片
    st.markdown('<div class="summary-card">', unsafe_allow_html=True)
    st.markdown(f"""
    <div style="text-align: center; margin-bottom: 20px; font-size: 1.2rem;">
    本次航空界奥斯卡颁奖典礼共颁发了 <strong style="color: #ffd700;">{len(airline_awards) + len(problem_awards) + len(user_awards)}</strong> 个奖项，
    基于对 <strong style="color: #0066cc;">{len(df):,}</strong> 条推文的数据分析结果。
    </div>
    
    ### 主要发现：
    - **🏅 最佳口碑奖** 由 **{airline_awards['最佳口碑奖']}** 获得，拥有最多正面评价
    - **🏅 最需改进奖** 由 **{airline_awards['最需改进奖']}** 获得，需要在服务质量上做出改善
    - **🚨 最受关注问题** 是 **{problem_awards['最受关注问题']}**，需要航空公司重点关注
    - **👤 最具影响力用户** 是 **{user_awards['最具影响力用户']}**，其推文获得了最多转发
    - **🏆 最淡定航空公司** 是 **{airline_awards['最淡定航空公司奖']}**，客服投诉比例最低
    - **🎒 行李最易丢失航空公司** 是 **{airline_awards['行李去哪儿了特别贡献奖']}**，行李相关投诉最多
    - **🔥 吐槽之王** 是 **{user_awards['吐槽之王奖']}**，其吐槽获得了最高关注度
    - **🌤️ 天气预报大师** 是 **{user_awards['天气预报大师奖']}**，最常提及航班延误问题
    - **🌙 深夜情感电台主持人** 是 **{user_awards['深夜情感电台奖']}**，最爱在深夜发投诉推文
    
    <div style="text-align: center; margin-top: 20px; color: #0066cc;">
    感谢所有参与本次数据分析的推文用户，<br>
    期待明年的航空界奥斯卡颁奖典礼！
    </div>
    """, unsafe_allow_html=True)
    st.markdown('</div>', unsafe_allow_html=True)

    # 页脚 - 优化样式
    st.markdown('---')
    st.markdown('<div style="text-align: center; color: #666; font-size: 0.9rem;">', unsafe_allow_html=True)
    st.markdown('© 2026 航空界奥斯卡颁奖典礼 | 基于真实推文数据分析')
    st.markdown('</div>', unsafe_allow_html=True)


def show_data_overview(df):
    """显示数据概览"""
    
    # 航空主题样式 - 使用更强大的CSS选择器
    st.markdown("""
    <style>
        /* 全局样式 */
        [data-testid="stAppViewContainer"] {
            background: linear-gradient(135deg, #e6f7ff 0%, #f0f8ff 100%);
        }
        
        /* 标题样式 */
        [data-testid="stTitle"] {
            color: #0066cc !important;
            font-weight: bold !important;
            text-align: center;
            padding: 20px 0;
        }
        
        /* 子标题样式 */
        .subheader {
            color: #004080 !important;
            border-left: 4px solid #0066cc;
            padding-left: 12px;
            margin: 20px 0 10px 0;
            font-size: 1.5rem !important;
            font-weight: 600 !important;
        }
        
        /* 指标卡片样式 */
        [data-testid="stMetric"] {
            background: white;
            border-radius: 10px;
            padding: 15px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        
        /* 按钮样式 */
        [data-testid="stButton"]>button {
            background-color: #0066cc !important;
            color: white !important;
            border-radius: 8px !important;
            border: none !important;
            padding: 8px 20px !important;
        }
        
        /* 表格样式 */
        [data-testid="stDataFrame"] {
            border-radius: 8px !important;
            overflow: hidden !important;
        }
    </style>
    """, unsafe_allow_html=True)
    
    st.title("✈️ 航空公司情感分析数据概览")
    
    if df is None:
        st.warning("请先准备数据文件")
        return
    
    # 初始化数据概览分析器
    data_overview = DataOverview("data/Tweets.csv")
    
    # 基本信息
    st.markdown("<h2 class='subheader'>📋 数据基本信息</h2>", unsafe_allow_html=True)
    basic_info = data_overview.get_basic_info()
    
    col1, col2 = st.columns(2)
    with col1:
        st.metric("总样本数", f"{basic_info['total_records']:,}")
    with col2:
        st.metric("特征数量", basic_info['total_columns'])
    
    # 情感分布
    st.markdown("<h2 class='subheader'>😊 情感分布分析</h2>", unsafe_allow_html=True)
    sentiment_info = data_overview.get_sentiment_distribution()
    
    col1, col2, col3 = st.columns(3)
    for i, (sentiment, count) in enumerate(sentiment_info['counts'].items()):
        with [col1, col2, col3][i]:
            percentage = sentiment_info['percentages'][sentiment]
            st.metric(f"{sentiment.capitalize()}情感", f"{count:,}", f"{percentage}%")
    
    # 情感分布图表
    fig_pie = data_overview.create_sentiment_pie_chart()
    st.plotly_chart(fig_pie, use_container_width=True)
    
    # 航空公司情感分布
    st.markdown("<h2 class='subheader'>✈️ 航空公司情感分布</h2>", unsafe_allow_html=True)
    fig_airline = data_overview.create_sentiment_by_airline_chart()
    st.plotly_chart(fig_airline, use_container_width=True)
    
    # 时间序列分析
    st.markdown("<h2 class='subheader'>⏰ 时间趋势分析</h2>", unsafe_allow_html=True)
    fig_time = data_overview.create_time_series_analysis()
    if fig_time:
        st.plotly_chart(fig_time, use_container_width=True)
    
    # 转发分析
    st.markdown("<h2 class='subheader'>🔄 转发行为分析</h2>", unsafe_allow_html=True)
    fig_retweet, retweet_stats = data_overview.create_retweet_analysis()
    if fig_retweet:
        st.plotly_chart(fig_retweet, use_container_width=True)
        
        # 显示统计信息
        if retweet_stats:
            st.write("转发统计信息:")
            st.dataframe(pd.DataFrame(retweet_stats).T)
    
    # 负面原因分析
    st.markdown("<h2 class='subheader'>🔍 负面原因分析</h2>", unsafe_allow_html=True)
    negative_reasons = data_overview.get_negative_reasons()
    if negative_reasons:
        reasons_df = pd.DataFrame(list(negative_reasons.items()), columns=['负面原因', '数量'])
        reasons_df['占比'] = (reasons_df['数量'] / reasons_df['数量'].sum() * 100).round(2)
        st.dataframe(reasons_df, use_container_width=True)
    
    # 数据预览
    st.markdown("<h2 class='subheader'>📋 数据预览</h2>", unsafe_allow_html=True)
    
    # 添加筛选选项
    col1, col2, col3 = st.columns(3)
    
    with col1:
        selected_airline = st.selectbox(
            "筛选航空公司",
            ["全部"] + list(df['airline'].unique())
        )
    
    with col2:
        selected_sentiment = st.selectbox(
            "筛选情感",
            ["全部", "positive", "negative", "neutral"]
        )
    
    with col3:
        sample_size = st.slider("显示样本数量", 5, 50, 10)
    
    # 应用筛选
    filtered_df = df.copy()
    if selected_airline != "全部":
        filtered_df = filtered_df[filtered_df['airline'] == selected_airline]
    if selected_sentiment != "全部":
        filtered_df = filtered_df[filtered_df['airline_sentiment'] == selected_sentiment]
    
    # 显示筛选后的数据
    display_columns = ['tweet_id', 'airline', 'airline_sentiment', 'negativereason', 'text', 'tweet_created']
    st.dataframe(filtered_df[display_columns].head(sample_size), use_container_width=True)
    
    st.success("✅ 数据概览分析完成！")


# 机器学习评估功能已被移除，现在只保留数据概览和模型评估功能


# 数据处理功能已被移除，现在只保留数据概览功能


if __name__ == "__main__":
    main()