import 'package:flutter/material.dart'; import 'package:manager_app/Components/string_input_container.dart'; import 'package:manager_app/Screens/Resources/select_resource_modal.dart'; import 'package:manager_app/constants.dart'; import 'package:manager_api_new/api.dart'; enum _VideoSourceMode { youtube, vimeo, resource } _VideoSourceMode _detectMode(String? url) { if (url == null || url.isEmpty) return _VideoSourceMode.youtube; if (url.contains('youtube.com') || url.contains('youtu.be')) return _VideoSourceMode.youtube; if (url.contains('vimeo.com')) return _VideoSourceMode.vimeo; return _VideoSourceMode.resource; } class VideoConfig extends StatefulWidget { final String? color; final String? label; final VideoDTO initialValue; final ValueChanged onChanged; const VideoConfig({ Key? key, this.color, this.label, required this.initialValue, required this.onChanged, }) : super(key: key); @override _VideoConfigState createState() => _VideoConfigState(); } class _VideoConfigState extends State { late VideoDTO resourceSource; late _VideoSourceMode _mode; String? _selectedResourceLabel; String? _youtubeUrl; String? _vimeoUrl; String? _resourceUrl; @override void initState() { resourceSource = widget.initialValue; _mode = _detectMode(resourceSource.source_); switch (_mode) { case _VideoSourceMode.youtube: _youtubeUrl = resourceSource.source_; break; case _VideoSourceMode.vimeo: _vimeoUrl = resourceSource.source_; break; case _VideoSourceMode.resource: _resourceUrl = resourceSource.source_; break; } super.initState(); } void _onModeChanged(_VideoSourceMode mode) { setState(() { _mode = mode; _selectedResourceLabel = null; switch (mode) { case _VideoSourceMode.youtube: resourceSource.source_ = _youtubeUrl; break; case _VideoSourceMode.vimeo: resourceSource.source_ = _vimeoUrl; break; case _VideoSourceMode.resource: resourceSource.source_ = _resourceUrl; break; } }); widget.onChanged(resourceSource); } @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SegmentedButton<_VideoSourceMode>( segments: const [ ButtonSegment(value: _VideoSourceMode.youtube, label: Text('YouTube'), icon: Icon(Icons.smart_display)), ButtonSegment(value: _VideoSourceMode.vimeo, label: Text('Vimeo'), icon: Icon(Icons.play_circle)), ButtonSegment(value: _VideoSourceMode.resource, label: Text('Ressource'), icon: Icon(Icons.video_file)), ], selected: {_mode}, onSelectionChanged: (selection) => _onModeChanged(selection.first), ), const SizedBox(height: 12), if (_mode == _VideoSourceMode.youtube) StringInputContainer( key: const ValueKey('youtube'), label: 'URL YouTube :', initialValue: _youtubeUrl, onChanged: (url) { _youtubeUrl = url; resourceSource.source_ = url; widget.onChanged(resourceSource); }, isUrl: true, maxLength: 200, ), if (_mode == _VideoSourceMode.vimeo) StringInputContainer( key: const ValueKey('vimeo'), label: 'URL Vimeo :', initialValue: _vimeoUrl, onChanged: (url) { _vimeoUrl = url; resourceSource.source_ = url; widget.onChanged(resourceSource); }, isUrl: true, maxLength: 200, ), if (_mode == _VideoSourceMode.resource) _ResourceVideoPicker( selectedLabel: _selectedResourceLabel, selectedUrl: _resourceUrl, onChanged: (resource) { setState(() { _resourceUrl = resource.url; resourceSource.source_ = resource.url; _selectedResourceLabel = resource.label; }); widget.onChanged(resourceSource); }, ), ], ); } } class _ResourceVideoPicker extends StatelessWidget { final String? selectedLabel; final String? selectedUrl; final ValueChanged onChanged; const _ResourceVideoPicker({ required this.selectedLabel, required this.selectedUrl, required this.onChanged, }); @override Widget build(BuildContext context) { return Row( children: [ const Text('Vidéo :', style: TextStyle(fontSize: 18)), const SizedBox(width: 10), ElevatedButton.icon( icon: const Icon(Icons.video_file), label: Text(selectedLabel ?? (selectedUrl != null ? 'Vidéo sélectionnée' : 'Choisir')), style: ElevatedButton.styleFrom(backgroundColor: kPrimaryColor, foregroundColor: Colors.white), onPressed: () async { final result = await showSelectResourceModal( 'Sélectionner une vidéo', 1, [ResourceType.Video, ResourceType.VideoUrl], context, true, true, true, ); if (result != null && result is ResourceDTO) { onChanged(result); } }, ), ], ); } }