Make the scouting web page actually submit data scouting data

This patch makes the web page send requests to
/requests/submit/data_scouting. Right now that request is not
implemented so we just get a 501, but that's okay. A future patch will
deal with that.

Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: Id58edb92e879ed4450fee76d5a1640196a125ef8
diff --git a/scouting/www/entry/entry.component.ts b/scouting/www/entry/entry.component.ts
index 0e7223b..ddc31df 100644
--- a/scouting/www/entry/entry.component.ts
+++ b/scouting/www/entry/entry.component.ts
@@ -1,5 +1,14 @@
 import { Component, OnInit } from '@angular/core';
 
+import * as flatbuffer_builder from 'org_frc971/external/com_github_google_flatbuffers/ts/builder';
+import {ByteBuffer} from 'org_frc971/external/com_github_google_flatbuffers/ts/byte-buffer';
+import * as error_response from 'org_frc971/scouting/webserver/requests/messages/error_response_generated';
+import * as submit_data_scouting_response from 'org_frc971/scouting/webserver/requests/messages/submit_data_scouting_response_generated';
+import * as submit_data_scouting from 'org_frc971/scouting/webserver/requests/messages/submit_data_scouting_generated';
+import SubmitDataScouting = submit_data_scouting.scouting.webserver.requests.SubmitDataScouting;
+import SubmitDataScoutingResponse = submit_data_scouting_response.scouting.webserver.requests.SubmitDataScoutingResponse;
+import ErrorResponse = error_response.scouting.webserver.requests.ErrorResponse;
+
 type Section = 'Team Selection'|'Auto'|'TeleOp'|'Climb'|'Defense'|'Review and Submit'|'Home'
 type Level = 'Low'|'Medium'|'High'|'Transversal'
 
@@ -23,6 +32,7 @@
     level: Level;
     proper: boolean = false;
     climbed: boolean = false;
+    errorMessage: string = '';
 
     toggleProper() {
         this.proper = !this.proper;
@@ -72,7 +82,7 @@
         } else if (this.section === 'Defense') {
             this.section = 'Review and Submit';
         } else if (this.section === 'Review and Submit') {
-            this.section = 'Home';
+            this.submitDataScouting();
         }
     }
 
@@ -113,4 +123,39 @@
     adjustTeleMissed(by: number) {
         this.teleShotsMissed = Math.max(0, this.teleShotsMissed + by);
     }
+
+    async submitDataScouting() {
+        const builder = new flatbuffer_builder.Builder() as unknown as flatbuffers.Builder;
+        SubmitDataScouting.startSubmitDataScouting(builder);
+        SubmitDataScouting.addTeam(builder, this.teamNumber);
+        SubmitDataScouting.addMatch(builder, this.matchNumber);
+        SubmitDataScouting.addMissedShotsAuto(builder, this.autoShotsMissed);
+        SubmitDataScouting.addUpperGoalAuto(builder, this.autoUpperShotsMade);
+        SubmitDataScouting.addLowerGoalAuto(builder, this.autoLowerShotsMade);
+        SubmitDataScouting.addMissedShotsTele(builder, this.teleShotsMissed);
+        SubmitDataScouting.addUpperGoalTele(builder, this.teleUpperShotsMade);
+        SubmitDataScouting.addLowerGoalTele(builder, this.teleLowerShotsMade);
+        SubmitDataScouting.addDefenseRating(builder, this.defensePlayedScore);
+        // TODO(phil): Add support for defensePlayedOnScore.
+        // TODO(phil): Fix the Climbing score.
+        SubmitDataScouting.addClimbing(builder, 1);
+        builder.finish(SubmitDataScouting.endSubmitDataScouting(builder));
+
+        const buffer = builder.asUint8Array();
+        const res = await fetch(
+            '/requests/submit/data_scouting', {method: 'POST', body: buffer});
+
+        if (res.ok) {
+            // We successfully submitted the data. Go back to Home.
+            this.section = 'Home';
+        } else {
+            const resBuffer = await res.arrayBuffer();
+            const fbBuffer = new ByteBuffer(new Uint8Array(resBuffer));
+            const parsedResponse = ErrorResponse.getRootAsErrorResponse(
+                fbBuffer as unknown as flatbuffers.ByteBuffer);
+
+            const errorMessage = parsedResponse.errorMessage();
+            this.errorMessage = `Received ${res.status} ${res.statusText}: "${errorMessage}"`;
+        }
+    }
 }