import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../domain/ai/frame_candidate.dart'; import '../../domain/models/habit.dart'; import '../../state/ai_providers.dart'; /// Shows L2/L3 suggestion cards from suggestFrame. Returns the selected /// FrameCandidate (with level + framedText) via Navigator.pop. class FrameSuggestionDialog extends ConsumerWidget { final SuggestFrameInput input; const FrameSuggestionDialog({super.key, required this.input}); static Future show( BuildContext context, { required SuggestFrameInput input, }) { return showDialog( context: context, builder: (_) => FrameSuggestionDialog(input: input), ); } @override Widget build(BuildContext context, WidgetRef ref) { final async = ref.watch(frameSuggestionsProvider(input)); return AlertDialog( title: const Text('AI 제안'), content: SizedBox( width: 320, child: async.when( loading: () => const SizedBox( height: 120, child: Center(child: CircularProgressIndicator()), ), error: (e, _) => Padding( padding: const EdgeInsets.all(8), child: Text('AI 제안을 받지 못했습니다. 직접 입력해주세요.\n($e)'), ), data: (candidates) { if (candidates.isEmpty) { return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const Padding( padding: EdgeInsets.all(8), child: Text( '더 구체적으로 입력해주시면 더 좋은 제안을 드릴 수 있어요.', ), ), TextButton( onPressed: () { ref.invalidate(frameSuggestionsProvider(input)); }, child: const Text('다시 시도'), ), ], ); } return Column( mainAxisSize: MainAxisSize.min, children: [ for (final c in candidates) _CandidateCard( candidate: c, onTap: () => Navigator.of(context).pop(c), ), ], ); }, ), ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('취소'), ), ], ); } } class _CandidateCard extends StatelessWidget { final FrameCandidate candidate; final VoidCallback onTap; const _CandidateCard({required this.candidate, required this.onTap}); @override Widget build(BuildContext context) { return Card( child: ListTile( title: Text(candidate.framedText), subtitle: Text( '${candidate.level == FrameLevel.l3 ? "L3 · 정체성" : "L2 · 조건부 긍정"} ' '· 신뢰도 ${(candidate.confidence * 100).toInt()}%', ), onTap: onTap, ), ); } }