import React, { useState, useEffect } from 'react'; import { Calendar, Clock, MapPin, Users, CheckSquare, Printer, Save, Upload, ChevronLeft, Music, Star, ListMusic, Trash2, Mail, Copy, X, FileText, Plus, Filter, Paperclip, Edit, CheckCircle, FileSpreadsheet } from 'lucide-react'; // --- UTILIDAD PARA FECHAS SEGURAS (CORRECCIÓN DE ZONA HORARIA) --- // Esta función evita que las fechas retrocedan un día al visualizarse en México/Latam const safeDate = (dateString) => { if (!dateString) return new Date(); // Si la fecha ya viene con hora (T...), la respetamos. // Si es solo YYYY-MM-DD, le agregamos T12:00:00 para fijarla al mediodía y evitar el desfase de zona horaria. if (dateString.includes('T')) return new Date(dateString); return new Date(dateString + 'T12:00:00'); }; // --- CONFIGURACIÓN DE DATOS MAESTROS --- const MUSIC_ACADEMIES = [ { name: 'Guitarra Eléctrica', teacher: 'Carlos Alcalá' }, { name: 'Guitarra Clásica', teacher: 'Carlos Alcalá' }, { name: 'Guitarra Clásica', teacher: 'Eduardo Barbosa' }, { name: 'Piano', teacher: 'Paula Rodríguez' }, { name: 'Piano', teacher: 'Natasha Cruz' }, { name: 'Piano', teacher: 'Victor García' }, { name: 'Batería', teacher: 'Jorge Arriaga' }, { name: 'Batería', teacher: 'Fernanda Chavez' }, { name: 'Violín', teacher: 'Roberto Tueme' }, { name: 'Violín', teacher: 'Bibiana Hernandez' }, { name: 'Cello', teacher: 'José Parra' }, { name: 'Canto', teacher: 'Thamar Hernandez' }, { name: 'Canto', teacher: 'Cintli Cruz' } ]; const INSTRUMENT_FAMILIES = { 'Guitarras': ['Guitarra'], 'Pianos': ['Piano'], 'Cuerdas Frotadas': ['Violín', 'Cello'], 'Percusiones': ['Batería'], 'Voces': ['Canto'] }; const DANCE_ACADEMIES = ['Ballet', 'Tap', 'Jazz']; const ENSEMBLE_TYPES = ['Solista', 'Dueto', 'Trío', 'Cuarteto', 'Grupo Pequeño', 'Grupo Completo']; const GRADES = ['Baby Steps', 'Little Steps', 'K1', 'K2', 'K3', '1° Primaria', '2° Primaria', '3° Primaria', '4° Primaria', '5° Primaria', '6° Primaria']; const SECTIONS = ['A', 'B', 'C', 'D']; const CHECKLIST_CATEGORIES = [ 'General & Administrativo', 'Producción Técnica (Audio/Luces/Backline)', 'Contenido Multimedia (Audio/Video)', 'Vestuario & Imagen', 'Cine & Guiones', 'Utilería & Escenografía', 'Logística & Transporte' ]; // --- DATOS INICIALES (FECHAS CORREGIDAS DEFINITIVAS 2026) --- const INITIAL_EVENTS = [ { id: 'evt-001', title: 'SMART Week - Recitales Instrumentales', date: '2026-05-18', // Lunes 18 de Mayo endDate: '2026-05-21', // Hasta Jueves 21 de Mayo type: 'recital', categoryMode: 'music_academy', description: 'Semana de recitales por academia (Guitarra, Piano, Violín, Canto, etc). Lunes a Jueves.', observations: '', checklist: [ { id: 'ck-1', title: 'Avisos a Padres', category: 'General & Administrativo', status: false, details: '', file: null, subItems: [] }, { id: 'ck-2', title: 'Programas de Mano', category: 'General & Administrativo', status: false, details: 'Desglosar por maestro', file: null, subItems: [] }, { id: 'ck-3', title: 'Lista Oficial de Alumnos', category: 'General & Administrativo', status: false, details: 'Actualizar con bajas y altas', file: null, subItems: [] }, { id: 'ck-4', title: 'Afinación de Pianos', category: 'Producción Técnica (Audio/Luces/Backline)', status: false, details: 'Contactar técnico externo', file: null, subItems: [] }, { id: 'ck-5', title: 'Backline (Amplis/Batería)', category: 'Producción Técnica (Audio/Luces/Backline)', status: false, details: 'Revisar cables y parches', file: null, subItems: [] }, { id: 'ck-6', title: 'Guion Técnico (Entradas/Salidas)', category: 'Producción Técnica (Audio/Luces/Backline)', status: false, details: 'Formato de flujo de alumnos', file: null, subItems: [] }, { id: 'ck-7', title: 'Maestro de Ceremonias', category: 'General & Administrativo', status: false, details: 'Definir presentadores', file: null, subItems: [] } ], program: [] }, { id: 'evt-002', title: 'Recital de Baile & Smart Rock (Cierre)', date: '2026-05-22', // Viernes 22 de Mayo type: 'concert', categoryMode: 'dance_academy', description: 'Cierre de Smart Week: Alumnos avanzados de instrumentos (Rock) y Academia de Baile.', observations: '', checklist: [ { id: 'ck-8', title: 'Diseño de Vestuarios', category: 'Vestuario & Imagen', status: false, details: 'Definir paleta de colores', file: null, subItems: [] }, { id: 'ck-9', title: 'Medidas de Alumnos', category: 'Vestuario & Imagen', status: false, details: 'Tabla de tallas', file: null, subItems: [] }, { id: 'ck-10', title: 'Edición de Canciones', category: 'Contenido Multimedia (Audio/Video)', status: false, details: 'Cortes para coreografías', file: null, subItems: [] }, { id: 'ck-11', title: 'Edición de Videos de Fondo', category: 'Contenido Multimedia (Audio/Video)', status: false, details: 'Visuales pantalla LED', file: null, subItems: [] }, { id: 'ck-12', title: 'Renta de Audio e Iluminación', category: 'Producción Técnica (Audio/Luces/Backline)', status: false, details: 'Cotizar proveedor', file: null, subItems: [] }, { id: 'ck-13', title: 'Guion Técnico (Entradas/Salidas)', category: 'Producción Técnica (Audio/Luces/Backline)', status: false, details: 'Vital para cambios rápidos', file: null, subItems: [] }, { id: 'ck-14', title: 'Lista Oficial de Alumnos', category: 'General & Administrativo', status: false, details: '', file: null, subItems: [] }, { id: 'ck-15', title: 'Venta de Boletos', category: 'Logística & Transporte', status: false, details: 'Asignación de asientos', file: null, subItems: [] } ], program: [] }, { id: 'evt-003', title: 'Largometraje en Cines', date: '2026-05-28', // Jueves 28 de Mayo type: 'cinema', categoryMode: 'grade', description: 'Proyección del largometraje escolar en sala de cine.', observations: '', checklist: [ { id: 'ck-16', title: 'Guion Literario', category: 'Cine & Guiones', status: false, details: 'Subir PDF final', file: null, subItems: [] }, { id: 'ck-17', title: 'Plan de Rodaje', category: 'Cine & Guiones', status: false, details: 'Calendario de filmación', file: null, subItems: [] }, { id: 'ck-18', title: 'Lista de Escenas', category: 'Cine & Guiones', status: false, details: 'Breakdown por locación', file: null, subItems: [] }, { id: 'ck-19', title: 'Edición de Video (Película)', category: 'Contenido Multimedia (Audio/Video)', status: false, details: 'Post-producción', file: null, subItems: [] }, { id: 'ck-20', title: 'Venta de Boletos (Cine)', category: 'Logística & Transporte', status: false, details: 'Coordinar con sala de cine', file: null, subItems: [] }, { id: 'ck-21', title: 'Lista Oficial de Alumnos', category: 'General & Administrativo', status: false, details: 'Para créditos', file: null, subItems: [] }, { id: 'ck-22', title: 'Guion Técnico (Protocolo)', category: 'Producción Técnica (Audio/Luces/Backline)', status: false, details: 'Alfombra roja', file: null, subItems: [] } ], program: [] }, { id: 'evt-004', title: 'Festival Parents Blast', date: '2026-06-11', // Jueves 11 de Junio type: 'festival', categoryMode: 'grade', description: 'Festival principal (Baby Steps a Primaria).', observations: '', checklist: [ { id: 'ck-23', title: 'Renta de Teatro', category: 'Producción Técnica (Audio/Luces/Backline)', status: false, details: 'Anticipo y contrato', file: null, subItems: [] }, { id: 'ck-24', title: 'Edición de Canciones (Tracks)', category: 'Contenido Multimedia (Audio/Video)', status: false, details: 'Pistas para grados', file: null, subItems: [] }, { id: 'ck-25', title: 'Edición de Videos (Proyecciones)', category: 'Contenido Multimedia (Audio/Video)', status: false, details: 'Loops de fondo', file: null, subItems: [] }, { id: 'ck-26', title: 'Diseño de Vestuarios', category: 'Vestuario & Imagen', status: false, details: 'Temática por grado', file: null, subItems: [] }, { id: 'ck-27', title: 'Medidas de Alumnos', category: 'Vestuario & Imagen', status: false, details: 'Toma general', file: null, subItems: [] }, { id: 'ck-28', title: 'Guion Técnico (Entradas/Salidas)', category: 'Producción Técnica (Audio/Luces/Backline)', status: false, details: 'Formato maestro', file: null, subItems: [] }, { id: 'ck-29', title: 'Utilería General', category: 'Utilería & Escenografía', status: false, details: 'Props por grado', file: null, subItems: [] }, { id: 'ck-30', title: 'Transporte de Alumnos', category: 'Logística & Transporte', status: false, details: 'Autobuses', file: null, subItems: [] }, { id: 'ck-31', title: 'Venta de Boletos', category: 'Logística & Transporte', status: false, details: 'Taquilla', file: null, subItems: [] }, { id: 'ck-32', title: 'Lista Oficial de Alumnos', category: 'General & Administrativo', status: false, details: 'Listas de cotejo', file: null, subItems: [] } ], program: [] }, { id: 'evt-005', title: 'Graduaciones', date: '2026-06-25', // Jueves 25 de Junio type: 'graduation', categoryMode: 'grade', description: 'Ceremonia de fin de cursos.', observations: '', checklist: [ { id: 'ck-33', title: 'Diplomas y Reconocimientos', category: 'General & Administrativo', status: false, details: 'Revisar ortografía de nombres', file: null, subItems: [] }, { id: 'ck-34', title: 'Lista Oficial de Graduados', category: 'General & Administrativo', status: false, details: '', file: null, subItems: [] }, { id: 'ck-35', title: 'Maestro de Ceremonias', category: 'General & Administrativo', status: false, details: 'Guion solemne', file: null, subItems: [] }, { id: 'ck-36', title: 'Guion Técnico (Protocolo)', category: 'Producción Técnica (Audio/Luces/Backline)', status: false, details: 'Orden de paso', file: null, subItems: [] }, { id: 'ck-37', title: 'Montaje de Escenario', category: 'Utilería & Escenografía', status: false, details: 'Mesa de honor, pódium', file: null, subItems: [] } ], program: [] } ]; // --- COMPONENTES AUXILIARES --- const Card = ({ children, className = "" }) => (
{children}
); const Badge = ({ type }) => { const styles = { recital: 'bg-purple-100 text-purple-700', concert: 'bg-pink-100 text-pink-700', cinema: 'bg-blue-100 text-blue-700', festival: 'bg-amber-100 text-amber-700', graduation: 'bg-emerald-100 text-emerald-700', default: 'bg-slate-100 text-slate-700' }; return ( {type} ); }; // --- MODAL DE PROPUESTA SMART WEEK (ACTUALIZADO 2026 - COMPACTO EDITABLE) --- const SmartWeekProposalModal = ({ onClose }) => { const handlePrint = () => { window.print(); }; return (
{/* Header (Solo pantalla) */}

Propuesta de Horarios (Mayo 2026)

Tip: Haz clic en el texto para editar antes de imprimir
{/* CONTENIDO IMPRIMIBLE - TAMAÑO CARTA */}
{/* ENCABEZADO */}

SMART

North Hill

SMART CENTER - Eventos 2026

Propuesta SMART WEEK

{/* GRID COMPACTO DE HORARIOS (2 COLUMNAS) */}
{/* LUNES 18 */}

Lunes 18 de Mayo - Guitarras

5:00 PMGuitarra Clásica - Nivel Inicial
6:30 PMGuitarra Clásica - Nivel Intermedio
8:00 PMGuitarra Clásica & Eléctrica - Avanzado
{/* MARTES 19 */}

Martes 19 de Mayo - Pianos

5:00 PMPiano - Inicial (Baby/Little Steps)
6:30 PMPiano - Intermedio (Primaria Menor)
8:00 PMPiano - Avanzado (Primaria Mayor)
{/* MIERCOLES 20 */}

Miércoles 20 - Cuerdas

5:00 PMViolín & Cello - Nivel Inicial
6:30 PMViolín & Cello - Nivel Intermedio
8:00 PMEnsamble de Cuerdas Avanzado
{/* JUEVES 21 */}

Jueves 21 - Voces y Ritmo

5:00 PMCanto & Batería - Nivel Inicial
6:30 PMCanto & Batería - Nivel Intermedio
8:00 PMEnsamble Vocal y Percusiones Av.
{/* VIERNES 22 - FULL WIDTH */}

Viernes 22 de Mayo - GRAN CIERRE

6:00 PMRecital de Academias de Baile (Ballet, Tap, Jazz)
8:00 PMCONCIERTO SMART ROCK (Ensamble Avanzado)
{/* NOTA EDITABLE COMPACTA */}

NOTA: Esta programación es una propuesta tentativa. Los horarios y conformación de ensambles pueden variar según el avance técnico de los alumnos. Agradecemos su flexibilidad.

North Hill | SMART CENTER | {safeDate(new Date().toISOString()).getFullYear()}
); }; // --- MODAL DE CORREO --- const EmailDraftModal = ({ event, rehearsals, onClose }) => { const eventRehearsals = rehearsals.filter(r => r.relatedEventId === event.id).sort((a,b) => (a.date + a.time).localeCompare(b.date + b.time)); const generateEmailText = () => { const header = `ASUNTO: Información Importante - ${event.title}\n\n`; const greeting = `Estimados Padres de Familia y Alumnos del Colegio SMART,\n\nEsperando que se encuentren muy bien, les hacemos llegar los detalles y la programación de ensayos para nuestro próximo evento: "${event.title}".\n\n`; let schedule = `📅 CALENDARIO DE ENSAYOS:\n`; if (eventRehearsals.length === 0) schedule += `(Aún no hay ensayos programados en el sistema)\n`; else eventRehearsals.forEach(r => { schedule += `🔹 ${r.title}\n Fecha: ${safeDate(r.date).toLocaleDateString('es-MX', { weekday: 'long', day: 'numeric', month: 'long' })}\n Hora: ${r.time}\n Lugar: ${r.location}\n Maestro: ${r.teacher || 'Titular'}\n\n`; }); const notes = event.observations ? `📝 OBSERVACIONES IMPORTANTES:\n${event.observations}\n\n` : ''; const closing = `Agradecemos de antemano su apoyo con la puntualidad y asistencia, elementos clave para el éxito de nuestras presentaciones.\n\nAtentamente,\nCoordinación de Eventos SMART`; return header + greeting + schedule + notes + closing; }; const [text, setText] = useState(generateEmailText()); const [copied, setCopied] = useState(false); const handleCopy = () => { navigator.clipboard.writeText(text); setCopied(true); setTimeout(() => setCopied(false), 2000); }; return (

Borrador de Aviso

Este texto se ha generado automáticamente con los ensayos programados. Puedes editarlo aquí antes de copiarlo.