public CrimeLocationsRequestModel CrimeLocationsRequest(int crimeLocationTypeId, double latitude, double longitude, int radius)
        {
            //Init main model
            CrimeLocationsRequestModel crimeLocationsRequestModel = new CrimeLocationsRequestModel(false);

            //----------------------------------------------------------------------------------------------------//

            //get crime location relationship from DB
            CrimeLocationTypeModel clModel = null;

            CrimeLocationType dbModel = unitOfWork.CrimeLocationTypeRepository.GetByID(crimeLocationTypeId);
            clModel = new CrimeLocationTypeModel(dbModel);

            //check if model found
            if(clModel == null || clModel.Id == 0)
            {
                crimeLocationsRequestModel.Status.setNoClRelationshipFound();
                return crimeLocationsRequestModel;
            }

            //--------------------------------------------------------------------------------------------------//

            //Create GooglePLacesAPI controller
            GooglePlacesApiController googlePlacesController = new GooglePlacesApiController();

            //Get nearby locations
            GooglePlacesModel googlePlacesModel = googlePlacesController.NearbySearch(clModel.LocationType, latitude, longitude, radius);

            //check for errors
            crimeLocationsRequestModel.Status.setGooglePlacesError(googlePlacesModel);

            if (!crimeLocationsRequestModel.Status.SafeToContinue)
            {
                return crimeLocationsRequestModel;
            }

            //--------------------------------------------------------------------------------------------------//

            //Create DataPoliceAPI controller
            DataPoliceUKApiController dataPoliceUkController = new DataPoliceUKApiController();

            for(int i = 0; i <googlePlacesModel.Results.Count(); i++)
            {
                //Get crime data for each nearby location
                DataPoliceUkModel dataPoliceUkModel = dataPoliceUkController.CrimeAtLocation2(
                    googlePlacesModel.Results[i].Geometry.Location.Latitude,
                    googlePlacesModel.Results[i].Geometry.Location.Longitude,
                    clModel.CrimeTypes,
                    DateTime.Now.Month,
                    DateTime.Now.Year
                );

                //check result status before continuing
                foreach(var error in dataPoliceUkModel.Status.Errors)
                {
                    error.LocationRequestIndex = i;
                }
                crimeLocationsRequestModel.Status.Errors.AddRange(dataPoliceUkModel.Status.Errors);

                //bind location + crime data to new CrimeLocationModel and add to main model
                crimeLocationsRequestModel.CrimeLocations.Add(new CrimeLocationModel(googlePlacesModel.Results[i], dataPoliceUkModel));
            }

            return crimeLocationsRequestModel;
        }
        public CrimeLocationsRequestModel CrimeLocationsRequestWithStats(int crimeLocationTypeId, double latitude, double longitude, int radius)
        {
            //Init main model
            CrimeLocationsRequestModel crimeLocationsRequestModel = new CrimeLocationsRequestModel(true);

            //----------------------------------------------------------------------------------------------------//

            //get crime location relationship from DB
            CrimeLocationTypeModel clModel = null;

            CrimeLocationType dbModel = unitOfWork.CrimeLocationTypeRepository.GetByID(crimeLocationTypeId);
            clModel = new CrimeLocationTypeModel(dbModel);

            //check if model found (cant hav Id zero either - stupid ef seed migration identity problem)
            if (clModel == null || clModel.Id == 0)
            {
                crimeLocationsRequestModel.Status.setNoClRelationshipFound();
                crimeLocationsRequestModel.Stats.EvaluateRequest(crimeLocationsRequestModel.CrimeLocations);
                return crimeLocationsRequestModel;
            }

            //--------------------------------------------------------------------------------------------------//

            //Create GooglePLacesAPI controller
            GooglePlacesApiController googlePlacesController = new GooglePlacesApiController();

            //Get nearby locations
            crimeLocationsRequestModel.Stats.locationRequestStopwatch.Start();
            GooglePlacesModel googlePlacesModel = googlePlacesController.NearbySearch(clModel.LocationType, latitude, longitude, radius);
            crimeLocationsRequestModel.Stats.locationRequestStopwatch.Stop();
            crimeLocationsRequestModel.Stats.LocationRequestTime = crimeLocationsRequestModel.Stats.locationRequestStopwatch.ElapsedMilliseconds;

            //check for errors
            crimeLocationsRequestModel.Status.setGooglePlacesError(googlePlacesModel);

            if (!crimeLocationsRequestModel.Status.SafeToContinue)
            {
                crimeLocationsRequestModel.Stats.EvaluateRequest(crimeLocationsRequestModel.CrimeLocations);
                return crimeLocationsRequestModel;
            }

            //--------------------------------------------------------------------------------------------------//

            //Create DataPoliceAPI controller
            DataPoliceUKApiController dataPoliceUkController = new DataPoliceUKApiController();

            for (int i = 0; i < googlePlacesModel.Results.Count(); i++)
            {
                //Get crime data for each nearby location
                crimeLocationsRequestModel.Stats.crimeRequestStopwatch.Start();
                DataPoliceUkModel dataPoliceUkModel = dataPoliceUkController.CrimeAtLocation2(
                    googlePlacesModel.Results[i].Geometry.Location.Latitude,
                    googlePlacesModel.Results[i].Geometry.Location.Longitude,
                    clModel.CrimeTypes,
                    DateTime.Now.Month,
                    DateTime.Now.Year
                );
                crimeLocationsRequestModel.Stats.crimeRequestStopwatch.Stop();
                crimeLocationsRequestModel.Stats.CrimeRequestTimes.Add(crimeLocationsRequestModel.Stats.crimeRequestStopwatch.ElapsedMilliseconds);
                crimeLocationsRequestModel.Stats.crimeRequestStopwatch.Reset();

                //check result status before continuing
                foreach (var error in dataPoliceUkModel.Status.Errors)
                {
                    error.LocationRequestIndex = i;
                }
                crimeLocationsRequestModel.Status.Errors.AddRange(dataPoliceUkModel.Status.Errors);

                //bind location + crime data to new CrimeLocationModel and add to main model
                crimeLocationsRequestModel.CrimeLocations.Add(new CrimeLocationModel(googlePlacesModel.Results[i], dataPoliceUkModel));
            }

            crimeLocationsRequestModel.Stats.EvaluateRequest(crimeLocationsRequestModel.CrimeLocations);
            return crimeLocationsRequestModel;
        }