public RetrieveResponse <VisitsPerMonthLineChartResponse> VisitsPerMonthLineChart(IDbConnection connection)
        {
            var response = new VisitsPerMonthLineChartResponse();

            var visitTypes = new VisitTypesRepository().List(connection, new ListRequest()).Entities;

            //if (visitTypes.Any())
            //    response.Labels = visitTypes.Select(vt => vt.Name).ToList();
            for (int i = 0; i < 6; i++)
            {
                response.labels.Add(DateTime.Now.AddMonths(-i).ToString("MMMM"));
            }

            foreach (var visitTypesRow in visitTypes)
            {
                var dataset = new VisitsPerMonthLineChartResponse.Dataset();
                dataset.label           = visitTypesRow.Name;
                dataset.backgroundColor = visitTypesRow.BackgroundColor;
                dataset.borderColor     = visitTypesRow.BackgroundColor;

                var visitReq = new ListRequest();
                visitReq.ColumnSelection = ColumnSelection.KeyOnly;

                var visitFlds = VisitsRow.Fields;
                visitReq.IncludeColumns = new HashSet <string>
                {
                    visitFlds.StartDate.Name,
                    visitFlds.EndDate.Name,
                    visitFlds.VisitTypeId.Name
                };
                for (int i = 0; i < 6; i++)
                {
                    var firstDayOfMonth = new DateTime(DateTime.Now.AddMonths(-i).Year,
                                                       DateTime.Now.AddMonths(-i).Month, 1);
                    var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);

                    visitReq.Criteria = (new Criteria(visitFlds.StartDate.Name) >= firstDayOfMonth
                                         & new Criteria(visitFlds.EndDate.Name) <= lastDayOfMonth
                                         & new Criteria(visitFlds.VisitTypeId.Name) == visitTypesRow.VisitTypeId.Value);

                    var visits = new VisitsRepository().List(connection, visitReq);
                    dataset.data.Add(visits.TotalCount);
                }
                response.datasets.Add(dataset);
            }
            return(new RetrieveResponse <VisitsPerMonthLineChartResponse> {
                Entity = response
            });
        }
        public RetrieveResponse <VisitTypesPerGenderChartResponse> VisitTypesPerGenderChart(IDbConnection connection)
        {
            var response   = new VisitTypesPerGenderChartResponse();
            var visitTypes = new VisitTypesRepository().List(connection, new ListRequest()).Entities;

            if (visitTypes.Any())
            {
                response.labels = visitTypes.Select(vt => vt.Name).ToList();
            }
            // For each the enum because we don't know the count of genders
            foreach (Gender gender in Enum.GetValues(typeof(Gender)))
            {
                var dataset = new VisitTypesPerGenderChartResponse.Dataset();
                dataset.label           = gender.ToString();
                dataset.backgroundColor = visitTypes.Select(s => s.BackgroundColor).ToList();

                // Get Patients contained in filtered visits
                var patientFields   = PatientsRow.Fields;
                var patientsRequest = new ListRequest();
                patientsRequest.ColumnSelection = ColumnSelection.KeyOnly;
                patientsRequest.IncludeColumns  = new HashSet <string>
                {
                    patientFields.Gender.Name
                };
                patientsRequest.Criteria = (new Criteria(patientFields.Gender.Name) == gender);

                var patients = new PatientsRepository().List(connection, patientsRequest).Entities;

                if (patients.Any())
                {
                    dataset.PatientsTotal = patients.Count;

                    var visitsFields = VisitsRow.Fields;
                    var visits       = connection.List <VisitsRow>(s => s
                                                                   .Select(visitsFields.VisitId).Select(visitsFields.VisitTypeId).Select(visitsFields.PatientId)
                                                                   .Where(visitsFields.PatientId.In(patients.Select(p => p.PatientId))));

                    dataset.VisitsTotal = visits.Count;
                    var tempCounter = 0;
                    foreach (var visitTypesRow in visitTypes)
                    {
                        var visitsCounter = connection.Count <VisitsRow>(
                            visitsFields.VisitTypeId == visitTypesRow.VisitTypeId.Value &&
                            visitsFields.PatientId.In(patients.Select(p => p.PatientId)));

                        if (visitsCounter > tempCounter)
                        {
                            dataset.MostReservedVisitType = visitTypesRow.Name;
                        }

                        dataset.data.Add(visitsCounter);
                    }
                }
                else
                {
                    dataset.data.Add(0);
                }

                response.datasets.Add(dataset);
            }

            return(new RetrieveResponse <VisitTypesPerGenderChartResponse> {
                Entity = response
            });
        }