// horarios.dart - Versión actualizada
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'rutas.dart';
import '../models/domicilio_model.dart';
import 'mapa_expandible.dart';
import '../services/notification_service.dart';

class HorariosView extends StatefulWidget {
  const HorariosView({super.key});

  @override
  State<HorariosView> createState() => _HorariosViewState();
}

class _HorariosViewState extends State<HorariosView> {
  List<Domicilio> domicilios = [];
  bool _isLoading = true;
  Timer? _timer;

  @override
  void initState() {
    super.initState();
    _cargarDomicilios();
    _iniciarVerificacionHorarios();
  }

  @override
  void dispose() {
    _timer?.cancel();
    super.dispose();
  }

  void _iniciarVerificacionHorarios() {
    _timer = Timer.periodic(const Duration(minutes: 1), (timer) {
      _verificarHorarios();
    });
  }

  void _verificarHorarios() async {
    final prefs = await SharedPreferences.getInstance();
    final suspensionActiva = prefs.getBool('ruta_suspendida') ?? false;
    final retrasoMinutos = prefs.getInt('retraso_minutos') ?? 0;

    if (suspensionActiva) return;

    final ahora = DateTime.now();
    final horaActual = ahora.hour * 60 + ahora.minute;

    for (var domicilio in domicilios) {
      final partes = domicilio.horarioEstimado.split(':');
      int hora = int.parse(partes[0]);
      int minuto = int.parse(partes[1]);

      // Aplicar retraso
      int horaConRetraso = hora;
      int minutoConRetraso = minuto + retrasoMinutos;
      if (minutoConRetraso >= 60) {
        horaConRetraso += minutoConRetraso ~/ 60;
        minutoConRetraso = minutoConRetraso % 60;
      }

      final horarioMinutos = horaConRetraso * 60 + minutoConRetraso;

      // Si la hora actual está dentro del rango (5 minutos antes y durante)
      if (horaActual >= horarioMinutos - 5 && horaActual <= horarioMinutos + 15) {
        // Verificar si ya se notificó esta hora
        final lastNotification = prefs.getString('last_notification_${domicilio.id}');
        final todayKey = '${DateTime.now().day}-${DateTime.now().month}-${DateTime.now().year}';

        if (lastNotification != todayKey) {
          await prefs.setString('last_notification_${domicilio.id}', todayKey);
          await NotificationService.showNotification(
            title: '🚛 El camión está cerca',
            body: 'El camión de recolección está por llegar a ${domicilio.colonia}. ¡Prepara tu basura!',
          );
        }
      }
    }
  }

  Future<void> _cargarDomicilios() async {
    try {
      final prefs = await SharedPreferences.getInstance();
      final String? domiciliosString = prefs.getString('domicilios');
      final retrasoMinutos = prefs.getInt('retraso_minutos') ?? 0;

      setState(() {
        if (domiciliosString != null && domiciliosString.isNotEmpty) {
          domicilios = Domicilio.decode(domiciliosString);
        }
        _isLoading = false;
      });
    } catch (e) {
      setState(() {
        _isLoading = false;
      });
    }
  }

  String _obtenerHorarioConRetraso(int index) {
    return domicilios[index].horarioEstimado;
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      child: SafeArea(
        child: Column(
          children: [
            Container(
              width: double.infinity,
              padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 16),
              decoration: const BoxDecoration(
                color: colorAzul,
                borderRadius: BorderRadius.only(
                  bottomLeft: Radius.circular(20),
                  bottomRight: Radius.circular(20),
                ),
              ),
              child: const Text(
                'Mis Rutas',
                style: TextStyle(color: Colors.white, fontSize: 32, fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),
            ),
            Expanded(
              child: _isLoading
                  ? const Center(child: CircularProgressIndicator(color: colorAzul))
                  : domicilios.isEmpty
                  ? Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Icon(Icons.location_on_outlined, size: 100, color: Colors.grey.withOpacity(0.5)),
                    const SizedBox(height: 20),
                    Text('No hay domicilios agregados', style: TextStyle(fontSize: 18, color: Colors.grey.withOpacity(0.7))),
                    const SizedBox(height: 10),
                    Text('Agrega domicilios desde la pestaña Domicilios', style: TextStyle(fontSize: 14, color: Colors.grey.withOpacity(0.5)), textAlign: TextAlign.center),
                  ],
                ),
              )
                  : ListView.builder(
                padding: const EdgeInsets.all(20),
                itemCount: domicilios.length,
                itemBuilder: (context, index) => _buildDomicilioCard(domicilios[index], index),
              ),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildDomicilioCard(Domicilio domicilio, int index) {
    return FutureBuilder<SharedPreferences>(
      future: SharedPreferences.getInstance(),
      builder: (context, snapshot) {
        int retraso = 0;
        bool suspendida = false;
        if (snapshot.hasData) {
          retraso = snapshot.data!.getInt('retraso_minutos') ?? 0;
          suspendida = snapshot.data!.getBool('ruta_suspendida') ?? false;
        }

        String horarioMostrar = domicilio.horarioEstimado;
        if (retraso > 0 && !suspendida) {
          final partes = domicilio.horarioEstimado.split(':');
          int hora = int.parse(partes[0]);
          int minuto = int.parse(partes[1]);
          minuto += retraso;
          if (minuto >= 60) {
            hora += minuto ~/ 60;
            minuto = minuto % 60;
          }
          horarioMostrar = '${hora.toString().padLeft(2, '0')}:${minuto.toString().padLeft(2, '0')} (retraso $retraso min)';
        } else if (suspendida) {
          horarioMostrar = 'SUSPENDIDA';
        }

        return Padding(
          padding: const EdgeInsets.only(bottom: 20),
          child: Container(
            decoration: BoxDecoration(
              border: Border.all(color: Colors.black, width: 4),
              borderRadius: BorderRadius.circular(25),
            ),
            child: Padding(
              padding: const EdgeInsets.all(15),
              child: Column(
                children: [
                  Row(
                    children: [
                      const Icon(Icons.home_outlined, size: 60),
                      const SizedBox(width: 10),
                      Expanded(
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            Text(domicilio.nombre, style: const TextStyle(fontSize: 22, fontWeight: FontWeight.bold)),
                            const SizedBox(height: 4),
                            Text(domicilio.direccionCompleta, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w500)),
                            const SizedBox(height: 4),
                            Text('📍 ${domicilio.latitud.toStringAsFixed(4)}, ${domicilio.longitud.toStringAsFixed(4)}', style: TextStyle(fontSize: 12, color: Colors.grey[600])),
                          ],
                        ),
                      ),
                    ],
                  ),
                  const SizedBox(height: 12),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Expanded(
                        child: Container(
                          padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12),
                          decoration: BoxDecoration(
                            color: suspendida ? Colors.red.withOpacity(0.2) : colorAzul.withOpacity(0.1),
                            borderRadius: BorderRadius.circular(12),
                          ),
                          child: Row(
                            children: [
                              Icon(Icons.access_time, color: suspendida ? Colors.red : colorAzul, size: 20),
                              const SizedBox(width: 8),
                              Text(
                                suspendida ? 'RUTA SUSPENDIDA' : 'Horario: $horarioMostrar',
                                style: TextStyle(
                                  fontSize: 14,
                                  fontWeight: FontWeight.w500,
                                  color: suspendida ? Colors.red : colorAzul,
                                ),
                              ),
                            ],
                          ),
                        ),
                      ),
                      const SizedBox(width: 10),
                      MapaExpandible(
                        latitud: domicilio.latitud,
                        longitud: domicilio.longitud,
                        nombreDomicilio: domicilio.nombre,
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ),
        );
      },
    );
  }
}