// Inicializar FullCalendar (versión global, sin plugins)
let calendar;
let datosHorariosTiendas = [];

// Función para aplicar descansos obligatorios según la tienda
function aplicarDescansosObligatorios() {
    if (!window.datosTiendaActual) return;
    
    const datosTienda = window.datosTiendaActual;
    const mapDias = {
        'Lunes': 'lunes',
        'Martes': 'martes',
        'Miércoles': 'miercoles',
        'Jueves': 'jueves',
        'Viernes': 'viernes',
        'Sábado': 'sabado',
        'Domingo': 'domingo'
    };
    const dias = Object.keys(mapDias);
    const diasDescanso = dias.filter(dia => datosTienda[mapDias[dia]] === 'No se labora');
    
    setTimeout(function() {
        document.querySelectorAll('#descansos-por-semana select').forEach(function(sel) {
            // IMPORTANTE: Guardar las opciones originales (con fecha) antes de modificar
            const opcionesOriginales = Array.from(sel.querySelectorAll('option')).map(opt => ({
                value: opt.value,
                text: opt.textContent,
                dia: opt.value.split('|')[0]
            }));
            
            // Si solo hay un día de descanso (ejemplo: domingo), solo mostrar ese día
            if (diasDescanso.length === 1) {
                const dia = diasDescanso[0];
                // Buscar la opción original que corresponde a este día para obtener la fecha
                const opcionOriginal = opcionesOriginales.find(opt => opt.dia === dia);
                
                if (opcionOriginal) {
                    // El día de descanso SÍ existe en esta semana
                    sel.innerHTML = '';
                    const option = document.createElement('option');
                    option.value = opcionOriginal.value; // Formato "Dia|Fecha"
                    option.textContent = opcionOriginal.text;
                    sel.appendChild(option);
                    sel.value = opcionOriginal.value;
                    sel.disabled = true;
                    sel.required = true;
                } else {
                    // El día de descanso NO existe en esta semana (cae en otra quincena)
                    sel.innerHTML = '';
                    const option = document.createElement('option');
                    option.value = '';
                    option.textContent = `${dia} no aplica en esta semana`;
                    option.disabled = true;
                    option.selected = true;
                    sel.appendChild(option);
                    sel.disabled = true;
                    sel.required = false; // CRUCIAL: No requerido si no hay opción válida
                }
            } else if (diasDescanso.length > 1) {
                // Si hay varios días de descanso, solo mostrar esos días
                sel.innerHTML = '';
                let hayOpciones = false;
                diasDescanso.forEach(function(dia) {
                    // Buscar la opción original que corresponde a este día
                    const opcionOriginal = opcionesOriginales.find(opt => opt.dia === dia);
                    if (opcionOriginal) {
                        const option = document.createElement('option');
                        option.value = opcionOriginal.value; // Formato "Dia|Fecha"
                        option.textContent = opcionOriginal.text;
                        sel.appendChild(option);
                        hayOpciones = true;
                    }
                });
                
                // Si no hay opciones válidas para esta semana
                if (!hayOpciones) {
                    const option = document.createElement('option');
                    option.value = '';
                    option.textContent = 'No aplica en esta semana';
                    option.disabled = true;
                    option.selected = true;
                    sel.appendChild(option);
                    sel.disabled = true;
                    sel.required = false;
                } else {
                    sel.disabled = false;
                    sel.required = true;
                }
            } else {
                // Si NO hay días de descanso obligatorios (tienda labora 7 días),
                // dejar el select con la opción "Sin descanso" seleccionada
                sel.innerHTML = '';
                const optionSinDescanso = document.createElement('option');
                optionSinDescanso.value = '';
                optionSinDescanso.textContent = 'Sin descanso';
                optionSinDescanso.selected = true;
                sel.appendChild(optionSinDescanso);
                
                // Agregar las demás opciones para que el usuario pueda elegir manualmente
                opcionesOriginales.forEach(function(opt) {
                    if (opt.value !== '') {
                        const option = document.createElement('option');
                        option.value = opt.value;
                        option.textContent = opt.text;
                        sel.appendChild(option);
                    }
                });
                sel.disabled = false;
                sel.required = false; // No es requerido si no hay descansos obligatorios
            }
        });
        
        // NUEVO: Ocultar botones "+" cuando hay un descanso obligatorio automático
        if (diasDescanso.length === 1) {
            document.querySelectorAll('.btn-add-descanso-asignar').forEach(function(btn) {
                btn.style.display = 'none';
            });
        } else {
            // Mostrar botones "+" si no hay descanso automático obligatorio
            document.querySelectorAll('.btn-add-descanso-asignar').forEach(function(btn) {
                // Solo mostrar si hay menos de 2 selects en esa semana
                const semana = btn.getAttribute('data-semana');
                const container = document.querySelector(`#semana-descanso-${semana}`);
                const count = container ? container.querySelectorAll('.descanso-semana-select').length : 0;
                if (count < 2) {
                    btn.style.display = 'inline-block';
                }
            });
        }
    }, 300);
}

// Función para bloquear campos de horario de días que no se laboran
function bloquearDiasNoLaborables() {
    if (!window.datosTiendaActual) return;
    
    const datosTienda = window.datosTiendaActual;
    const mapDias = {
        'Lunes': 'lunes',
        'Martes': 'martes',
        'Miércoles': 'miercoles',
        'Jueves': 'jueves',
        'Viernes': 'viernes',
        'Sábado': 'sabado',
        'Domingo': 'domingo'
    };
    
    setTimeout(function() {
        // Bloquear en modo quincenal (tabla única)
        const tablaQuincenal = document.getElementById('tabla-horario-semanal');
        if (tablaQuincenal) {
            Object.keys(mapDias).forEach(function(dia) {
                const clave = mapDias[dia];
                const valorApertura = datosTienda[clave];
                
                if (valorApertura === 'No se labora') {
                    const entrada = tablaQuincenal.querySelector(`[name='entrada_${dia}']`);
                    const salida = tablaQuincenal.querySelector(`[name='salida_${dia}']`);
                    
                    if (entrada && salida) {
                        entrada.value = '';
                        salida.value = '';
                        entrada.disabled = true;
                        salida.disabled = true;
                        entrada.removeAttribute('required');
                        salida.removeAttribute('required');
                        // Agregar estilo visual
                        entrada.style.backgroundColor = '#f5f5f5';
                        salida.style.backgroundColor = '#f5f5f5';
                    }
                }
            });
        }
        
        // Bloquear en modo semanal (múltiples tablas por semana)
        const tablasSemana = document.querySelectorAll('.tabla-horario-semanal');
        tablasSemana.forEach(function(tabla) {
            Object.keys(mapDias).forEach(function(dia) {
                const clave = mapDias[dia];
                const valorApertura = datosTienda[clave];
                
                if (valorApertura === 'No se labora') {
                    const numSemana = tabla.getAttribute('data-semana');
                    const entrada = tabla.querySelector(`[name='entrada_${dia}_semana${numSemana}']`);
                    const salida = tabla.querySelector(`[name='salida_${dia}_semana${numSemana}']`);
                    
                    if (entrada && salida) {
                        entrada.value = '';
                        salida.value = '';
                        entrada.disabled = true;
                        salida.disabled = true;
                        entrada.removeAttribute('required');
                        salida.removeAttribute('required');
                        // Agregar estilo visual
                        entrada.style.backgroundColor = '#f5f5f5';
                        salida.style.backgroundColor = '#f5f5f5';
                    }
                }
            });
        });
    }, 400);
}

// Función para bloquear campos de horario de días que no se laboran - MODAL EDITAR
function bloquearDiasNoLaborablesEditar() {
    if (!window.datosTiendaActual) return;
    
    const datosTienda = window.datosTiendaActual;
    const mapDias = {
        'Lunes': 'lunes',
        'Martes': 'martes',
        'Miércoles': 'miercoles',
        'Jueves': 'jueves',
        'Viernes': 'viernes',
        'Sábado': 'sabado',
        'Domingo': 'domingo'
    };
    
    setTimeout(function() {
        // PASO 1: DESBLOQUEAR TODOS los inputs que fueron bloqueados por descanso
        // (excepto los que son realmente no laborables por la tienda)
        const tablasEditar = document.querySelectorAll('.tabla-horario-semanal-editar');
        tablasEditar.forEach(function(tabla) {
            const filas = tabla.querySelectorAll('tbody tr');
            filas.forEach(function(fila) {
                const dia = fila.getAttribute('data-dia');
                const clave = mapDias[dia];
                const valorApertura = datosTienda[clave];
                const numSemana = tabla.getAttribute('data-semana');
                const entrada = fila.querySelector(`[name='entrada_${dia}_semana${numSemana}_editar']`);
                const salida = fila.querySelector(`[name='salida_${dia}_semana${numSemana}_editar']`);
                
                // Si NO es día no laborable por la tienda, desbloquear
                if (valorApertura !== 'No se labora' && entrada && salida) {
                    if (entrada.disabled) {
                        entrada.type = 'time';
                        salida.type = 'time';
                        entrada.disabled = false;
                        salida.disabled = false;
                        entrada.setAttribute('required', 'required');
                        salida.setAttribute('required', 'required');
                        entrada.style.backgroundColor = '';
                        salida.style.backgroundColor = '';
                        // Restaurar valores por defecto si están vacíos o con ----
                        if (!entrada.value || entrada.value === '----') entrada.value = '09:00';
                        if (!salida.value || salida.value === '----') salida.value = '18:00';
                    }
                }
            });
        });
        
        // PASO 2: Obtener FECHAS de descanso guardados (no solo nombres de días)
        const fechasDescansoGuardadas = new Set();
        document.querySelectorAll('#descansos-por-semana-editar select').forEach(function(sel) {
            const valor = sel.value;
            if (valor) {
                const fecha = valor.split('|')[1]; // Obtener la FECHA, no el día
                if (fecha) {
                    fechasDescansoGuardadas.add(fecha);
                }
            }
        });
        
        // PASO 3: Bloquear días que NO se laboran o que son descansos guardados
        tablasEditar.forEach(function(tabla) {
            const filas = tabla.querySelectorAll('tbody tr');
            filas.forEach(function(fila) {
                const dia = fila.getAttribute('data-dia');
                const fecha = fila.getAttribute('data-fecha');
                const clave = mapDias[dia];
                const valorApertura = datosTienda[clave];
                
                // CORREGIDO: Comparar por FECHA, no por nombre de día
                const esDescansoGuardado = fechasDescansoGuardadas.has(fecha);
                
                if (valorApertura === 'No se labora' || esDescansoGuardado) {
                    const numSemana = tabla.getAttribute('data-semana');
                    const entrada = fila.querySelector(`[name='entrada_${dia}_semana${numSemana}_editar']`);
                    const salida = fila.querySelector(`[name='salida_${dia}_semana${numSemana}_editar']`);
                    
                    if (entrada && salida) {
                        // Mostrar ---- en lugar de 00:00
                        entrada.type = 'text';
                        salida.type = 'text';
                        entrada.value = '----';
                        salida.value = '----';
                        entrada.disabled = true;
                        salida.disabled = true;
                        entrada.removeAttribute('required');
                        salida.removeAttribute('required');
                        // Agregar estilo visual
                        entrada.style.backgroundColor = '#f5f5f5';
                        salida.style.backgroundColor = '#f5f5f5';
                    }
                }
            });
        });
    }, 200);
}

// Función para aplicar descansos obligatorios en el MODAL EDITAR
function aplicarDescansosObligatoriosEditar() {
    if (!window.datosTiendaActual) return;
    
    const datosTienda = window.datosTiendaActual;
    const mapDias = {
        'Lunes': 'lunes',
        'Martes': 'martes',
        'Miércoles': 'miercoles',
        'Jueves': 'jueves',
        'Viernes': 'viernes',
        'Sábado': 'sabado',
        'Domingo': 'domingo'
    };
    const dias = Object.keys(mapDias);
    const diasDescanso = dias.filter(dia => datosTienda[mapDias[dia]] === 'No se labora');
    
    setTimeout(function() {
        document.querySelectorAll('#descansos-por-semana-editar select').forEach(function(sel) {
            // IMPORTANTE: Guardar el valor actual antes de modificar
            const valorActual = sel.value;
            const idDescansoActual = $(sel).data('id-descanso');
            
            const opcionesOriginales = Array.from(sel.querySelectorAll('option')).map(opt => ({
                value: opt.value,
                text: opt.textContent,
                dia: opt.value.split('|')[0]
            }));
            
            if (diasDescanso.length === 1) {
                const dia = diasDescanso[0];
                const opcionOriginal = opcionesOriginales.find(opt => opt.dia === dia);
                
                if (opcionOriginal) {
                    sel.innerHTML = '';
                    const option = document.createElement('option');
                    option.value = opcionOriginal.value;
                    option.textContent = opcionOriginal.text;
                    sel.appendChild(option);
                    sel.value = opcionOriginal.value;
                    sel.disabled = true;
                    sel.required = true;
                } else {
                    sel.innerHTML = '';
                    const option = document.createElement('option');
                    option.value = '';
                    option.textContent = `${dia} no aplica en esta semana`;
                    option.disabled = true;
                    option.selected = true;
                    sel.appendChild(option);
                    sel.disabled = true;
                    sel.required = false;
                }
            } else if (diasDescanso.length > 1) {
                sel.innerHTML = '';
                let hayOpciones = false;
                diasDescanso.forEach(function(dia) {
                    const opcionOriginal = opcionesOriginales.find(opt => opt.dia === dia);
                    if (opcionOriginal) {
                        const option = document.createElement('option');
                        option.value = opcionOriginal.value;
                        option.textContent = opcionOriginal.text;
                        sel.appendChild(option);
                        hayOpciones = true;
                    }
                });
                
                if (!hayOpciones) {
                    const option = document.createElement('option');
                    option.value = '';
                    option.textContent = 'No aplica en esta semana';
                    option.disabled = true;
                    option.selected = true;
                    sel.appendChild(option);
                    sel.disabled = true;
                    sel.required = false;
                } else {
                    // RESTAURAR el valor guardado si existe
                    if (valorActual) {
                        sel.value = valorActual;
                    }
                    sel.disabled = false;
                    sel.required = true;
                }
            } else {
                // Si NO hay días de descanso obligatorios (tienda labora 7 días),
                // dejar el select con la opción "Sin descanso" seleccionada
                sel.innerHTML = '';
                const optionSinDescanso = document.createElement('option');
                optionSinDescanso.value = '';
                optionSinDescanso.textContent = 'Sin descanso';
                sel.appendChild(optionSinDescanso);
                
                // Agregar las demás opciones para que el usuario pueda elegir manualmente
                opcionesOriginales.forEach(function(opt) {
                    if (opt.value !== '') {
                        const option = document.createElement('option');
                        option.value = opt.value;
                        option.textContent = opt.text;
                        sel.appendChild(option);
                    }
                });
                
                // RESTAURAR el valor guardado si existe, sino "Sin descanso"
                if (valorActual) {
                    sel.value = valorActual;
                } else {
                    sel.value = '';
                }
                
                sel.disabled = false;
                sel.required = false; // No es requerido si no hay descansos obligatorios
            }
            
            // RESTAURAR el id_descanso si existía
            if (idDescansoActual) {
                $(sel).data('id-descanso', idDescansoActual);
            }
        });
        
        // Ocultar botones "+" cuando hay un descanso obligatorio automático
        if (diasDescanso.length === 1) {
            document.querySelectorAll('.btn-add-descanso-editar').forEach(function(btn) {
                btn.style.display = 'none';
            });
        } else {
            document.querySelectorAll('.btn-add-descanso-editar').forEach(function(btn) {
                const semana = btn.getAttribute('data-semana');
                const container = document.querySelector(`#semana-descanso-editar-${semana}`);
                const count = container ? container.querySelectorAll('.descanso-semana-select-editar').length : 0;
                if (count < 2) {
                    btn.style.display = 'inline-block';
                }
            });
        }
    }, 300);
}

document.addEventListener('DOMContentLoaded', function() {
    // --- INICIO: Cargar horarios de tiendas al inicio ---
    fetch('../../../backend/api/horarios_tiendas.php')
        .then(res => res.json())
        .then(resp => {
            if (resp.success && resp.data) {
                window.datosHorariosTiendas = resp.data;
            } else {
                window.datosHorariosTiendas = [];
            }
        })
        .catch(() => { window.datosHorariosTiendas = []; });
    // --- FIN: Cargar horarios de tiendas al inicio ---

    // Validación del formulario
    document.getElementById('form-crear-horario').addEventListener('submit', function(e) {
        const semana = document.getElementById('semana');

        if (semana.value === '') {
            e.preventDefault();
            Swal.fire({
                icon: 'warning',
                title: 'Falta seleccionar semana',
                text: 'Por favor seleccione una semana.'
            });
            semana.focus();
            return;
        }
    });

    // Cargar empleados activos por AJAX
    function cargarEmpleadosActivos() {
        const pdv = pdvUsuario; // <-- Aquí usamos la variable que definiste en inline script

        if (!pdv) {
            document.getElementById('empleados-list').innerHTML = '<div class="alert alert-info">No hay PDV definido para mostrar empleados.</div>';
            return;
        }

        fetch(`../../../backend/api/empleados_activos.php?departamento=${encodeURIComponent(pdv)}`)
            .then(res => res.json())
            .then(response => {
                let html = '';
                if (response.data && response.data.length > 0) {
                    response.data.forEach(function(emp) {
                        html += `<div class="col-12 mb-2">
                            <div class="colaborador-tarjeta card card-body py-2 px-3 mb-2 shadow-sm border-primary border-2"
                                 draggable="true"
                                 data-id="${emp.curp}"
                                 data-nombre="${emp.nombres} ${emp.apellido_paterno} ${emp.apellido_materno}"
                                 style="cursor: grab;">
                                <div class="d-flex align-items-center">
                                    <div class="me-3">
                                        <i class="fas fa-${emp.genero === 'M' ? 'venus text-pink' : 'mars text-primary'} fa-2x"></i>
                                    </div>
                                    <div class="flex-grow-1">
                                        <div class="fw-semibold">${emp.nombres} ${emp.apellido_paterno} ${emp.apellido_materno}</div>
                                        <div class="text-muted small">${emp.puesto}</div>
                                    </div>
                                    <div>
                                        <input type="checkbox" class="form-check-input empleado-checkbox ms-2" value="${emp.curp}" data-nombre="${emp.nombres} ${emp.apellido_paterno} ${emp.apellido_materno}">
                                    </div>
                                </div>
                            </div>
                        </div>`;
                    });
                } else {
                    html = '<div class="alert alert-warning">No hay empleados activos para mostrar.</div>';
                }
                document.getElementById('empleados-list').innerHTML = html;
                
                // Después de cargar empleados, marcar los que tienen horario asignado
                marcarEmpleadosConHorario();
            })
            .catch(() => {
                document.getElementById('empleados-list').innerHTML = '<div class="alert alert-danger">Error al cargar empleados.</div>';
                Swal.fire({
                    icon: 'error',
                    title: 'Error',
                    text: 'Error al cargar empleados.'
                });
            });
    }

    // Función para marcar empleados que tienen horario asignado en la quincena activa
    function marcarEmpleadosConHorario() {
        // Obtener id_quincena del periodo activo
        fetch('../../../backend/api/horario_edicion_flag.php')
            .then(r => r.json())
            .then(data => {
                if (data.activar_crear_horario && data.periodo && data.periodo.id_quincena) {
                    const id_quincena = data.periodo.id_quincena;
                    
                    // Obtener empleados con horario asignado
                    return fetch(`../../../backend/api/empleados_con_horario.php?id_quincena=${id_quincena}`);
                }
                return null;
            })
            .then(r => r ? r.json() : null)
            .then(data => {
                if (data && data.success && Array.isArray(data.empleados_con_horario)) {
                    // Marcar cada empleado con horario
                    data.empleados_con_horario.forEach(curp => {
                        const tarjeta = document.querySelector(`.colaborador-tarjeta[data-id="${curp}"]`);
                        if (tarjeta) {
                            // Agregar badge visual
                            const badge = document.createElement('div');
                            badge.className = 'horario-asignado-badge';
                            badge.innerHTML = '<i class="fas fa-check"></i>';
                            badge.title = 'Tiene horario asignado';
                            tarjeta.appendChild(badge);
                            
                            // Agregar botón de editar en lugar del checkbox
                            const checkboxContainer = tarjeta.querySelector('.d-flex.align-items-center > div:last-child');
                            if (checkboxContainer) {
                                checkboxContainer.innerHTML = `
                                    <button type="button" class="btn btn-warning btn-sm btn-editar-horario-individual" 
                                            data-curp="${curp}" 
                                            data-nombre="${tarjeta.dataset.nombre}"
                                            title="Editar horario">
                                        <i class="fas fa-edit"></i> Editar
                                    </button>
                                `;
                            }
                        }
                    });
                }
            })
            .catch(err => {
                console.error('Error al cargar empleados con horario:', err);
            });
    }

    // Ya no hay listener porque PDV es fijo y no cambia

    // Cargar empleados para el PDV del usuario al cargar la página
    cargarEmpleadosActivos();

    // Lógica para mostrar/ocultar selector de día en el modal
    document.addEventListener('change', function(e) {
        if (e.target && e.target.id === 'periodo-asignacion') {
            if (e.target.value === 'dia') {
                var selectorDia = document.getElementById('selector-dia');
                if (selectorDia) selectorDia.style.display = '';
            } else {
                var selectorDia = document.getElementById('selector-dia');
                if (selectorDia) selectorDia.style.display = 'none';
            }
        }
    });

    // Lógica para limitar horas según turno en el modal múltiple
    document.addEventListener('change', function(e) {
        if (e.target && e.target.id === 'turno-multi') {
            if (e.target.value === 'matutino') {
                document.getElementById('hora-entrada-multi').min = '08:40';
                document.getElementById('hora-entrada-multi').max = '12:00';
                document.getElementById('hora-entrada-multi').value = '08:40';
                document.getElementById('hora-salida-multi').min = '12:00';
                document.getElementById('hora-salida-multi').max = '20:00';
                document.getElementById('hora-salida-multi').value = '16:00';
            } else {
                document.getElementById('hora-entrada-multi').min = '12:00';
                document.getElementById('hora-entrada-multi').max = '20:00';
                document.getElementById('hora-entrada-multi').value = '12:00';
                document.getElementById('hora-salida-multi').min = '12:00';
                document.getElementById('hora-salida-multi').max = '20:00';
                document.getElementById('hora-salida-multi').value = '20:00';
            }
        }
    });

    // Mostrar modal y colaboradores seleccionados al hacer click en el botón
    document.getElementById('btn-asignar-horario').addEventListener('click', function() {
        const checks = document.querySelectorAll('.empleado-checkbox:checked');
        const lista = document.getElementById('lista-colaboradores-seleccionados');
        lista.innerHTML = '';
        if (checks.length === 0) {
            Swal.fire({
                icon: 'warning',
                title: 'Sin selección',
                text: 'Selecciona al menos un colaborador.'
            });
            return;
        } else {
            checks.forEach(function(chk) {
                const li = document.createElement('li');
                li.textContent = chk.getAttribute('data-nombre');
                lista.appendChild(li);
            });
        }
        // --- INICIO INTEGRACIÓN HORARIOS DE TIENDA ---
        fetch('../../../backend/api/horarios_tiendas.php')
            .then(res => res.json())
            .then(resp => {
                if (!resp.success || !resp.data) return;
                const tiendaUsuario = pdvUsuario;
                // Solo tomamos la primera tienda (única para el usuario)
                const datosTienda = resp.data[0];
                // Guardar datos de la tienda en variable global para uso posterior
                window.datosTiendaActual = datosTienda;
                if (datosTienda) {
                    // Mapeo para normalizar los días a las claves del backend
                    const mapDias = {
                        'Lunes': 'lunes',
                        'Martes': 'martes',
                        'Miércoles': 'miercoles',
                        'Jueves': 'jueves',
                        'Viernes': 'viernes',
                        'Sábado': 'sabado',
                        'Domingo': 'domingo'
                    };
                    const dias = Object.keys(mapDias);
                    dias.forEach(function(dia) {
                        let entrada = document.querySelector(`[name='entrada_${dia}']`);
                        let salida = document.querySelector(`[name='salida_${dia}']`);
                        const clave = mapDias[dia];
                        const valorApertura = datosTienda[clave];
                        const valorCierre = datosTienda[clave + 'C'];
                        if (entrada && salida) {
                            if (valorApertura && valorApertura !== 'No se labora') {
                                entrada.min = valorApertura;
                                salida.max = valorCierre;
                                entrada.disabled = false;
                                salida.disabled = false;
                            } else {
                                entrada.value = '';
                                salida.value = '';
                                entrada.disabled = true;
                                salida.disabled = true;
                            }
                        }
                    });
                    // Validar que al menos un día laborable esté habilitado
                    const algunDiaLaborable = dias.some(dia => {
                        const clave = mapDias[dia];
                        return datosTienda[clave] && datosTienda[clave] !== 'No se labora';
                    });
                    if (!algunDiaLaborable) {
                        Swal.fire({
                            icon: 'warning',
                            title: 'Tienda sin días laborables',
                            text: 'No hay días laborables configurados para esta tienda.'
                        });
                        return;
                    }
                    // --- Setear descansos obligatorios ---
                    aplicarDescansosObligatorios();
                    // --- Bloquear días no laborables ---
                    bloquearDiasNoLaborables();
                }
            });
        // --- FIN INTEGRACIÓN HORARIOS DE TIENDA ---
        // Resetear campos del modal (solo si existen)
        var periodoAsignacion = document.getElementById('periodo-asignacion');
        if (periodoAsignacion) periodoAsignacion.value = 'quincena1';
        var selectorDia = document.getElementById('selector-dia');
        if (selectorDia) selectorDia.style.display = 'none';
        // Eliminar reseteo de campos que ya no existen
        // document.getElementById('turno-multi').value = 'matutino';
        // document.getElementById('hora-entrada-multi').value = '08:40';
        // document.getElementById('hora-salida-multi').value = '16:00';
        // Insertar el botón de replicar semana 1 si no existe (siempre visible)
        setTimeout(function() {
            if (!document.getElementById('btn-replicar-semana-1')) {
                const btn = document.createElement('button');
                btn.type = 'button';
                btn.className = 'btn btn-primary btn-sm mb-2 float-end';
                btn.id = 'btn-replicar-semana-1';
                btn.textContent = 'Replicar semana 1 en semanas 2 y 3';
                btn.disabled = true;
                const contenedor = document.querySelector('#bloque-horarios-semanales');
                if (contenedor) contenedor.prepend(btn);
            }
            // Habilitar/deshabilitar según el tipo de carga
            const tipoCarga = document.getElementById('tipo-carga-horario');
            const btnReplicar = document.getElementById('btn-replicar-semana-1');
            if (tipoCarga && btnReplicar) {
                btnReplicar.disabled = (tipoCarga.value !== 'semanal');
            }
        }, 300);
    // Habilitar/deshabilitar el botón de replicar al cambiar el tipo de carga
    $(document).on('change', '#tipo-carga-horario', function() {
        const btn = document.getElementById('btn-replicar-semana-1');
        if (btn) {
            btn.disabled = (this.value !== 'semanal');
        }
    });
        // Resetear tabla de horario semanal a 09:00 y 18:00
        const dias = ['Lunes','Martes','Miércoles','Jueves','Viernes','Sábado','Domingo'];
        dias.forEach(function(dia) {
            let entrada = document.querySelector(`[name='entrada_${dia}']`);
            let salida = document.querySelector(`[name='salida_${dia}']`);
            if (entrada) entrada.value = '09:00';
            if (salida) salida.value = '18:00';
        });
    // Evento para replicar semana 1 en semanas 2 y 3 en el modal de asignar horario
    $(document).on('click', '#btn-replicar-semana-1', function() {
        // Para cada día de la semana 1, copiar valores a semana 2 y 3
        for (let semana = 2; semana <= 3; semana++) {
            $(".tabla-horario-semanal[data-semana='1'] tbody tr").each(function(idx) {
                let entrada = $(this).find('input[name^="entrada_"]').val();
                let salida = $(this).find('input[name^="salida_"]').val();
                let checked = $(this).find('.descanso-checkbox').is(':checked');
                let $rowDestino = $(`.tabla-horario-semanal[data-semana='${semana}'] tbody tr`).eq(idx);
                $rowDestino.find('input[name^="entrada_"]').val(entrada);
                $rowDestino.find('input[name^="salida_"]').val(salida);
                $rowDestino.find('.descanso-checkbox').prop('checked', checked).trigger('change');
            });
        }
    });
    
    // Evento para replicar semana 1 en semanas 2 y 3 en el modal de EDITAR
    $(document).on('click', '#btn-replicar-semana-1-editar', function() {
        for (let semana = 2; semana <= 3; semana++) {
            $(".tabla-horario-semanal-editar[data-semana='1'] tbody tr").each(function(idx) {
                let entrada = $(this).find('input[name^="entrada_"]').val();
                let salida = $(this).find('input[name^="salida_"]').val();
                let $rowDestino = $(`.tabla-horario-semanal-editar[data-semana='${semana}'] tbody tr`).eq(idx);
                $rowDestino.find('input[name^="entrada_"]').val(entrada);
                $rowDestino.find('input[name^="salida_"]').val(salida);
            });
        }
    });
        // Mostrar modal
        var modal = new bootstrap.Modal(document.getElementById('modalAsignarHorario'));
        modal.show();
    });

    // Permitir seleccionar/deseleccionar tarjetas de colaborador al hacer click
    $(document).on('click', '.colaborador-tarjeta', function(e) {
        // Evitar que el click en el checkbox dispare el toggle
        if ($(e.target).is('input[type="checkbox"]')) return;
        // Evitar que el click en el botón de editar dispare el toggle
        if ($(e.target).closest('.btn-editar-horario-individual').length > 0) return;
        
        $(this).toggleClass('selected');
        // Sincronizar el checkbox con la selección visual
        var checkbox = $(this).find('.empleado-checkbox');
        checkbox.prop('checked', $(this).hasClass('selected'));
    });

    // Manejador para el botón de editar horario individual
    $(document).on('click', '.btn-editar-horario-individual', function(e) {
        e.stopPropagation();
        const curp = $(this).data('curp');
        const nombre = $(this).data('nombre');
        
        // IMPORTANTE: Llenar la lista ANTES de abrir el modal
        // para que el evento show.bs.modal pueda leer el CURP correctamente
        $('#lista-colaboradores-editar').html(`<li>${nombre} (ID: ${curp})</li>`);
        
        // Pequeño delay para asegurar que el DOM se actualice
        setTimeout(function() {
            $('#modalEditarHorario').modal('show');
        }, 10);
    });

    // Al hacer click en el checkbox, marcar/desmarcar la tarjeta visualmente
    $(document).on('change', '.empleado-checkbox', function() {
        var card = $(this).closest('.colaborador-tarjeta');
        card.toggleClass('selected', this.checked);
    });

    // Validación y submit del modal múltiple
    document.getElementById('form-asignar-horario').addEventListener('submit', function(e) {
        e.preventDefault();
        // Obtener colaboradores seleccionados
        const checks = document.querySelectorAll('.empleado-checkbox:checked');
        let colaboradores = [];
        checks.forEach(function(chk) {
            colaboradores.push({
                id: chk.value,
                nombre: chk.getAttribute('data-nombre')
            });
        });
        if (colaboradores.length === 0) {
            Swal.fire({
                icon: 'warning',
                title: 'Sin selección',
                text: 'Selecciona al menos un colaborador.'
            });
            return;
        }
        // Obtener periodo y quincena
        const periodo = document.getElementById('periodo-asignacion').value;
        const fechaBase = new Date();
        const year = fechaBase.getFullYear();
        const month = fechaBase.getMonth() + 1;
        // Obtener horario semanal
        const horarios = window.obtenerHorarioSemanalDelModal();
        // Calcular días de la quincena
        const diasQuincena = window.obtenerDiasQuincena(periodo, year, month);
        // Obtener id_quincena real desde backend
        fetch(`../../../backend/api/quincenas_disponibles.php?year=${year}&month=${month}`)
            .then(res => res.json())
            .then(data => {
                if (!data.success || !data.quincenas) {
                    Swal.fire({
                        icon: 'error',
                        title: 'Error',
                        text: 'No se pudo obtener la quincena.'
                    });
                    return;
                }
                let id_quincena = null;
                if (periodo === 'quincena1') {
                    id_quincena = data.quincenas[0]?.id_quincena;
                } else if (periodo === 'quincena2') {
                    id_quincena = data.quincenas[1]?.id_quincena;
                }
                // Solo mostrar el alert si el usuario realmente intentó asignar y no hay quincena válida
                if (!id_quincena) {                    
                    return;
                }
                // Enviar AJAX
                window.asignarHorarioAJAX(colaboradores, id_quincena, horarios, function(resultados) {
                    // Recargar eventos desde backend para reflejar cambios
                    setTimeout(window.cargarHorariosAsignadosEnCalendario, 500);
                    // Cerrar modal
                    var modal = bootstrap.Modal.getInstance(document.getElementById('modalAsignarHorario'));
                    modal.hide();
                    // Mensaje de éxito/error
                    let errores = resultados.filter(r => !r.data.success);
                    if (errores.length > 0) {
                        Swal.fire({
                            icon: 'error',
                            title: 'Error',
                            text: 'Ya existe un horario asignado para este colaborador y quincena.'
                        });
                    } else {
                        Swal.fire({
                            icon: 'success',
                            title: 'Éxito',
                            text: 'Horario semanal asignado correctamente.'
                        });
                    }
                });
            })
            .catch(() => {
                Swal.fire({
                    icon: 'error',
                    title: 'Error',
                    text: 'Error al obtener la quincena.'
                });
            });
    });

    // Al cargar la página, pintar los horarios asignados en el calendario
    // HACER GLOBAL para que sea accesible desde crear.php
    window.cargarHorariosAsignadosEnCalendario = function() {
        // CORRECCIÓN: Cuando se llama desde datesSet, usar el mes visible en el calendario
        // Solo usar periodo activo si no hay calendario inicializado
        let year, month;
        
        if (window.calendar && typeof window.calendar.getDate === 'function') {
            // Si el calendario está listo, usar el mes visible
            let fechaBase = window.calendar.getDate();
            year = fechaBase.getFullYear();
            month = fechaBase.getMonth() + 1;
        } else if (window.periodoActivo && window.periodoActivo.anio && window.periodoActivo.mes) {
            // Fallback: usar el periodo activo solo si el calendario no está listo
            year = window.periodoActivo.anio;
            month = window.periodoActivo.mes;
        } else {
            // Último fallback: mes actual
            let fechaBase = new Date();
            year = fechaBase.getFullYear();
            month = fechaBase.getMonth() + 1;
        }
        
        // Limpiar eventos previos
        if (window.calendar && typeof window.calendar.getEvents === 'function') {
            window.calendar.getEvents().forEach(ev => ev.remove());
        }
        fetch(`../../../backend/api/horarios_asignados_mes.php?year=${year}&month=${month}`)
            .then(res => res.json())
            .then(data => {
                if (!data.success || !data.horarios) return;
                // Paleta de colores para los eventos
                const colores = [
                    '#e57373', '#64b5f6', '#81c784', '#ffd54f', '#ba68c8', '#4db6ac', '#ffb74d', '#a1887f', '#90a4ae', '#f06292'
                ];
                let colaboradorColorMap = {};
                let colorIndex = 0;
                data.horarios.forEach(function(horario) {
                    // Asignar color único por colaborador
                    let colaboradorKey = horario.curp || (horario.NOMBRES + horario['APELLIDO PATERNO']);
                    if (!colaboradorColorMap[colaboradorKey]) {
                        colaboradorColorMap[colaboradorKey] = colores[colorIndex % colores.length];
                        colorIndex++;
                    }
                    const color = colaboradorColorMap[colaboradorKey];
                    // Construir set de fechas de descanso para este horario
                    let fechasDescanso = new Set();
                    if (horario.descansos && Array.isArray(horario.descansos)) {
                        horario.descansos.forEach(function(desc) {
                            if (desc.fecha_descanso) fechasDescanso.add(desc.fecha_descanso);
                        });
                    }
                    // Renderizar eventos de trabajo (solo si la fecha no es descanso)
                    if (horario.dias_trabajo && Array.isArray(horario.dias_trabajo)) {
                        horario.dias_trabajo.forEach(function(diaTrabajo) {
                            const horaEntrada = diaTrabajo.hora_entrada ? diaTrabajo.hora_entrada.substring(0,5) : '';
                            const horaSalida = diaTrabajo.hora_salida ? diaTrabajo.hora_salida.substring(0,5) : '';
                            (diaTrabajo.fechas || []).forEach(function(fecha) {
                                if (!fechasDescanso.has(fecha)) {
                                    window.calendar.addEvent({
                                        title: `${horario.NOMBRES} ${horario['APELLIDO PATERNO']} (${horaEntrada}-${horaSalida})`,
                                        start: fecha,
                                        allDay: true,
                                        backgroundColor: color,
                                        borderColor: color,
                                        textColor: '#fff',
                                        classNames: ['evento-horario-pequeno'],
                                        extendedProps: {
                                            colaboradorId: horario.curp,
                                            resumenHorario: true,
                                            horaEntrada: horaEntrada // Para ordenar
                                        }
                                    });
                                }
                            });
                        });
                    }
                    // Renderizar descansos
                    if (horario.descansos && Array.isArray(horario.descansos)) {
                        horario.descansos.forEach(function(desc) {
                            if (desc.fecha_descanso) {
                                window.calendar.addEvent({
                                    title: `${horario.NOMBRES} ${horario['APELLIDO PATERNO']} (Descanso)` ,
                                    start: desc.fecha_descanso,
                                    allDay: true,
                                    backgroundColor: '#bdbdbd',
                                    borderColor: '#bdbdbd',
                                    textColor: '#fff',
                                    classNames: ['evento-descanso'],
                                    extendedProps: {
                                        colaboradorId: horario.curp,
                                        descanso: true
                                    }
                                });
                            }
                        });
                    }
                });
            });
    }
    // Llamar al cargar y al cambiar de mes
    // NOTA: El evento datesSet ahora se registra en crear.php después de inicializar el calendario
    setTimeout(window.cargarHorariosAsignadosEnCalendario, 800);

    // Inicialización del calendario
    var calendarEl = document.getElementById('calendario-horarios');
    calendar = new FullCalendar.Calendar(calendarEl, {
        initialView: 'dayGridMonth',
        locale: 'es',
        selectable: true,
        selectMirror: true,
        headerToolbar: {
            left: 'prev,next today',
            center: 'title',
            right: ''
        },
        droppable: true,
        dropAccept: '.colaborador-tarjeta',
        eventReceive: function(info) {
            info.event.remove();
        },
        eventAllow: function(dropInfo, draggedEvent) {
            return true;
        },
        // Ordenar eventos por hora de entrada (HH:MM) usando función personalizada
        eventOrder: function(a, b) {
            // Obtener horaEntrada de ambos eventos
            const hA = a.extendedProps.horaEntrada || '23:59';
            const hB = b.extendedProps.horaEntrada || '23:59';
            // Comparar como strings (formato HH:MM)
            if (hA < hB) return -1;
            if (hA > hB) return 1;
            return 0;
        }
    });
    calendar.render();

    // --- FIX: Evitar que crear.js sobreescriba los valores en modo edición ---
    // Detectar si el modal está en modo edición antes de resetear los campos
    const originalAbrirModal = window.abrirModalAsignarHorario;
    window.abrirModalAsignarHorario = function() {
        // Si está en modo edición, no resetees los campos
        if ($('#modalAsignarHorario').data('curp-editar')) {
            var modal = new bootstrap.Modal(document.getElementById('modalAsignarHorario'));
            modal.show();
            return;
        }
        originalAbrirModal.apply(this, arguments);
    }
});
