import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:uto_manager/application/blocs/personnel_cubit.dart'; import 'package:uto_manager/application/blocs/template_cubit.dart'; import 'package:uto_manager/application/blocs/unit_tree_cubit.dart'; import 'package:uto_manager/application/blocs/validation_cubit.dart'; import 'package:uto_manager/domain/services/assignment_service.dart'; import 'package:uto_manager/domain/services/unit_tree_service.dart'; import 'package:uto_manager/infrastructure/database/app_database.dart'; import 'package:uto_manager/infrastructure/repositories/drift_personnel_repository.dart'; import 'package:uto_manager/infrastructure/repositories/drift_position_slot_repository.dart'; import 'package:uto_manager/infrastructure/repositories/drift_soldier_positions_repository.dart'; import 'package:uto_manager/infrastructure/repositories/drift_unit_repository.dart'; import 'package:uto_manager/presentation/screens/home_screen.dart'; void main() { runApp(const UtoManagerApp()); } /// The root application widget for the UTO Manager. /// /// Wires together the database, repositories, domain services, and BLoC /// providers before handing off to the [HomeScreen]. class UtoManagerApp extends StatefulWidget { const UtoManagerApp({super.key}); @override State createState() => _UtoManagerAppState(); } class _UtoManagerAppState extends State { late final AppDatabase _db; late final DriftUnitRepository _unitRepo; late final DriftPersonnelRepository _personnelRepo; late final DriftPositionSlotRepository _slotRepo; late final DriftSoldierPositionsRepository _positionsRepo; late final UnitTreeService _treeService; late final AssignmentService _assignmentService; @override void initState() { super.initState(); _db = AppDatabase(); _unitRepo = DriftUnitRepository(dao: _db.unitDao, db: _db); _personnelRepo = DriftPersonnelRepository(dao: _db.personnelDao); _slotRepo = DriftPositionSlotRepository(dao: _db.positionSlotDao); _positionsRepo = DriftSoldierPositionsRepository(dao: _db.soldierPositionsDao); _treeService = const UnitTreeService(); _assignmentService = AssignmentService(treeService: _treeService); } @override void dispose() { _db.close(); super.dispose(); } @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider( create: (_) => UnitTreeCubit( unitRepository: _unitRepo, slotRepository: _slotRepo, treeService: _treeService, )..startWatching(), ), BlocProvider( create: (_) => PersonnelCubit( personnelRepository: _personnelRepo, slotRepository: _slotRepo, assignmentService: _assignmentService, )..startWatching(), ), BlocProvider( create: (_) => TemplateCubit( dao: _db.templateDao, unitRepository: _unitRepo, slotRepository: _slotRepo, )..loadTemplates(), ), BlocProvider( create: (_) => ValidationCubit(), ), ], child: MaterialApp( title: 'UTO Manager', debugShowCheckedModeBanner: false, theme: ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: const Color(0xFF1B3A6B), brightness: Brightness.dark, ), useMaterial3: true, ), home: HomeScreen(positionsRepository: _positionsRepo), ), ); } }