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 '../../../core/ui/async_state_views.dart';
import '../data/inventory_providers.dart';
import 'swipeable_inventory_tile.dart';

class InventoryScreen extends ConsumerWidget {
  const InventoryScreen({super.key});

  static const _locationOptions = <String>['', 'Kyl', 'Frys', 'Skafferi'];
  List<({String value, String label})> _sortOptions(BuildContext context) => [
    (value: '', label: context.l10n.inventorySortLatest),
    (value: 'nameAsc', label: context.l10n.inventorySortNameAsc),
    (value: 'bestBeforeAsc', label: context.l10n.inventorySortBestBeforeAsc),
    (value: 'bestBeforeDesc', label: context.l10n.inventorySortBestBeforeDesc),
  ];

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final location = ref.watch(inventoryLocationFilterProvider);
    final sort = ref.watch(inventorySortFilterProvider);
    final inventoryAsync = ref.watch(inventoryProvider);

    return inventoryAsync.when(
      loading: () => LoadingStateView(label: context.l10n.inventoryLoading),
      error: (e, _) => ErrorStateView(
        message: mapErrorToUserMessage(e, context),
        onRetry: () => ref.invalidate(inventoryProvider),
      ),
      data: (items) {
        final filterSection = Padding(
          padding: const EdgeInsets.fromLTRB(12, 12, 12, 4),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                context.l10n.inventoryFilterAndSort,
                style: const TextStyle(fontWeight: FontWeight.w600),
              ),
              const SizedBox(height: 8),
              Wrap(
                spacing: 8,
                runSpacing: 8,
                children: _locationOptions
                    .map(
                      (option) => ChoiceChip(
                        label: Text(option.isEmpty ? context.l10n.inventoryAllFilter : option),
                        selected: location == option,
                        onSelected: (_) => ref
                            .read(inventoryLocationFilterProvider.notifier)
                            .setValue(option),
                      ),
                    )
                    .toList(),
              ),
              const SizedBox(height: 8),
              DropdownButtonFormField<String>(
                initialValue: sort,
                isExpanded: true,
                decoration: InputDecoration(
                  labelText: context.l10n.inventorySortLabel,
                  border: const OutlineInputBorder(),
                ),
                items: _sortOptions(context)
                    .map(
                      (option) => DropdownMenuItem<String>(
                        value: option.value,
                        child: Text(option.label),
                      ),
                    )
                    .toList(),
                onChanged: (value) {
                  ref
                      .read(inventorySortFilterProvider.notifier)
                      .setValue(value ?? '');
                },
              ),
            ],
          ),
        );

        if (items.isEmpty) {
          return Stack(
            children: [
              ListView(
                padding: const EdgeInsets.only(bottom: 88),
                children: [
                  filterSection,
                  EmptyStateView(title: context.l10n.inventoryEmpty),
                ],
              ),
              Positioned(
                right: 16,
                bottom: 16,
                child: FloatingActionButton.extended(
                  onPressed: () => context.push('/inventory/create'),
                  icon: const Icon(Icons.add),
                  label: Text(context.l10n.addAction),
                ),
              ),
            ],
          );
        }
        return Stack(
          children: [
            ListView.separated(
              padding: const EdgeInsets.only(bottom: 88),
              itemCount: items.length + 1,
              separatorBuilder: (_, __) => const Divider(height: 1),
              itemBuilder: (context, index) {
                if (index == 0) return filterSection;
                final item = items[index - 1];
                return SwipeableInventoryTile(item: item);
              },
            ),
            Positioned(
              right: 16,
              bottom: 16,
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  FloatingActionButton.extended(
                    onPressed: () => context.push('/inventory/create'),
                    icon: const Icon(Icons.add),
                    label: Text(context.l10n.addAction),
                  ),
                  const SizedBox(height: 8),
                  FloatingActionButton.extended(
                    onPressed: () => context.go('/recipes'),
                    icon: const Icon(Icons.restaurant_menu),
                    label: Text(context.l10n.inventoryRecipesAction),
                  ),
                ],
              ),
            ),
          ],
        );
      },
    );
  }
}


