import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:intl/intl.dart'; import '../../../../core/theme/app_colors.dart'; import '../../../../core/widgets/medical_modal.dart'; import '../../../config/presentation/store/config_store.dart'; import '../../services/department_referral_pdf_service.dart'; class DepartmentReferralModalView extends StatefulWidget { final String patientName; final ConfigStore? configStore; const DepartmentReferralModalView({ super.key, required this.patientName, this.configStore, }); @override State createState() => _DepartmentReferralModalViewState(); } class _DepartmentReferralModalViewState extends State { late final TextEditingController _referralController; late final ConfigStore _configStore; bool _isPrinting = false; String? _statusMessage; bool _hasError = false; @override void initState() { super.initState(); // Plantilla exacta por defecto de AlfaMedical (index.py líneas 1530-1553) final initialContent = [ 'Paciente: ${widget.patientName}', '', 'Referido al departamento de anestesiologia', 'Plan: Realizar evaluación pre-anestesica', '', 'Para realizar: ', '', '', 'Suite 408, 4ta planta. ', 'Gracias.', ].join('\n'); _referralController = TextEditingController(text: initialContent); _configStore = widget.configStore ?? ConfigStore(); _configStore.loadConfig(); } @override void dispose() { _referralController.dispose(); super.dispose(); } Future _handlePrint() async { final text = _referralController.text.trim(); if (text.isEmpty) { setState(() { _statusMessage = 'Debe redactar el contenido del referimiento.'; _hasError = true; }); return; } setState(() { _isPrinting = true; _statusMessage = 'Generando documento de referimiento a departamento...'; _hasError = false; }); try { await DepartmentReferralPdfService.printDepartmentReferral( doctorName: _configStore.nombreDoctor, specialty: _configStore.especialidad, subspecialty: _configStore.descripEspecialidad, generalContact: _configStore.descripGeneral, referralText: text, ); if (mounted) { setState(() { _isPrinting = false; _statusMessage = 'Referimiento generado con éxito.'; _hasError = false; }); } } catch (e) { if (mounted) { setState(() { _isPrinting = false; _statusMessage = 'Error al generar el referimiento: $e'; _hasError = true; }); } } } @override Widget build(BuildContext context) { final formattedDate = DateFormat('dd/MM/yyyy').format(DateTime.now()); final mediaQuery = MediaQuery.sizeOf(context); final modalHeight = (mediaQuery.height * 0.90).clamp(650.0, 780.0); final modalWidth = (mediaQuery.width * 0.90).clamp(840.0, 920.0); return Observer( builder: (_) { return MedicalModalDialog( maxWidth: modalWidth, maxHeight: modalHeight, title: 'Referir a Departamento', titleIcon: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: const Color(0xFF00A65A).withValues(alpha: 0.12), borderRadius: BorderRadius.circular(10), ), child: const Icon( Icons.apartment_rounded, color: Color(0xFF00A65A), size: 20, ), ), subtitle: const Text( 'Emisión oficial de referimiento médico a departamento o servicio institucional', style: TextStyle(fontSize: 12, color: AppColors.textMuted), ), bottomBar: Container( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), decoration: const BoxDecoration( color: Color(0xFFF8FAFC), border: Border(top: BorderSide(color: Color(0xFFE2E8F0))), ), child: Row( children: [ Container( padding: const EdgeInsets.all(4), decoration: BoxDecoration( color: _hasError ? AppColors.error.withValues(alpha: 0.12) : const Color(0xFF00A65A).withValues(alpha: 0.12), shape: BoxShape.circle, ), child: Icon( _hasError ? Icons.error_outline_rounded : Icons.check_circle_outline_rounded, size: 15, color: _hasError ? AppColors.error : const Color(0xFF00A65A), ), ), const SizedBox(width: 8), Expanded( child: Text( _statusMessage ?? (_isPrinting ? 'Preparando documento para impresión...' : 'Listo para emitir el referimiento a departamento'), style: TextStyle( fontSize: 12, fontWeight: FontWeight.w600, color: _hasError ? AppColors.error : AppColors.textSecondary, ), ), ), Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(6), border: Border.all(color: const Color(0xFFE2E8F0)), ), child: const Row( mainAxisSize: MainAxisSize.min, children: [ Icon(Icons.keyboard_outlined, size: 12, color: AppColors.textMuted), SizedBox(width: 4), Text( 'ESC para salir', style: TextStyle( fontSize: 11, color: AppColors.textMuted, fontWeight: FontWeight.w500, ), ), ], ), ), const SizedBox(width: 12), ElevatedButton.icon( onPressed: _isPrinting ? null : _handlePrint, icon: _isPrinting ? const SizedBox( width: 16, height: 16, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Icon(Icons.print_rounded, size: 16), label: Text( _isPrinting ? 'Generando...' : 'Crear / Imprimir Referimiento', style: const TextStyle(fontWeight: FontWeight.w600, fontSize: 12.5), ), style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF00A65A), foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), elevation: 0, ), ), ], ), ), child: LayoutBuilder( builder: (context, constraints) { final isCompact = constraints.maxHeight < 420; final textField = TextField( controller: _referralController, maxLines: isCompact ? 10 : null, minLines: isCompact ? 5 : null, expands: !isCompact, textAlignVertical: TextAlignVertical.top, style: const TextStyle(fontSize: 13.5, height: 1.5, color: AppColors.textPrimary), decoration: InputDecoration( hintText: 'Redacte el referimiento a departamento...', filled: true, fillColor: Colors.white, contentPadding: const EdgeInsets.all(16), border: OutlineInputBorder(borderRadius: BorderRadius.circular(10)), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: const BorderSide(color: Color(0xFFE2E8F0)), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: const BorderSide(color: AppColors.primary, width: 1.5), ), ), ); final bodyContent = Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // Membrete Informativo del Médico Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), decoration: BoxDecoration( color: const Color(0xFFF8FAFC), borderRadius: BorderRadius.circular(10), border: Border.all(color: const Color(0xFFE2E8F0)), ), child: Column( children: [ Text( _configStore.nombreDoctor.isNotEmpty ? _configStore.nombreDoctor : 'Dr. Luis A. Castro Sosa', textAlign: TextAlign.center, style: const TextStyle( fontSize: 17, fontWeight: FontWeight.w700, color: AppColors.textPrimary, letterSpacing: -0.3, ), ), if (_configStore.especialidad.isNotEmpty) ...[ const SizedBox(height: 2), Text( _configStore.especialidad.toUpperCase(), textAlign: TextAlign.center, style: const TextStyle( fontSize: 11, fontWeight: FontWeight.w600, color: AppColors.primary, letterSpacing: 0.5, ), ), ], if (_configStore.descripEspecialidad.isNotEmpty) ...[ const SizedBox(height: 1), Text( _configStore.descripEspecialidad.toUpperCase(), textAlign: TextAlign.center, style: const TextStyle( fontSize: 9.5, color: AppColors.textMuted, ), ), ], const SizedBox(height: 3), Text( 'Fecha: $formattedDate', style: const TextStyle( fontSize: 10.5, fontWeight: FontWeight.w500, color: AppColors.textSecondary, ), ), ], ), ), const SizedBox(height: 12), const Text( 'Detalle del Referimiento a Departamento:', style: TextStyle( fontSize: 13, fontWeight: FontWeight.w700, color: AppColors.textPrimary, ), ), const SizedBox(height: 8), // Área de texto multilínea que se expande para rellenar todo el espacio inferior if (isCompact) textField else Expanded(child: textField), ], ); if (isCompact) { return SingleChildScrollView( padding: const EdgeInsets.all(16), child: bodyContent, ); } return Padding( padding: const EdgeInsets.fromLTRB(20, 14, 20, 16), child: bodyContent, ); }, ), ); }, ); } }