import 'package:flutter/material.dart';

class VincularUsuariosWidget extends StatefulWidget {
  final List<Map<String, dynamic>> usuariosDisponiveis;
  final List<Map<String, dynamic>> funcoesDisponiveis;
  final Function(List<Map<String, int>>) onUsuariosVinculadosChanged;
  final List<Map<String, dynamic>>? jaVinculados;

  const VincularUsuariosWidget({
    Key? key,
    required this.usuariosDisponiveis,
    required this.funcoesDisponiveis,
    required this.onUsuariosVinculadosChanged,
    this.jaVinculados,
  }) : super(key: key);

  @override
  _VincularUsuariosWidgetState createState() => _VincularUsuariosWidgetState();
}

class _VincularUsuariosWidgetState extends State<VincularUsuariosWidget> {
  List<Map<String, int>> usuariosVinculados = [];
  int? usuarioIdSelecionado;

  @override
  void initState() {
    super.initState();
    if (widget.jaVinculados != null) {
      usuariosVinculados = widget.jaVinculados!.map((usuario) {
        return {
          'usuario_id': usuario['usuario_id'] as int,
          'funcao_id': usuario['funcao_id'] as int,
        };
      }).toList();
    }
  }

  void adicionarUsuario(int usuarioId) {
    final usuarioJaVinculado = usuariosVinculados.any(
      (usuario) => usuario['usuario_id'] == usuarioId,
    );

    if (!usuarioJaVinculado) {
      setState(() {
        usuariosVinculados.add({
          'usuario_id': usuarioId,
          'funcao_id': 5, // default funcao_id?
        });
        usuarioIdSelecionado = null; // reset selection
        widget.onUsuariosVinculadosChanged(usuariosVinculados);
      });
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(
          content: Text('Este usuário já foi vinculado.'),
          backgroundColor: Colors.redAccent,
        ),
      );
    }
  }

  void removerUsuario(int index) {
    setState(() {
      usuariosVinculados.removeAt(index);
      widget.onUsuariosVinculadosChanged(usuariosVinculados);
    });
  }

  @override
  Widget build(BuildContext context) {
    final usuariosDisponiveisAtualizados = widget.usuariosDisponiveis.where((usuarioDisponivel) {
      return !usuariosVinculados.any((usuarioVinculado) => usuarioVinculado['usuario_id'] == usuarioDisponivel['usuario_id']);
    }).toList();

    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        DropdownButtonFormField<int>(
          decoration: const InputDecoration(
            labelText: 'Selecionar Usuário',
            border: OutlineInputBorder(
              borderRadius: BorderRadius.all(Radius.circular(2)),
            ),
          ),
          value: usuarioIdSelecionado,
          items: usuariosDisponiveisAtualizados.map((usuario) {
            return DropdownMenuItem<int>(
              value: usuario['usuario_id'],
              child: Text(usuario['usuario_nome']),
            );
          }).toList(),
          onChanged: (value) {
            if (value != null) {
              adicionarUsuario(value);
            }
          },
        ),
        const SizedBox(height: 20),
        const Text('Usuários Vinculados:'),
        ListView.builder(
          shrinkWrap: true,
          itemCount: usuariosVinculados.length,
          itemBuilder: (context, index) {
            final usuarioVinculado = usuariosVinculados[index];
            final usuarioNome = widget.usuariosDisponiveis.firstWhere(
              (usuario) => usuario['usuario_id'] == usuarioVinculado['usuario_id'],
            )['usuario_nome'];
            final funcaoNome = widget.funcoesDisponiveis.firstWhere(
              (funcao) => funcao['funcao_id'] == usuarioVinculado['funcao_id'],
            )['funcao_nome'];
            return ListTile(
              title: Text('$usuarioNome - $funcaoNome'),
              trailing: IconButton(
                icon: const Icon(Icons.delete),
                onPressed: () {
                  removerUsuario(index);
                },
              ),
            );
          },
        ),
      ],
    );
  }
}, ajuste: Restarted application in 121ms.
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building Builder(dirty, dependencies: [_FocusInheritedScope]):
Assertion failed:
file:///home/iapar/snap/flutter/common/flutter/packages/flutter/lib/src/material/dropdown.dart:1040:15
dropdown.dart:1040
items == null || items.isEmpty || value == null ||
              items.where((DropdownMenuItem<T> item) {
                return item.value == value;
              }).length == 1
"There should be exactly one item with [DropdownButtonFormField]'s value: 3. \nEither zero or 2 or
more [DropdownMenuItem]s were detected with the same value"

The relevant error-causing widget was:
  DropdownButtonFormField<int>
  DropdownButtonFormField:file:///home/iapar/Documentos/fieldbook2/mock_field_book/lib/Screens/projeto/componentes_compartilhados/vincular_usuarios_widget.dart:78:9

When the exception was thrown, this was the stack:
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 296:3     throw_
errors.dart:296
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 29:3      assertFailed
errors.dart:29
packages/flutter/src/material/dropdown.dart 1043:28                             _formField
dropdown.dart:1043
packages/flutter/src/material/dropdown.dart 1733:25                             <fn>
dropdown.dart:1733
packages/flutter/src/widgets/basic.dart 7688:48                                 build
basic.dart:7688
packages/flutter/src/widgets/framework.dart 5687:22                             build
framework.dart:5687
packages/flutter/src/widgets/framework.dart 5617:15                             performRebuild