import 'package:uto_manager/domain/entities/position_slot.dart'; import 'package:uto_manager/domain/entities/unit_node.dart'; import 'package:uto_manager/domain/services/template_instantiator.dart'; /// Library of 2026 U.S. Army doctrinal force structure templates. /// /// Each template is a [UnitDefinition] tree that can be instantiated via /// [TemplateInstantiator] into concrete [UnitNode] and [PositionSlot] objects. /// /// Templates are defined in pure Dart (no JSON files required at runtime), /// making them available without asset loading and trivially testable. /// /// Available templates: /// - [mbct] — Mobile Brigade Combat Team /// - [sbct] — Stryker Brigade Combat Team /// - [abct] — Armored Brigade Combat Team /// - [cabHeavy] — Combat Aviation Brigade (Heavy) /// - [cabLight] — Combat Aviation Brigade (Light) abstract final class DoctrinalTemplates { // --------------------------------------------------------------------------- // Shared slot definitions // --------------------------------------------------------------------------- static const _rtoSlot = SlotDefinition( positionTitle: 'Radio Telephone Operator', dutyMos: '25H', authorizedRank: 'e3', ); static const _medicSlot = SlotDefinition( positionTitle: 'Combat Medic', dutyMos: '68W', authorizedRank: 'e4', ); static const _fsoSlot = SlotDefinition( positionTitle: 'Fire Support Specialist', dutyMos: '13F', authorizedRank: 'e6', ); // --------------------------------------------------------------------------- // Shared sub-unit builders // --------------------------------------------------------------------------- /// Standard 2026 SaaS Rifle Squad (9 soldiers). static UnitDefinition _rifleSquad(String name) => UnitDefinition( name: name, echelon: 'squad', branch: 'infantry', slots: const [ SlotDefinition( positionTitle: 'Squad Leader', dutyMos: '11B', authorizedRank: 'e6', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Team Leader Alpha', dutyMos: '11B', authorizedRank: 'e5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Team Leader Bravo', dutyMos: '11B', authorizedRank: 'e5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Automatic Rifleman (XM250)', dutyMos: '11B', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'Automatic Rifleman (XM250)', dutyMos: '11B', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'Grenadier (XM7+M320)', dutyMos: '11B', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'Grenadier (XM7+M320)', dutyMos: '11B', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'sUAS Operator / Rifleman', dutyMos: '15W', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'Rifleman', dutyMos: '11B', authorizedRank: 'e3', ), ], ); /// Standard Rifle Platoon HQ slots. static const List _riflePlatoonHqSlots = [ SlotDefinition( positionTitle: 'Platoon Leader', dutyMos: '11A', authorizedRank: 'o2', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Platoon Sergeant', dutyMos: '11B', authorizedRank: 'e7', isKeyLeader: true, ), _rtoSlot, _medicSlot, _fsoSlot, ]; /// Standard Rifle Platoon (HQ + 3 squads). static UnitDefinition _riflePlatoon(String name) => UnitDefinition( name: name, echelon: 'platoon', branch: 'infantry', slots: _riflePlatoonHqSlots, children: [ _rifleSquad('1st Squad'), _rifleSquad('2nd Squad'), _rifleSquad('3rd Squad'), ], ); /// Standard Rifle Company (CO HQ + 3 platoons + Weapons Platoon). static UnitDefinition _rifleCompany(String name) => UnitDefinition( name: name, echelon: 'company', branch: 'infantry', slots: const [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Executive Officer', dutyMos: '11A', authorizedRank: 'o2', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Company RTO', dutyMos: '25H', authorizedRank: 'e3', ), SlotDefinition( positionTitle: 'Company Medic', dutyMos: '68W', authorizedRank: 'e5', ), ], children: [ _riflePlatoon('1st Platoon'), _riflePlatoon('2nd Platoon'), _riflePlatoon('3rd Platoon'), const UnitDefinition( name: 'Weapons Platoon', echelon: 'platoon', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Weapons Platoon Leader', dutyMos: '11A', authorizedRank: 'o2', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Weapons Platoon Sergeant', dutyMos: '11B', authorizedRank: 'e7', isKeyLeader: true, ), ], ), ], ); /// Standard Infantry Battalion (HHC + 3 Rifle Companies). static UnitDefinition _infantryBattalion(String name) => UnitDefinition( name: name, echelon: 'battalion', branch: 'infantry', slots: const [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '11A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Executive Officer', dutyMos: '11A', authorizedRank: 'o4', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '11B', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'S3 Operations Officer', dutyMos: '11A', authorizedRank: 'o4', ), SlotDefinition( positionTitle: 'Battalion Surgeon', dutyMos: '68A', authorizedRank: 'o3', ), SlotDefinition( positionTitle: 'Signal Officer', dutyMos: '25A', authorizedRank: 'o2', ), ], children: [ _rifleCompany('Alpha Company'), _rifleCompany('Bravo Company'), _rifleCompany('Charlie Company'), ], ); // --------------------------------------------------------------------------- // MBCT — Mobile Brigade Combat Team // --------------------------------------------------------------------------- /// Mobile Brigade Combat Team (2026 doctrine). /// /// Structure: /// - Brigade HQ /// - 3× Mobile Infantry Battalions /// - Cavalry Squadron /// - Field Artillery Battalion /// - Multi-Domain Effects Platoon (MDEP) /// - Hunter-Killer Platoon (HKP) /// - Brigade Engineer Battalion /// - Brigade Support Battalion static final UnitDefinition mbct = UnitDefinition( name: 'Mobile Brigade Combat Team', echelon: 'brigade', branch: 'infantry', slots: const [ SlotDefinition( positionTitle: 'Brigade Commander', dutyMos: '11A', authorizedRank: 'o6', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Deputy Commander', dutyMos: '11A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '11B', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'S3 Operations Officer', dutyMos: '11A', authorizedRank: 'o4', ), SlotDefinition( positionTitle: 'Brigade Signal Officer', dutyMos: '25A', authorizedRank: 'o3', ), SlotDefinition( positionTitle: 'Brigade Surgeon', dutyMos: '68A', authorizedRank: 'o4', ), ], children: [ _infantryBattalion('1-1 Mobile Infantry Battalion'), _infantryBattalion('2-1 Mobile Infantry Battalion'), _infantryBattalion('3-1 Mobile Infantry Battalion'), // Cavalry Squadron const UnitDefinition( name: 'Cavalry Squadron', echelon: 'battalion', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Squadron Commander', dutyMos: '11A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Squadron Sergeant Major', dutyMos: '11B', authorizedRank: 'e9', isKeyLeader: true, ), ], children: [ UnitDefinition( name: 'HHT', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'HHT Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'HHT First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Alpha Troop', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Bravo Troop', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Anti-Tank Troop', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Field Artillery Battalion const UnitDefinition( name: 'Field Artillery Battalion', echelon: 'battalion', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '13A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '13B', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Fire Direction Officer', dutyMos: '13A', authorizedRank: 'o3', ), ], children: [ UnitDefinition( name: 'Alpha Battery (105mm)', echelon: 'company', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battery Commander', dutyMos: '13A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battery First Sergeant', dutyMos: '13B', authorizedRank: 'e8', isKeyLeader: true, ), SlotDefinition( positionTitle: 'FAATDS Operator', dutyMos: '13D', authorizedRank: 'e4', ), ], ), UnitDefinition( name: 'Bravo Battery (105mm)', echelon: 'company', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battery Commander', dutyMos: '13A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battery First Sergeant', dutyMos: '13B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Charlie Battery (155mm Towed)', echelon: 'company', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battery Commander', dutyMos: '13A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battery First Sergeant', dutyMos: '13B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Multi-Domain Effects Platoon const UnitDefinition( name: 'Multi-Domain Effects Platoon (MDEP)', echelon: 'platoon', branch: 'cyberEw', slots: [ SlotDefinition( positionTitle: 'MDEP Officer', dutyMos: '17A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'EW Specialist', dutyMos: '17E', authorizedRank: 'e6', ), SlotDefinition( positionTitle: 'EW Specialist', dutyMos: '17E', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'C-sUAS Operator', dutyMos: '17E', authorizedRank: 'e4', ), ], ), // Hunter-Killer Platoon const UnitDefinition( name: 'Hunter-Killer Platoon (HKP)', echelon: 'platoon', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'HKP Leader', dutyMos: '11A', authorizedRank: 'o2', isKeyLeader: true, ), SlotDefinition( positionTitle: 'sUAS Operator', dutyMos: '15W', authorizedRank: 'e5', ), SlotDefinition( positionTitle: 'sUAS Operator', dutyMos: '15W', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'Targeting NCO', dutyMos: '13F', authorizedRank: 'e6', ), ], ), // Brigade Engineer Battalion const UnitDefinition( name: 'Brigade Engineer Battalion', echelon: 'battalion', branch: 'engineer', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '12A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '12B', authorizedRank: 'e9', isKeyLeader: true, ), ], children: [ UnitDefinition( name: 'Alpha Engineer Company', echelon: 'company', branch: 'engineer', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '12A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '12B', authorizedRank: 'e8', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Combat Engineer', dutyMos: '12B', authorizedRank: 'e4', ), ], ), ], ), // Brigade Support Battalion const UnitDefinition( name: 'Brigade Support Battalion', echelon: 'battalion', branch: 'logistics', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '92A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '92Y', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Unit Supply Specialist', dutyMos: '92Y', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'Automated Logistical Specialist', dutyMos: '92A', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'Vehicle Mechanic', dutyMos: '91B', authorizedRank: 'e4', ), ], ), ], ); // --------------------------------------------------------------------------- // SBCT — Stryker Brigade Combat Team // --------------------------------------------------------------------------- /// Stryker Brigade Combat Team (2026 doctrine). static final UnitDefinition sbct = UnitDefinition( name: 'Stryker Brigade Combat Team', echelon: 'brigade', branch: 'infantry', slots: const [ SlotDefinition( positionTitle: 'Brigade Commander', dutyMos: '11A', authorizedRank: 'o6', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Deputy Commander', dutyMos: '11A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '11B', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'S3 Operations Officer', dutyMos: '11A', authorizedRank: 'o4', ), SlotDefinition( positionTitle: 'Brigade Signal Officer', dutyMos: '25A', authorizedRank: 'o3', ), ], children: [ _infantryBattalion('1-2 Stryker Infantry Battalion'), _infantryBattalion('2-2 Stryker Infantry Battalion'), _infantryBattalion('3-2 Stryker Infantry Battalion'), // Cavalry Reconnaissance Squadron const UnitDefinition( name: 'Cavalry Reconnaissance Squadron', echelon: 'battalion', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Squadron Commander', dutyMos: '11A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Squadron Sergeant Major', dutyMos: '11B', authorizedRank: 'e9', isKeyLeader: true, ), ], children: [ UnitDefinition( name: 'HHT', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'HHT Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'HHT First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Alpha Cav Troop (Stryker)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Bravo Cav Troop (Stryker)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Charlie Cav Troop (Stryker)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Anti-Tank Troop (9× Stryker ATGM)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Field Artillery Battalion (M777A2) const UnitDefinition( name: 'Field Artillery Battalion (M777A2)', echelon: 'battalion', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '13A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '13B', authorizedRank: 'e9', isKeyLeader: true, ), ], children: [ UnitDefinition( name: 'Alpha Battery (M777A2)', echelon: 'company', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battery Commander', dutyMos: '13A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battery First Sergeant', dutyMos: '13B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Bravo Battery (M777A2)', echelon: 'company', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battery Commander', dutyMos: '13A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battery First Sergeant', dutyMos: '13B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Charlie Battery (M777A2)', echelon: 'company', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battery Commander', dutyMos: '13A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battery First Sergeant', dutyMos: '13B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Brigade Engineer Battalion const UnitDefinition( name: 'Brigade Engineer Battalion', echelon: 'battalion', branch: 'engineer', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '12A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '12B', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Signal NCO', dutyMos: '25H', authorizedRank: 'e5', ), ], children: [ UnitDefinition( name: 'Alpha Engineer Company', echelon: 'company', branch: 'engineer', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '12A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '12B', authorizedRank: 'e8', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Combat Engineer', dutyMos: '12B', authorizedRank: 'e4', ), ], ), ], ), // Brigade Support Battalion const UnitDefinition( name: 'Brigade Support Battalion', echelon: 'battalion', branch: 'logistics', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '92A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '92Y', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Medical Officer', dutyMos: '68A', authorizedRank: 'o3', ), SlotDefinition( positionTitle: 'Unit Supply Specialist', dutyMos: '92Y', authorizedRank: 'e4', ), ], ), ], ); // --------------------------------------------------------------------------- // ABCT — Armored Brigade Combat Team // --------------------------------------------------------------------------- /// Armored Brigade Combat Team (2026 doctrine). static final UnitDefinition abct = UnitDefinition( name: 'Armored Brigade Combat Team', echelon: 'brigade', branch: 'infantry', slots: const [ SlotDefinition( positionTitle: 'Brigade Commander', dutyMos: '11A', authorizedRank: 'o6', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Deputy Commander', dutyMos: '11A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '11B', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'S3 Operations Officer', dutyMos: '11A', authorizedRank: 'o4', ), ], children: [ // Armor-Heavy CAB 1 const UnitDefinition( name: '1st Combined Arms Battalion (Armor-Heavy)', echelon: 'battalion', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '11A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '11B', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battalion Medic', dutyMos: '68W', authorizedRank: 'e6', ), SlotDefinition( positionTitle: 'Vehicle Mechanic', dutyMos: '91A', authorizedRank: 'e5', ), ], children: [ UnitDefinition( name: 'Alpha Tank Company (14× M1A2 SEPv3)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Bravo Tank Company (14× M1A2 SEPv3)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Charlie Mech Infantry Company (14× M2A3 Bradley)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Armor-Heavy CAB 2 const UnitDefinition( name: '2nd Combined Arms Battalion (Armor-Heavy)', echelon: 'battalion', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '11A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '11B', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battalion Medic', dutyMos: '68W', authorizedRank: 'e6', ), ], children: [ UnitDefinition( name: 'Alpha Tank Company (14× M1A2 SEPv3)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Bravo Tank Company (14× M1A2 SEPv3)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Charlie Mech Infantry Company (14× M2A3 Bradley)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Infantry-Heavy CAB _infantryBattalion('3rd Combined Arms Battalion (Infantry-Heavy)'), // Armored Cavalry Squadron const UnitDefinition( name: 'Armored Cavalry Squadron', echelon: 'battalion', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Squadron Commander', dutyMos: '11A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Squadron Sergeant Major', dutyMos: '11B', authorizedRank: 'e9', isKeyLeader: true, ), ], children: [ UnitDefinition( name: 'HHT', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'HHT Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'HHT First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Alpha Armored Cav Troop', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Bravo Armored Cav Troop', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Charlie Armored Cav Troop', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Tank Troop (14× M1A2)', echelon: 'company', branch: 'infantry', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '11A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '11B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Field Artillery Battalion (M109A7 Paladin) const UnitDefinition( name: 'Field Artillery Battalion (M109A7 Paladin)', echelon: 'battalion', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '13A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '13B', authorizedRank: 'e9', isKeyLeader: true, ), ], children: [ UnitDefinition( name: 'Alpha Battery (M109A7)', echelon: 'company', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battery Commander', dutyMos: '13A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battery First Sergeant', dutyMos: '13B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Bravo Battery (M109A7)', echelon: 'company', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battery Commander', dutyMos: '13A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battery First Sergeant', dutyMos: '13B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Charlie Battery (M109A7)', echelon: 'company', branch: 'fires', slots: [ SlotDefinition( positionTitle: 'Battery Commander', dutyMos: '13A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Battery First Sergeant', dutyMos: '13B', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Brigade Engineer Battalion const UnitDefinition( name: 'Brigade Engineer Battalion', echelon: 'battalion', branch: 'engineer', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '12A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '12B', authorizedRank: 'e9', isKeyLeader: true, ), ], children: [ UnitDefinition( name: 'Sapper Company', echelon: 'company', branch: 'engineer', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '12A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '12B', authorizedRank: 'e8', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Combat Engineer (Sapper)', dutyMos: '12B', authorizedRank: 'e5', ), ], ), ], ), ], ); // --------------------------------------------------------------------------- // CAB Heavy — Combat Aviation Brigade (Heavy) // --------------------------------------------------------------------------- /// Combat Aviation Brigade — Heavy (2026 doctrine). static const UnitDefinition cabHeavy = UnitDefinition( name: 'Combat Aviation Brigade (Heavy)', echelon: 'brigade', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Brigade Commander', dutyMos: '153A', authorizedRank: 'o6', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Deputy Commander', dutyMos: '153A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '15Z', authorizedRank: 'e9', isKeyLeader: true, ), ], children: [ // Attack Aviation Battalion UnitDefinition( name: 'Attack Aviation Battalion (24× AH-64E Apache)', echelon: 'battalion', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '153A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '15Z', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Attack Pilot', dutyMos: '153A', authorizedRank: 'o3', ), SlotDefinition( positionTitle: 'Crew Chief (AH-64E)', dutyMos: '15T', authorizedRank: 'e5', ), ], children: [ UnitDefinition( name: 'Alpha Attack Company', echelon: 'company', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '153A', authorizedRank: 'o4', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '15Z', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Bravo Attack Company', echelon: 'company', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '153A', authorizedRank: 'o4', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '15Z', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Assault Helicopter Battalion UnitDefinition( name: 'Assault Helicopter Battalion (UH-60M / CH-47F)', echelon: 'battalion', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '153A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '15Z', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'UH-60M Pilot', dutyMos: '153A', authorizedRank: 'o3', ), SlotDefinition( positionTitle: 'CH-47F Pilot', dutyMos: '153A', authorizedRank: 'o3', ), SlotDefinition( positionTitle: 'Crew Chief (UH-60M)', dutyMos: '15T', authorizedRank: 'e5', ), ], children: [ UnitDefinition( name: 'Alpha Assault Company (UH-60M)', echelon: 'company', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '153A', authorizedRank: 'o4', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '15Z', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Bravo Heavy Lift Company (CH-47F)', echelon: 'company', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '153A', authorizedRank: 'o4', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '15Z', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Air Ambulance Company UnitDefinition( name: 'Air Ambulance Company (15× HH-60M)', echelon: 'company', branch: 'medical', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '153A', authorizedRank: 'o4', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '68W', authorizedRank: 'e8', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Flight Medic', dutyMos: '68W', authorizedRank: 'e5', ), SlotDefinition( positionTitle: 'Flight Medic', dutyMos: '68W', authorizedRank: 'e4', ), SlotDefinition( positionTitle: 'MEDEVAC Pilot', dutyMos: '153A', authorizedRank: 'o3', ), ], ), // Aviation Support Battalion UnitDefinition( name: 'Aviation Support Battalion', echelon: 'battalion', branch: 'logistics', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '92A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '92Y', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Aviation Mechanic (Intermediate)', dutyMos: '15B', authorizedRank: 'e5', ), SlotDefinition( positionTitle: 'Aircraft Powerplant Repairer', dutyMos: '15D', authorizedRank: 'e5', ), SlotDefinition( positionTitle: 'Unit Supply Specialist', dutyMos: '92Y', authorizedRank: 'e4', ), ], ), ], ); // --------------------------------------------------------------------------- // CAB Light — Combat Aviation Brigade (Light) // --------------------------------------------------------------------------- /// Combat Aviation Brigade — Light (2026 doctrine). static const UnitDefinition cabLight = UnitDefinition( name: 'Combat Aviation Brigade (Light)', echelon: 'brigade', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Brigade Commander', dutyMos: '153A', authorizedRank: 'o6', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Deputy Commander', dutyMos: '153A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '15Z', authorizedRank: 'e9', isKeyLeader: true, ), ], children: [ // Attack Reconnaissance Battalion UnitDefinition( name: 'Attack Reconnaissance Battalion (AH-64E + MQ-9A)', echelon: 'battalion', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '153A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '15Z', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Attack Pilot (AH-64E)', dutyMos: '153A', authorizedRank: 'o3', ), SlotDefinition( positionTitle: 'sUAS Operator', dutyMos: '15W', authorizedRank: 'e5', ), ], children: [ UnitDefinition( name: 'Alpha Attack Company', echelon: 'company', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '153A', authorizedRank: 'o4', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '15Z', authorizedRank: 'e8', isKeyLeader: true, ), ], ), UnitDefinition( name: 'Troop F (MQ-9A / sUAS)', echelon: 'company', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Troop Commander', dutyMos: '153A', authorizedRank: 'o3', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Troop First Sergeant', dutyMos: '15Z', authorizedRank: 'e8', isKeyLeader: true, ), SlotDefinition( positionTitle: 'sUAS Operator', dutyMos: '15W', authorizedRank: 'e4', ), ], ), ], ), // Assault Helicopter Battalion UnitDefinition( name: 'Assault Helicopter Battalion (UH-60M / CH-47F)', echelon: 'battalion', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '153A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '15Z', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'UH-60M Pilot', dutyMos: '153A', authorizedRank: 'o3', ), SlotDefinition( positionTitle: 'Crew Chief', dutyMos: '15T', authorizedRank: 'e5', ), ], children: [ UnitDefinition( name: 'Alpha Assault Company', echelon: 'company', branch: 'aviation', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '153A', authorizedRank: 'o4', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '15Z', authorizedRank: 'e8', isKeyLeader: true, ), ], ), ], ), // Medical Assault Battalion UnitDefinition( name: 'Assault Helicopter Battalion (Medical)', echelon: 'battalion', branch: 'medical', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '153A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '68W', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Flight Medic', dutyMos: '68W', authorizedRank: 'e5', ), SlotDefinition( positionTitle: 'MEDEVAC Pilot', dutyMos: '153A', authorizedRank: 'o3', ), ], children: [ UnitDefinition( name: 'Alpha MEDEVAC Company', echelon: 'company', branch: 'medical', slots: [ SlotDefinition( positionTitle: 'Company Commander', dutyMos: '153A', authorizedRank: 'o4', isKeyLeader: true, ), SlotDefinition( positionTitle: 'First Sergeant', dutyMos: '68W', authorizedRank: 'e8', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Flight Medic', dutyMos: '68W', authorizedRank: 'e4', ), ], ), ], ), // Aviation Support Battalion UnitDefinition( name: 'Aviation Support Battalion', echelon: 'battalion', branch: 'logistics', slots: [ SlotDefinition( positionTitle: 'Battalion Commander', dutyMos: '92A', authorizedRank: 'o5', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Command Sergeant Major', dutyMos: '92Y', authorizedRank: 'e9', isKeyLeader: true, ), SlotDefinition( positionTitle: 'Aviation Mechanic', dutyMos: '15B', authorizedRank: 'e5', ), SlotDefinition( positionTitle: 'Unit Supply Specialist', dutyMos: '92Y', authorizedRank: 'e4', ), ], ), ], ); /// Returns all available template definitions keyed by a short identifier. static Map get all => { 'mbct': mbct, 'sbct': sbct, 'abct': abct, 'cab_heavy': cabHeavy, 'cab_light': cabLight, }; /// Returns the display name for a template key. static String displayName(String key) { switch (key) { case 'mbct': return 'Mobile BCT (MBCT)'; case 'sbct': return 'Stryker BCT (SBCT)'; case 'abct': return 'Armored BCT (ABCT)'; case 'cab_heavy': return 'Combat Aviation Brigade — Heavy'; case 'cab_light': return 'Combat Aviation Brigade — Light'; default: return key; } } }