/*
         * Called on page initialisation, populates fields with the current data from the logged in user
         */
        private void FillFields()
        {
            User loggedInUser = UserController.Instance.LoggedInUser;

            // Name
            FirstNameInput.Text  = loggedInUser.name[0];
            MiddleNameInput.Text = "";
            LastNameInput.Text   = "";

            // If the user has at least a last name
            if (loggedInUser.name.Count > 1)
            {
                // Set the last name to the last element in the name array
                LastNameInput.Text = loggedInUser.name.Last();
                // Set the middle name to everything in between the first and last element
                MiddleNameInput.Text = String.Join(" ", loggedInUser.name.GetRange(1, loggedInUser.name.Count - 2).ToArray());
            }

            NHIInput.Text = loggedInUser.nhi;

            // Preferred Name
            PrefFirstNameInput.Text  = loggedInUser.preferredName[0];
            PrefMiddleNameInput.Text = "";
            PrefLastNameInput.Text   = "";

            // If the user has at least a last name
            if (loggedInUser.preferredName.Count > 1)
            {
                // Set the last name to the last element in the name array
                PrefLastNameInput.Text = loggedInUser.preferredName.Last();
                // Set the middle name to everything in between the first and last element
                PrefMiddleNameInput.Text = String.Join(" ", loggedInUser.preferredName.GetRange(1, loggedInUser.preferredName.Count - 2));
            }


            BirthGenderInput.SelectedItem    = FirstCharToUpper(loggedInUser.gender);
            GenderIdentityInput.SelectedItem = FirstCharToUpper(loggedInUser.genderIdentity);

            if (loggedInUser.currentAddress != null)
            {
                DisplayAddress(loggedInUser.currentAddress);
            }

            RegionInput.SelectedItem  = loggedInUser.region;
            CountryInput.SelectedItem = loggedInUser.country;

            dobInput.Date = loggedInUser.dateOfBirth.ToDateTime();

            // Check if the user is dead
            if (hasDiedSwitch.On)
            {
                dodInput.Date = loggedInUser.dateOfDeath.date.ToDateTime();
                Console.WriteLine(loggedInUser.dateOfDeath.ToDateTimeWithSeconds().TimeOfDay);
                todInput.Time = loggedInUser.dateOfDeath.ToDateTimeWithSeconds().TimeOfDay;

                DODCityInput.Text = loggedInUser.cityOfDeath;

                DODRegionInput.SelectedItem  = loggedInUser.regionOfDeath;
                DODCountryInput.SelectedItem = loggedInUser.countryOfDeath;


                dodInput.IsEnabled        = true;
                todInput.IsEnabled        = true;
                DODCountryInput.IsEnabled = true;
                DODRegionInput.IsEnabled  = true;

                DODCityInput.IsEnabled = true;
                DODCityInput.Text      = UserController.Instance.LoggedInUser.cityOfDeath;
            }
            else
            {
                dodInput.IsEnabled        = false;
                todInput.IsEnabled        = false;
                DODCountryInput.IsEnabled = false;
                DODRegionInput.IsEnabled  = false;

                DODCityInput.IsEnabled = false;
                DODCityInput.Text      = "";
            }

            HeightInput.Text = loggedInUser.height.ToString();
            WeightInput.Text = loggedInUser.weight.ToString();

            BloodPressureInput.Text              = loggedInUser.bloodPressure;
            BloodTypeInput.SelectedItem          = BloodTypeExtensions.ToString(BloodTypeExtensions.ToBloodTypeJSON(loggedInUser.bloodType));
            SmokerStatusInput.SelectedItem       = FirstCharToUpper(loggedInUser.smokerStatus);
            AlcoholConsumptionInput.SelectedItem = FirstCharToUpper(loggedInUser.alcoholConsumption);
        }
        /*
         * Called when the Save button is pressed, reads + validates input fields and pushes changes to the API
         */
        private async void SaveClicked(object sender, EventArgs e)
        {
            User loggedInUser = UserController.Instance.LoggedInUser;

            string givenFirstName  = InputValidation.Trim(FirstNameInput.Text);
            string givenMiddleName = InputValidation.Trim(MiddleNameInput.Text);
            string givenLastName   = InputValidation.Trim(LastNameInput.Text);

            string givenPrefFirstName  = InputValidation.Trim(PrefFirstNameInput.Text);
            string givenPrefMiddleName = InputValidation.Trim(PrefMiddleNameInput.Text);
            string givenPrefLastName   = InputValidation.Trim(PrefLastNameInput.Text);


            String        addressLine1 = AddressInput.Text;
            String        addressLine2 = AddressLine2Input.Text;
            List <String> addressLines = new List <String>();

            if (addressLine1 != "")
            {
                addressLines.Add(addressLine1);
            }

            if (addressLine2 != "")
            {
                addressLines.Add(addressLine2);
            }

            string givenAddress = InputValidation.Trim(String.Join(", ", addressLines));

            string givenRegion  = InputValidation.Trim(RegionInput.SelectedItem == null ? "" : RegionInput.SelectedItem.ToString());
            string givenCountry = InputValidation.Trim(CountryInput.SelectedItem == null ? "" : CountryInput.SelectedItem.ToString());

            string givenNHINumber = InputValidation.Trim(NHIInput.Text);

            string givenHeight        = InputValidation.Trim(HeightInput.Text);
            string givenWeight        = InputValidation.Trim(WeightInput.Text);
            string givenBloodPressure = InputValidation.Trim(BloodPressureInput.Text);

            // Birth names
            if (!InputValidation.IsValidTextInput(givenFirstName, false, false))
            {
                await DisplayAlert("", "Please enter a valid first name", "OK");

                return;
            }

            if (!InputValidation.IsValidTextInput(givenMiddleName, false, true))
            {
                await DisplayAlert("", "Please enter a valid middle name", "OK");

                return;
            }

            if (!InputValidation.IsValidTextInput(givenLastName, false, false))
            {
                await DisplayAlert("", "Please enter a valid last name", "OK");

                return;
            }

            // Preferred names
            if (!InputValidation.IsValidTextInput(givenPrefFirstName, false, true))
            {
                await DisplayAlert("", "Please enter a valid preferred first name", "OK");

                return;
            }

            if (!InputValidation.IsValidTextInput(givenPrefMiddleName, false, true))
            {
                await DisplayAlert("", "Please enter a valid preferred middle name", "OK");

                return;
            }

            if (!InputValidation.IsValidTextInput(givenPrefLastName, false, true))
            {
                await DisplayAlert("", "Please enter a valid preferred last name", "OK");

                return;
            }


            if (!InputValidation.IsValidNhiInput(givenNHINumber))
            {
                await DisplayAlert("", "Please enter a valid NHI number", "OK");

                return;
            }



            // Physical attributes
            if (!InputValidation.IsValidNumericInput(givenWeight, 0, 500, true))
            {
                await DisplayAlert("", "Please enter a valid weight in kg", "OK");

                return;
            }

            if (!InputValidation.IsValidNumericInput(givenHeight, 0, 300, true))
            {
                await DisplayAlert("", "Please enter a valid height in cm", "OK");

                return;
            }

            if (!InputValidation.IsValidBloodPressure(givenBloodPressure))
            {
                await DisplayAlert("", "Please enter a valid blood pressure eg. 120/80", "OK");

                return;
            }

            //if (loggedInUser.dateOfDeath.ToDateTime() < loggedInUser.dateOfBirth.ToDateTime())
            //{
            //    await DisplayAlert("",
            //    "Please enter a valid date of death",
            //    "OK");
            //    return;
            //}

            // Set user attributes to the new fields
            List <string> name = new List <string>();

            name.Add(givenFirstName);
            name.AddRange(givenMiddleName.Split(' '));
            name.Add(givenLastName);
            loggedInUser.name = name;

            List <string> prefName = new List <string>();

            prefName.Add(givenPrefFirstName);
            prefName.AddRange(givenPrefMiddleName.Split(' '));
            prefName.Add(givenPrefLastName);
            loggedInUser.preferredName = prefName;

            loggedInUser.gender         = BirthGenderInput.SelectedItem.ToString().ToUpper();
            loggedInUser.genderIdentity = GenderIdentityInput.SelectedItem.ToString().ToUpper();

            loggedInUser.currentAddress = givenAddress;
            loggedInUser.region         = givenRegion;
            loggedInUser.country        = givenCountry;

            loggedInUser.dateOfBirth = new CustomDate(dobInput.Date);

            if (hasDiedSwitch.On)
            {
                loggedInUser.dateOfDeath    = new CustomDateTime(dodInput.Date.Add(todInput.Time));
                loggedInUser.countryOfDeath = DODCountryInput.SelectedItem == null ? "" : DODCountryInput.SelectedItem.ToString();
                loggedInUser.regionOfDeath  = DODRegionInput.SelectedItem == null ? "" : DODRegionInput.SelectedItem.ToString();
                loggedInUser.cityOfDeath    = DODCityInput.Text;
            }
            else
            {
                loggedInUser.dateOfDeath    = null;
                loggedInUser.countryOfDeath = "";
                loggedInUser.regionOfDeath  = "";
                loggedInUser.cityOfDeath    = "";
            }

            // Don't worry about conversion exceptions -> this was checked with InputValidation
            loggedInUser.height             = Convert.ToDouble(givenHeight);
            loggedInUser.weight             = Convert.ToDouble(givenWeight);
            loggedInUser.bloodPressure      = givenBloodPressure;
            loggedInUser.bloodType          = BloodTypeExtensions.ToBloodType(BloodTypeInput.SelectedItem.ToString().ToUpper()).ToString();
            loggedInUser.smokerStatus       = SmokerStatusInput.SelectedItem.ToString().ToUpper();
            loggedInUser.alcoholConsumption = AlcoholConsumptionInput.SelectedItem.ToString().ToUpper();

            UserAPI        userAPI     = new UserAPI();
            HttpStatusCode userUpdated = await userAPI.UpdateUser(isClinicianEditing);

            switch (userUpdated)
            {
            case HttpStatusCode.Created:
                await DisplayAlert("",
                                   "User details successfully updated",
                                   "OK");

                break;

            case HttpStatusCode.BadRequest:
                await DisplayAlert("",
                                   "User details update failed (400)",
                                   "OK");

                break;

            case HttpStatusCode.ServiceUnavailable:
                await DisplayAlert("",
                                   "Server unavailable, check connection",
                                   "OK");

                break;

            case HttpStatusCode.Unauthorized:
                await DisplayAlert("",
                                   "Unauthorised to modify profile",
                                   "OK");

                break;

            case HttpStatusCode.InternalServerError:
                await DisplayAlert("",
                                   "Server error, please try again (500)",
                                   "OK");

                break;
            }
        }