import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../../core/api/api_error_mapper.dart'; import '../../../core/l10n/l10n.dart'; import '../../profile/data/profile_repository.dart'; import 'admin_products_panel.dart'; enum _DatabaseTab { inventory, pantry, products } class AdminDatabasePanel extends ConsumerStatefulWidget { final bool embedded; const AdminDatabasePanel({super.key, this.embedded = false}); @override ConsumerState createState() => _AdminDatabasePanelState(); } class _AdminDatabasePanelState extends ConsumerState { _DatabaseTab _activeTab = _DatabaseTab.inventory; bool _isRefreshingCategories = false; Future _refreshCategories() async { setState(() => _isRefreshingCategories = true); try { await ref.read(profileRepositoryProvider).refreshCategories(); if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Kategorier har uppdaterats.')), ); } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( buildCopyableErrorSnackBar(context, mapErrorToUserMessage(e, context)), ); } finally { if (mounted) setState(() => _isRefreshingCategories = false); } } Widget _sectionCard({ required IconData icon, required String title, required String description, required VoidCallback onPressed, required String buttonLabel, }) { return Card( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon(icon), const SizedBox(width: 8), Expanded( child: Text(title, style: Theme.of(context).textTheme.titleMedium), ), ], ), const SizedBox(height: 8), Text(description), const SizedBox(height: 16), FilledButton.icon( onPressed: onPressed, icon: Icon(icon), label: Text(buttonLabel), ), ], ), ), ); } @override Widget build(BuildContext context) { String tabLabel(_DatabaseTab tab) { switch (tab) { case _DatabaseTab.inventory: return context.l10n.profileInventoryTab; case _DatabaseTab.pantry: return context.l10n.profilePantryTab; case _DatabaseTab.products: return context.l10n.profileProductsTab; } } Widget activeSection; switch (_activeTab) { case _DatabaseTab.inventory: activeSection = _sectionCard( icon: Icons.inventory_2_outlined, title: context.l10n.profileInventoryTab, description: context.l10n.profileInventoryDescription, onPressed: () => context.go('/inventory'), buttonLabel: context.l10n.profileOpenInventory, ); case _DatabaseTab.pantry: activeSection = _sectionCard( icon: Icons.storefront_outlined, title: context.l10n.profilePantryTab, description: context.l10n.profilePantryDescription, onPressed: () => context.go('/baslager'), buttonLabel: context.l10n.profileOpenPantry, ); case _DatabaseTab.products: activeSection = const AdminProductsPanel(embedded: true); } return SingleChildScrollView( padding: widget.embedded ? EdgeInsets.zero : const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( context.l10n.profileDatabaseDescription, style: Theme.of(context).textTheme.bodyMedium, ), const SizedBox(height: 12), Card( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Adminverktyg', style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: 8), Text( 'Uppdatera kategorier manuellt i backend-cachen.', style: Theme.of(context).textTheme.bodyMedium, ), const SizedBox(height: 12), SizedBox( width: double.infinity, child: OutlinedButton.icon( onPressed: _isRefreshingCategories ? null : _refreshCategories, icon: _isRefreshingCategories ? const SizedBox( height: 16, width: 16, child: CircularProgressIndicator(strokeWidth: 2), ) : const Icon(Icons.refresh), label: const Text('Uppdatera kategorier'), ), ), ], ), ), ), const SizedBox(height: 12), SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( children: _DatabaseTab.values .map( (tab) => Padding( padding: const EdgeInsets.only(right: 8), child: ChoiceChip( label: Text(tabLabel(tab)), selected: _activeTab == tab, onSelected: (_) => setState(() => _activeTab = tab), ), ), ) .toList(), ), ), const SizedBox(height: 16), activeSection, ], ), ); } }