#!/usr/bin/env python3
"""
Script para transformar datos de futbollibretv.net.pe a formato JSON requerido
Uso: python3 transform-futbollibretv.py [--upload]
"""

import base64
import re

def decode_base64_url(link):
    """Decodifica URLs Base64 en links de embed"""
    if '/embed/eventos.html?r=' in link:
        match = re.search(r'r=(.+)$', link)
        if match:
            encoded_part = match.group(1)
            try:
                decoded = base64.b64decode(encoded_part).decode('utf-8')
                return decoded
            except:
                return link
    return link


def get_channel_base_name(channel):
    """Extrae nombre base del canal"""
    return channel.split('|')[0].strip()


def get_quality_priority(channel):
    """Determina prioridad de calidad"""
    if '| HD' in channel:
        return 5
    if '| FHD' in channel:
        return 6
    if '| 4K' in channel:
        return 7
    if '| OP2' in channel:
        return 2
    if '| OP3' in channel:
        return 1
    if 'AR' in channel:
        return 3
    return 4


def deduplicate_by_channel(events):
    """Deduplica eventos por canal, manteniendo mejor opción"""
    result = []
    event_map = {}
    
    for event in events:
        key = f"{event['title']}|{event['time']}|{event['status']}"
        if key not in event_map:
            event_map[key] = []
        event_map[key].append(event)
    
    for event_group in event_map.values():
        channel_map = {}
        
        for event in event_group:
            base_name = get_channel_base_name(event['channel'])
            priority = get_quality_priority(event['channel'])
            
            if base_name not in channel_map:
                channel_map[base_name] = event
                channel_map[base_name]['_priority'] = priority
            else:
                if priority > channel_map[base_name]['_priority']:
                    channel_map[base_name] = event
                    channel_map[base_name]['_priority'] = priority
        
        for event in channel_map.values():
            del event['_priority']
            result.append(event)
    
    return result


# Configuración
API_URL = 'https://futbollibretvhd.org/agenda-data.php?actualizacion={}'
OUTPUT_FILE = 'futbollibretvnetpe.json'
UPLOAD_URL = 'https://sabiasque.lat/json/futbollibretv/futbollibretvnetpe.json'


def fetch_api_data():
    """Obtiene datos de la API de futbollibretv"""
    try:
        print('🔄 Obteniendo datos de futbollibretv...')
        url = API_URL.format(int(datetime.now().timestamp() * 1000))
        
        response = requests.get(url, timeout=10)
        response.raise_for_status()
        
        data = response.json()
        print(f'✅ Datos obtenidos: {len(data.get("data", []))} eventos')
        
        return data
    except requests.exceptions.RequestException as e:
        print(f'❌ Error al conectar con la API: {e}')
        sys.exit(1)
    except json.JSONDecodeError as e:
        print(f'❌ Error al decodificar JSON: {e}')
        sys.exit(1)


def determine_category(title):
    """Determina la categoría basada en el título"""
    keywords = ['fútbol', 'futbol', 'liga', 'premier', 'laliga', 'serie', 'brasileirão']
    return 'Fútbol' if any(kw in title.lower() for kw in keywords) else 'Other'


def determine_status(date_str, time_str):
    """Determina el estado del evento (futuro/en vivo/finalizado)"""
    try:
        event_dt = datetime.strptime(f"{date_str} {time_str}", '%Y-%m-%d %H:%M:%S')
        now = datetime.now()
        
        if event_dt < now:
            return 'finalizado'
        return 'pronto'
    except ValueError:
        return 'pronto'


def transform_data(api_data):
    """Transforma datos de la API al formato requerido"""
    if 'data' not in api_data or not isinstance(api_data['data'], list):
        return []

    transformed = []

    for item in api_data.get('data', []):
        attributes = item.get('attributes', {})
        
        # Extraer información básica
        title = attributes.get('diary_description', '').strip()
        time = attributes.get('diary_hour', '00:00:00')[:5]  # HH:MM
        date_diary = attributes.get('date_diary', '')
        
        # Procesar categoría
        category = determine_category(title)
        
        # Procesar estado
        status = determine_status(date_diary, attributes.get('diary_hour', '00:00:00'))
        
        # Obtener TODAS las opciones disponibles (embeds)
        embeds = attributes.get('embeds', {}).get('data', [])
        
        if embeds:
            # Crear una entrada por cada embed disponible
            for embed in embeds:
                link = embed.get('attributes', {}).get('embed_iframe', '')
                channel_name = embed.get('attributes', {}).get('embed_name', '')
                
                # Decodificar URL si está codificada en Base64
                link = decode_base64_url(link)
                
                transformed.append({
                    'title': title,
                    'time': time,
                    'category': category,
                    'status': status,
                    'link': link,
                    'channel': channel_name,
                    'language': ''
                })
        else:
            # Si no hay embeds, crear una entrada sin link
            transformed.append({
                'title': title,
                'time': time,
                'category': category,
                'status': status,
                'link': '',
                'channel': '',
                'language': ''
            })

    return transformed


def save_json(data, filepath):
    """Guarda datos en un archivo JSON"""
    try:
        with open(filepath, 'w', encoding='utf-8') as f:
            json.dump(data, f, indent=2, ensure_ascii=False)
        print(f'💾 JSON guardado en: {filepath}')
        return True
    except IOError as e:
        print(f'❌ Error al guardar archivo: {e}')
        return False


def upload_to_server(data):
    """Sube el JSON a tu servidor"""
    try:
        print('🚀 Intentando subir a tudeporte.lat...')
        headers = {'Content-Type': 'application/json'}
        
        response = requests.put(
            UPLOAD_URL,
            data=json.dumps(data),
            headers=headers,
            timeout=10
        )
        
        if response.status_code in [200, 201]:
            print('✅ Archivo subido exitosamente')
            return True
        else:
            print(f'⚠️  Error HTTP {response.status_code}: {response.text}')
            return False
    except requests.exceptions.RequestException as e:
        print(f'⚠️  No se pudo subir al servidor: {e}')
        return False


def main():
    parser = argparse.ArgumentParser(description='Transformar datos de futbollibretv')
    parser.add_argument('--upload', action='store_true', help='Subir a servidor después')
    parser.add_argument('--output', default=OUTPUT_FILE, help='Archivo de salida')
    args = parser.parse_args()

    try:
        # Obtener datos
        api_data = fetch_api_data()
        
        # Transformar
        print('🔄 Transformando datos...')
        transformed_data = transform_data(api_data)
        print(f'✅ Datos transformados: {len(transformed_data)} opciones')
        
        # Deduplicar
        print('🔄 Deduplicando por canal...')
        transformed_data = deduplicate_by_channel(transformed_data)
        print(f'✅ Después de deduplicar: {len(transformed_data)} opciones (mejores opciones por canal)')
        
        # Guardar
        if not save_json(transformed_data, args.output):
            sys.exit(1)
        
        # Mostrar muestra
        print('\n📊 Muestra de datos:')
        for event in transformed_data[:3]:
            print(f"  • {event['time']} - {event['title']} ({event['status']})")
        
        # Subir si se solicita
        if args.upload:
            upload_to_server(transformed_data)
        
        print('\n✅ Proceso completado')

    except Exception as e:
        print(f'❌ Error inesperado: {e}')
        sys.exit(1)


if __name__ == '__main__':
    main()