private Parliament.Model.Debate generateDebate(Debate sourceDebate, DateTime?scheduledDebateDate)
        {
            Parliament.Model.Debate debate = new Parliament.Model.Debate();
            debate.Id = GenerateNewId();
            debate.DebateProposedDate  = DeserializerHelper.GiveMeSingleDateValue(scheduledDebateDate);
            debate.DebateDate          = DeserializerHelper.GiveMeSingleDateValue(sourceDebate.debated_on);
            debate.DebateVideoUrl      = DeserializerHelper.GiveMeSingleTextValue(sourceDebate.video_url);
            debate.DebateTranscriptUrl = DeserializerHelper.GiveMeSingleTextValue(sourceDebate.transcript_url);
            debate.DebateOverview      = DeserializerHelper.GiveMeSingleTextValue(sourceDebate.overview);

            return(debate);
        }
        public override BaseResource[] TransformSource(Rootobject sourceEPetition)
        {
            DateTime       petitionRetrievalTimestamp = DateTime.UtcNow;
            UkgapEPetition ukgapEPetition             = new UkgapEPetition();

            BaseResource[] moderations = null;
            if ((sourceEPetition != null) && (sourceEPetition.data != null) && (sourceEPetition.data.attributes != null))
            {
                ukgapEPetition.EPetitionUkgapId  = sourceEPetition.data.id.ToString();
                ukgapEPetition.CreatedAt         = DeserializerHelper.GiveMeSingleDateValue(sourceEPetition.data.attributes.created_at);
                ukgapEPetition.Background        = DeserializerHelper.GiveMeSingleTextValue(sourceEPetition.data.attributes.background);
                ukgapEPetition.AdditionalDetails = DeserializerHelper.GiveMeSingleTextValue(sourceEPetition.data.attributes.additional_details);
                ukgapEPetition.ClosedAt          = DeserializerHelper.GiveMeSingleDateValue(sourceEPetition.data.attributes.closed_at);
                ukgapEPetition.UpdatedAt         = DeserializerHelper.GiveMeSingleDateValue(sourceEPetition.data.attributes.updated_at);
                ukgapEPetition.Action            = DeserializerHelper.GiveMeSingleTextValue(sourceEPetition.data.attributes.action);
                if (sourceEPetition.data.attributes.government_response != null)
                {
                    GovernmentResponse governmentResponse = generateGovernmentResponse(sourceEPetition.data.attributes.government_response);
                    ukgapEPetition.EPetitionHasGovernmentResponse = new GovernmentResponse[] { governmentResponse };
                }
                if (sourceEPetition.data.attributes.debate != null)
                {
                    Parliament.Model.Debate debate = generateDebate(sourceEPetition.data.attributes.debate, sourceEPetition.data.attributes.scheduled_debate_date);
                    ukgapEPetition.EPetitionHasDebate = new Parliament.Model.Debate[] { debate };
                }
                moderations = generateModerations(sourceEPetition.data.attributes.open_at, sourceEPetition.data.attributes.rejected_at, sourceEPetition.data.attributes.rejection);
                ukgapEPetition.EPetitionHasThresholdAttainment = generateThresholdAttainments(sourceEPetition.data.attributes.moderation_threshold_reached_at, sourceEPetition.data.attributes.response_threshold_reached_at, sourceEPetition.data.attributes.debate_threshold_reached_at);
                List <LocatedSignatureCount> signatures = new List <LocatedSignatureCount>();
                if (sourceEPetition.data.attributes.signatures_by_country != null)
                {
                    signatures.AddRange(generateInternationalAreasSignatures(sourceEPetition.data.attributes.signatures_by_country, petitionRetrievalTimestamp));
                }
                if (sourceEPetition.data.attributes.signatures_by_constituency != null)
                {
                    signatures.AddRange(generateConstituencySignatures(sourceEPetition.data.attributes.signatures_by_constituency, petitionRetrievalTimestamp));
                }
                ukgapEPetition.EPetitionHasLocatedSignatureCount = signatures;
            }

            return(moderations.Concat(ukgapEPetition.AsEnumerable()).ToArray());
        }
        public override BaseResource[] SynchronizeIds(BaseResource[] source, Uri subjectUri, BaseResource[] target)
        {
            UkgapEPetition ePetition = source.OfType <UkgapEPetition>().SingleOrDefault();

            ePetition.Id = subjectUri;

            GovernmentResponse governmentResponse = target.OfType <GovernmentResponse>().SingleOrDefault();

            if (governmentResponse != null)
            {
                ePetition.EPetitionHasGovernmentResponse.SingleOrDefault().Id = governmentResponse.Id;
            }
            Parliament.Model.Debate debate = target.OfType <Parliament.Model.Debate>().SingleOrDefault();
            if (debate != null)
            {
                ePetition.EPetitionHasDebate.SingleOrDefault().Id = debate.Id;
            }
            IEnumerable <Approval> approvals          = target.OfType <Approval>();
            List <Approval>        ePetitionApprovals = source.OfType <Approval>().ToList();

            foreach (Approval approval in approvals)
            {
                Approval foundModeration = ePetitionApprovals
                                           .SingleOrDefault(m => m.ApprovedAt == approval.ApprovedAt);
                if (foundModeration != null)
                {
                    foundModeration.Id = approval.Id;
                }
                else
                {
                    ePetitionApprovals.Add(approval);
                }
            }
            foreach (Approval approval in ePetitionApprovals)
            {
                approval.ApprovalHasApprovedEPetition = new ApprovedEPetition[]
                {
                    new ApprovedEPetition()
                    {
                        Id = subjectUri
                    }
                }
            }
            ;

            IEnumerable <Parliament.Model.Rejection> rejects             = target.OfType <Parliament.Model.Rejection>();
            List <Parliament.Model.Rejection>        ePetitionRejections = source.OfType <Parliament.Model.Rejection>().ToList();

            foreach (Parliament.Model.Rejection rejection in rejects)
            {
                Parliament.Model.Rejection foundModeration = ePetitionRejections
                                                             .SingleOrDefault(m => m.RejectedAt == rejection.RejectedAt);
                if (foundModeration != null)
                {
                    foundModeration.Id = rejection.Id;
                }
                else
                {
                    ePetitionRejections.Add(rejection);
                }
            }
            foreach (Parliament.Model.Rejection rejection in ePetitionRejections)
            {
                rejection.RejectionHasRejectedEPetition = new RejectedEPetition[]
                {
                    new RejectedEPetition()
                    {
                        Id = subjectUri
                    }
                }
            }
            ;

            IEnumerable <ThresholdAttainment> thresholdAttainments = target.OfType <ThresholdAttainment>();

            foreach (ThresholdAttainment thresholdAttainment in thresholdAttainments)
            {
                ThresholdAttainment foundThresholdAttainment = ePetition.EPetitionHasThresholdAttainment.SingleOrDefault(t => t.ThresholdAttainmentAt == thresholdAttainment.ThresholdAttainmentAt);
                if (foundThresholdAttainment != null)
                {
                    foundThresholdAttainment.Id = thresholdAttainment.Id;
                }
            }
            IEnumerable <LocatedSignatureCount> signatures = target.OfType <LocatedSignatureCount>();

            foreach (LocatedSignatureCount signature in signatures)
            {
                LocatedSignatureCount foundLocatedSignatureCount = ePetition.EPetitionHasLocatedSignatureCount
                                                                   .SingleOrDefault(s => s.LocatedSignatureCountHasPlace.Id == signature.LocatedSignatureCountHasPlace.Id);
                if (foundLocatedSignatureCount != null)
                {
                    foundLocatedSignatureCount.Id = signature.Id;
                    if (foundLocatedSignatureCount.SignatureCount.SingleOrDefault() == signature.SignatureCount.SingleOrDefault())
                    {
                        foundLocatedSignatureCount.SignatureCountRetrievedAt = signature.SignatureCountRetrievedAt;
                    }
                }
            }
            foreach (LocatedSignatureCount signature in ePetition.EPetitionHasLocatedSignatureCount.Where(s => s.Id == null))
            {
                signature.Id = GenerateNewId();
            }

            return(ePetitionApprovals.AsEnumerable <BaseResource>().Concat(ePetitionRejections).Concat(ePetition.AsEnumerable()).ToArray());
        }