"""
航空界「奥斯卡颁奖典礼」系统
基于Tweets.csv数据集的趣味奖项颁发
"""

import streamlit as st
import pandas as pd
import numpy as np
from collections import Counter
import datetime

# 页面配置
st.set_page_config(
    page_title="航空界奥斯卡颁奖典礼",
    page_icon="🏆",
    layout="wide"
)


# 加载数据
@st.cache_data

def load_data():
    """加载并预处理数据"""
    df = pd.read_csv('data/Tweets.csv')
    
    # 数据清洗
    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('## 🏆 航空界奥斯卡颁奖典礼')

# 航空公司奖项
st.markdown('### ✈️ 航空公司奖项')

col1, col2 = st.columns(2)
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)
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)
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(f"""
本次航空界奥斯卡颁奖典礼共颁发了 **{len(airline_awards) + len(problem_awards) + len(user_awards)}** 个奖项，
基于对 **{len(df)}** 条推文的数据分析结果。

### 主要发现：
- **最佳口碑奖** 由 **{airline_awards['最佳口碑奖']}** 获得，拥有最多正面评价
- **最需改进奖** 由 **{airline_awards['最需改进奖']}** 获得，需要在服务质量上做出改善
- **最受关注问题** 是 **{problem_awards['最受关注问题']}**，需要航空公司重点关注
- **最具影响力用户** 是 **{user_awards['最具影响力用户']}**，其推文获得了最多转发
- **最淡定航空公司** 是 **{airline_awards['最淡定航空公司奖']}**，客服投诉比例最低
- **行李最易丢失航空公司** 是 **{airline_awards['行李去哪儿了特别贡献奖']}**，行李相关投诉最多
- **吐槽之王** 是 **{user_awards['吐槽之王奖']}**，其吐槽获得了最高关注度
- **天气预报大师** 是 **{user_awards['天气预报大师奖']}**，最常提及航班延误问题
- **深夜情感电台主持人** 是 **{user_awards['深夜情感电台奖']}**，最爱在深夜发投诉推文

感谢所有参与本次数据分析的推文用户，
期待明年的航空界奥斯卡颁奖典礼！
""")

# 页脚
st.markdown('---')
st.markdown('© 2026 航空界奥斯卡颁奖典礼 | 基于真实推文数据分析')
