import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';

import '../../domain/repositories/grocery_repository.dart';
import '../screens/history/history_cubit.dart';
import '../screens/history/history_screen.dart';
import '../screens/item_detail/item_detail_cubit.dart';
import '../screens/item_detail/item_detail_screen.dart';
import '../screens/scanner/scanner_cubit.dart';
import '../screens/scanner/scanner_screen.dart';

part 'router.g.dart';

final goRouter = GoRouter(
  initialLocation: '/scanner',
  routes: $appRoutes,
);

@TypedStatefulShellRoute<HomeShellRouteData>(
  branches: [
    TypedStatefulShellBranch<ScannerBranchData>(
      routes: [
        TypedGoRoute<ScannerRouteData>(path: '/scanner'),
      ],
    ),
    TypedStatefulShellBranch<HistoryBranchData>(
      routes: [
        TypedGoRoute<HistoryRouteData>(path: '/history'),
      ],
    ),
  ],
)
class HomeShellRouteData extends StatefulShellRouteData {
  const HomeShellRouteData();

  @override
  Widget builder(
    BuildContext context,
    GoRouterState state,
    StatefulNavigationShell navigationShell,
  ) {
    return HomeShellScreen(navigationShell: navigationShell);
  }
}

class ScannerBranchData extends StatefulShellBranchData {
  const ScannerBranchData();
}

class HistoryBranchData extends StatefulShellBranchData {
  const HistoryBranchData();
}

class ScannerRouteData extends GoRouteData with $ScannerRouteData {
  const ScannerRouteData();

  @override
  Widget build(BuildContext context, GoRouterState state) {
    return BlocProvider(
      create: (context) => ScannerCubit(
        repository: context.read<GroceryRepository>(),
      ),
      child: const ScannerScreen(),
    );
  }
}

class HistoryRouteData extends GoRouteData with $HistoryRouteData {
  const HistoryRouteData();

  @override
  Widget build(BuildContext context, GoRouterState state) {
    return BlocProvider(
      create: (context) =>
          HistoryCubit(repository: context.read<GroceryRepository>())..load(),
      child: const HistoryScreen(),
    );
  }
}

@TypedGoRoute<ItemDetailRouteData>(path: '/item/:barcode')
class ItemDetailRouteData extends GoRouteData with $ItemDetailRouteData {
  final String barcode;

  const ItemDetailRouteData({required this.barcode});

  @override
  Widget build(BuildContext context, GoRouterState state) {
    return BlocProvider(
      create: (context) => ItemDetailCubit(
        repository: context.read<GroceryRepository>(),
      )..loadItem(barcode),
      child: ItemDetailScreen(barcode: barcode),
    );
  }
}

class HomeShellScreen extends StatelessWidget {
  final StatefulNavigationShell navigationShell;

  const HomeShellScreen({super.key, required this.navigationShell});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: navigationShell,
      bottomNavigationBar: NavigationBar(
        selectedIndex: navigationShell.currentIndex,
        onDestinationSelected: (index) {
          navigationShell.goBranch(
            index,
            initialLocation: index == navigationShell.currentIndex,
          );
        },
        destinations: const [
          NavigationDestination(
            icon: Icon(Icons.qr_code_scanner),
            label: 'Scan',
          ),
          NavigationDestination(
            icon: Icon(Icons.history),
            label: 'History',
          ),
        ],
      ),
    );
  }
}