#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Daily Briefing Generator
Generuje codzienne podsumowanie (maile, NBA, pogoda) jako MP3
"""

import sys
import os
from datetime import datetime, timedelta
import mysql.connector
import requests
import random

# Dodaj backend do ścieżki
BACKEND_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, BACKEND_DIR)

import config

class DailyBriefingGenerator:
    def __init__(self):
        self.output_file = os.path.join(config.OUTPUT_DIR, 'daily_briefing.mp3')
        self.script_text = ""
        
        # Różne warianty powitań
        self.greetings_morning = [
            "Dzień dobry Sławku!",
            "Cześć Sławku, miłego poranku!",
            "Witaj Sławku!",
            "Hej Sławku, dzień dobry!",
            "Dzień dobry! Jak się masz dziś rano?"
        ]
        
        self.greetings_afternoon = [
            "Cześć Sławku!",
            "Witaj Sławku!",
            "Hej Sławku!",
            "Dzień dobry Sławku!",
            "Siema Sławku!"
        ]
        
        self.greetings_evening = [
            "Dobry wieczór Sławku!",
            "Cześć Sławku, dobry wieczór!",
            "Witaj Sławku!",
            "Hej Sławku, dobry wieczór!",
            "Witaj! Miłego wieczoru Sławku!"
        ]
        
        # Różne warianty wprowadzenia do podsumowania
        self.intro_phrases = [
            "Oto Twoje dzisiejsze podsumowanie.",
            "Mam dla Ciebie kilka informacji.",
            "Przygotowałem dla Ciebie podsumowanie dnia.",
            "Sprawdźmy co się dzieje.",
            "Zobacz co się wydarzyło.",
            "Czas na podsumowanie dnia."
        ]
        
        # Różne warianty zakończenia
        self.closing_phrases = [
            "To wszystko na teraz. Miłego dnia!",
            "To by było na tyle. Trzymaj się!",
            "To wszystko. Życzę produktywnego dnia!",
            "I to już wszystkie wiadomości. Powodzenia!",
            "Na tym kończymy. Do usłyszenia!",
            "To wszystko z mojej strony. Miłego dnia!"
        ]
    
    def get_jarvis_db(self):
        return mysql.connector.connect(
            host=config.JARVIS_DB_HOST,
            user=config.JARVIS_DB_USER,
            password=config.JARVIS_DB_PASSWORD,
            database=config.JARVIS_DB_NAME,
            charset='utf8mb4'
        )
    
    def get_nba_db(self):
        return mysql.connector.connect(
            host=config.NBA_DB_HOST,
            user=config.NBA_DB_USER,
            password=config.NBA_DB_PASSWORD,
            database=config.NBA_DB_NAME,
            charset='utf8mb4'
        )
    
    # =========================
    # SEKCJA 1: MAILE
    # =========================
    
    def get_recent_emails(self, hours=12):
        """Pobiera najważniejsze emaile z ostatnich 12 godzin"""
        conn = self.get_jarvis_db()
        cursor = conn.cursor(dictionary=True)
        
        time_threshold = datetime.now() - timedelta(hours=hours)
        
        query = """
            SELECT sender_name, subject, category, priority
            FROM email_history
            WHERE received_at >= %s
            AND category NOT IN ('SPAM', 'REKLAMA', 'NEWSLETTER')
            ORDER BY
                CASE priority
                    WHEN 'WYSOKI' THEN 1
                    WHEN 'ŚREDNI' THEN 2
                    ELSE 3
                END,
                received_at DESC
            LIMIT 5
        """
        
        cursor.execute(query, (time_threshold,))
        emails = cursor.fetchall()
        
        cursor.close()
        conn.close()
        
        return emails
    
    def generate_emails_summary(self):
        """Generuje podsumowanie emaili z losowymi wariantami"""
        emails = self.get_recent_emails(hours=12)
        
        if not emails:
            no_emails_variants = [
                "Nie masz nowych ważnych wiadomości email.",
                "Skrzynka jest pusta. Brak nowych maili.",
                "Żadnych nowych wiadomości nie otrzymałeś.",
                "Cisza na poczcie. Żadnych nowych maili.",
                "Spokojnie na froncie mailowym. Nic nowego."
            ]
            return random.choice(no_emails_variants)
        
        # Losowy wariant wprowadzenia
        count = len(emails)
        intro_variants = [
            f"Masz {count} ",
            f"Otrzymałeś {count} ",
            f"W skrzynce czeka {count} ",
            f"Dotarło {count} "
        ]
        
        summary = random.choice(intro_variants)
        
        # Odmiana "wiadomość"
        if count == 1:
            summary += random.choice(["nową wiadomość. ", "nowy mail. ", "nową wiadomość email. "])
        elif count in [2, 3, 4]:
            summary += random.choice(["nowe wiadomości. ", "nowe maile. ", "nowe emaile. "])
        else:
            summary += random.choice(["nowych wiadomości. ", "nowych maili. ", "nowych emaili. "])
        
        # Warianty na listowanie emaili
        for i, email in enumerate(emails, 1):
            priority_text = ""
            if email['priority'] == 'WYSOKI':
                priority_variants = ["Pilne! ", "Ważne! ", "Uwaga! ", "Priorytet! "]
                priority_text = random.choice(priority_variants)
            
            sender = email['sender_name'] if email['sender_name'] else "Nieznany nadawca"
            
            # Losowe warianty na przedstawienie emaila
            email_variants = [
                f"{priority_text}{sender} pisze: {email['subject']}. ",
                f"{priority_text}Od {sender}: {email['subject']}. ",
                f"{priority_text}Mail od {sender} w sprawie: {email['subject']}. ",
                f"{priority_text}{sender} wysłał: {email['subject']}. "
            ]
            
            summary += random.choice(email_variants)
        
        return summary
    
    # =========================
    # SEKCJA 2: NBA
    # =========================
    
    def get_favorite_players_stats(self, days=2):
        """Pobiera statystyki ulubionych graczy"""
        conn = self.get_nba_db()
        cursor = conn.cursor(dictionary=True)
        
        favorite_players = getattr(config, 'FAVORITE_NBA_PLAYERS', [])
        
        if not favorite_players:
            cursor.close()
            conn.close()
            return []
        
        date_from = (datetime.now() - timedelta(days=days)).strftime('%Y-%m-%d')
        
        print(f"🔍 DEBUG: Dzisiaj: {datetime.now().strftime('%Y-%m-%d')}")
        print(f"🔍 DEBUG: Szukam meczów od: {date_from}")
        print(f"👥 DEBUG: Ulubieni gracze: {favorite_players}")
        
        placeholders = ','.join(['%s'] * len(favorite_players))
        query = f"""
            SELECT
                p.first_name, p.last_name, p.player_id,
                pgs.points, pgs.rebounds, pgs.assists,
                pgs.minutes_played,
                g.game_date,
                ht.abbreviation as home_abbr,
                at.abbreviation as away_abbr,
                g.home_score, g.away_score,
                pgs.team_id, g.home_team_id,
                g.game_status
            FROM player_game_stats pgs
            JOIN players p ON pgs.player_id = p.player_id
            JOIN games g ON pgs.game_id = g.game_id
            JOIN team_info ht ON g.home_team_id = ht.team_id
            JOIN team_info at ON g.away_team_id = at.team_id
            WHERE pgs.player_id IN ({placeholders})
            AND g.game_date >= %s
            AND g.game_status = 'Final'
            ORDER BY g.game_date DESC
        """
        
        cursor.execute(query, favorite_players + [date_from])
        stats = cursor.fetchall()
        
        print(f"✅ DEBUG: Znaleziono {len(stats)} meczów")
        if stats:
            for stat in stats:
                print(f"   - {stat['first_name']} {stat['last_name']}: {stat['game_date']} - {stat['points']} PTS")
        
        cursor.close()
        conn.close()
        
        return stats
    
    def generate_nba_summary(self):
        """Generuje podsumowanie NBA z losowymi wariantami"""
        stats = self.get_favorite_players_stats(days=2)
        
        if not stats:
            no_games_variants = [
                "Twoi ulubieni gracze NBA nie rozegrali ostatnio meczów.",
                "W NBA cisza. Twoi faworyci nie grali.",
                "Brak meczów Twoich ulubionych zawodników NBA.",
                "Twoi ulubieni koszykarze nie wystąpili ostatnio.",
                "Żadnych nowych występów Twoich graczy."
            ]
            return random.choice(no_games_variants)
        
        # Grupuj po graczu
        players_latest = {}
        for stat in stats:
            player_key = f"{stat['first_name']} {stat['last_name']}"
            if player_key not in players_latest:
                players_latest[player_key] = stat
        
        player_count = len(players_latest)
        
        # Losowe warianty wprowadzenia do NBA
        intro_variants = [
            "W NBA, ostatnio ",
            "Jeśli chodzi o NBA, to ",
            "Na parkietach NBA ",
            "W lidze NBA "
        ]
        summary = random.choice(intro_variants)
        
        if player_count == 1:
            single_variants = [
                "zagrał Twój ulubiony zawodnik. ",
                "wystąpił Twój fawor. ",
                "grał Twój ulubieniec. ",
                "na parkiecie pojawił się Twój faworyt. "
            ]
            summary += random.choice(single_variants)
        else:
            multiple_variants = [
                f"zagrało {player_count} Twoich ulubionych zawodników. ",
                f"wystąpiło {player_count} Twoich faworytów. ",
                f"na parkietach pojawili się Twoi ulubieńcy. ",
                f"grało {player_count} zawodników z Twojej listy. "
            ]
            summary += random.choice(multiple_variants)
        
        for player_name, stat in players_latest.items():
            is_home = stat['team_id'] == stat['home_team_id']
            team_score = stat['home_score'] if is_home else stat['away_score']
            opp_score = stat['away_score'] if is_home else stat['home_score']
            
            # Losowe warianty na wynik
            if team_score > opp_score:
                result_variants = ["wygrał", "zwyciężył", "pokonał", "ograł"]
                result = random.choice(result_variants)
            else:
                result_variants = ["przegrał", "uległ", "nie dał rady", "poniósł porażkę"]
                result = random.choice(result_variants)
            
            opponent = stat['away_abbr'] if is_home else stat['home_abbr']
            
            # Losowe warianty na opis meczu
            game_desc_variants = [
                f"{player_name} {result} z {opponent}, ",
                f"{player_name} w meczu z {opponent} {result}, ",
                f"W starciu z {opponent}, {player_name} {result}, ",
                f"{player_name} {result} przeciwko {opponent}, "
            ]
            summary += random.choice(game_desc_variants)
            
            # Losowe warianty na statystyki
            stats_variants = [
                f"zdobywając {stat['points']} punktów, {stat['rebounds']} zbiórek i {stat['assists']} asyst. ",
                f"notując {stat['points']} punktów, {stat['rebounds']} zbiórek oraz {stat['assists']} asyst. ",
                f"ze statystykami: {stat['points']} punktów, {stat['rebounds']} zbiórek, {stat['assists']} asyst. ",
                f"zapisując na swoim koncie {stat['points']} punktów, {stat['rebounds']} zbiórek i {stat['assists']} asyst. "
            ]
            summary += random.choice(stats_variants)
        
        return summary
    
    # =========================
    # SEKCJA 3: POGODA
    # =========================
    
    def get_weather(self):
        """Pobiera pogodę"""
        try:
            url = f"https://api.openweathermap.org/data/2.5/weather?lat={config.WEATHER_LAT}&lon={config.WEATHER_LON}&appid={config.OPENWEATHER_API_KEY}&units=metric&lang=pl"
            response = requests.get(url, timeout=10)
            data = response.json()
            
            temp = round(data['main']['temp'])
            feels_like = round(data['main']['feels_like'])
            description = data['weather'][0]['description']
            
            return {
                'temp': temp,
                'feels_like': feels_like,
                'description': description
            }
        except Exception as e:
            print(f"Błąd pobierania pogody: {e}")
            return None
    
    def generate_weather_summary(self):
        """Generuje podsumowanie pogody z losowymi wariantami"""
        weather = self.get_weather()
        
        if not weather:
            error_variants = [
                "Nie udało się pobrać informacji o pogodzie.",
                "Brak danych o pogodzie.",
                "Niestety nie mam informacji o pogodzie.",
                "Problem z pobraniem prognozy pogody."
            ]
            return random.choice(error_variants)
        
        # Losowe warianty wprowadzenia pogody
        intro_variants = [
            "Pogoda w Jeleniej Górze: ",
            "Jeśli chodzi o pogodę w Jeleniej Górze: ",
            "Na zewnątrz w Jeleniej Górze jest: ",
            "W Jeleniej Górze dziś: ",
            "Aktualnie w Jeleniej Górze: "
        ]
        summary = random.choice(intro_variants)
        
        summary += f"{weather['description']}, "
        
        # Losowe warianty na temperaturę
        temp_variants = [
            f"temperatura {weather['temp']} stopni Celsjusza, ",
            f"termometry pokazują {weather['temp']} stopni, ",
            f"{weather['temp']} stopni Celsjusza, ",
            f"na termometrze {weather['temp']} stopni, "
        ]
        summary += random.choice(temp_variants)
        
        # Losowe warianty na temperaturę odczuwalną
        feels_variants = [
            f"odczuwalna {weather['feels_like']} stopni. ",
            f"a odczuwalna to {weather['feels_like']} stopni. ",
            f"odczucie termiczne {weather['feels_like']} stopni. ",
            f"choć czuć jak {weather['feels_like']} stopni. "
        ]
        summary += random.choice(feels_variants)
        
        return summary
    
    # =========================
    # GENEROWANIE FINALNEGO MP3
    # =========================
    
    def generate_full_briefing(self):
        """Generuje pełne podsumowanie dnia z losowymi wariantami"""
        
        print("=" * 60)
        print("🎙️  GENEROWANIE DAILY BRIEFING")
        print("=" * 60)
        
        # Losowe powitanie w zależności od pory dnia
        hour = datetime.now().hour
        if hour < 12:
            greeting = random.choice(self.greetings_morning)
        elif hour < 18:
            greeting = random.choice(self.greetings_afternoon)
        else:
            greeting = random.choice(self.greetings_evening)
        
        # Losowe wprowadzenie
        intro = random.choice(self.intro_phrases)
        
        briefing = f"{greeting} {intro} "
        
        # Sekcja 1: Emaile
        print("\n📧 Generuję podsumowanie emaili...")
        email_summary = self.generate_emails_summary()
        briefing += email_summary + " "
        print(f"   ✓ {email_summary}")
        
        # Sekcja 2: NBA
        print("\n🏀 Generuję podsumowanie NBA...")
        nba_summary = self.generate_nba_summary()
        briefing += nba_summary + " "
        print(f"   ✓ {nba_summary}")
        
        # Sekcja 3: Pogoda
        print("\n🌤️  Generuję podsumowanie pogody...")
        weather_summary = self.generate_weather_summary()
        briefing += weather_summary + " "
        print(f"   ✓ {weather_summary}")
        
        # Losowe zakończenie
        closing = random.choice(self.closing_phrases)
        briefing += closing
        
        self.script_text = briefing
        return briefing
    
    def create_mp3_elevenlabs(self):
        """Tworzy plik MP3 z syntezą mowy przy użyciu ElevenLabs API"""
        
        briefing_text = self.generate_full_briefing()
        
        print("\n" + "=" * 60)
        print("📝 PEŁNA TREŚĆ BRIEFINGU:")
        print("=" * 60)
        print(briefing_text)
        print("=" * 60)
        
        print("\n🎵 Generuję plik MP3 z ElevenLabs...")
        
        try:
            # Bezpośrednie wywołanie API ElevenLabs
            url = f"https://api.elevenlabs.io/v1/text-to-speech/{config.ELEVENLABS_VOICE_ID}"
            
            headers = {
                "Accept": "audio/mpeg",
                "Content-Type": "application/json",
                "xi-api-key": config.ELEVENLABS_API_KEY
            }
            
            data = {
                "text": briefing_text,
                "model_id": "eleven_multilingual_v2",
                "voice_settings": {
                    "stability": 0.5,
                    "similarity_boost": 0.75,
                    "style": 0.0,
                    "use_speaker_boost": True
                }
            }
            
            response = requests.post(url, json=data, headers=headers, timeout=60)
            
            if response.status_code == 200:
                with open(self.output_file, 'wb') as f:
                    f.write(response.content)
                
                file_size = os.path.getsize(self.output_file)
                file_size_kb = file_size / 1024
                
                print(f"\n✅ MP3 WYGENEROWANY POMYŚLNIE!")
                print(f"   📂 Lokalizacja: {self.output_file}")
                print(f"   📊 Rozmiar: {file_size_kb:.2f} KB")
                print(f"   🔗 URL: https://zakodowani.it/jarvis/output/daily_briefing.mp3")
                print(f"   🕒 Czas: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
                print(f"   🎤 Głos: ElevenLabs")
                print("=" * 60)
                
                return self.output_file
            else:
                print(f"❌ Błąd API ElevenLabs: {response.status_code}")
                print(f"   Odpowiedź: {response.text}")
                raise Exception(f"ElevenLabs API error: {response.status_code}")
                
        except Exception as e:
            print(f"\n❌ BŁĄD ElevenLabs: {e}")
            raise
    
    def create_mp3(self):
        """Alias dla create_mp3_elevenlabs"""
        return self.create_mp3_elevenlabs()
    
    def run(self):
        """Główna funkcja - uruchom generator"""
        try:
            self.create_mp3()
            return True
        except Exception as e:
            print(f"\n❌ BŁĄD: {e}")
            import traceback
            traceback.print_exc()
            return False


if __name__ == "__main__":
    generator = DailyBriefingGenerator()
    success = generator.run()
    
    if success:
        print("\n🎉 Daily briefing gotowy!")
        sys.exit(0)
    else:
        print("\n💥 Nie udało się wygenerować briefingu")
        sys.exit(1)