public void CreateSubmission(int contest_id, int problem_no, SubmissionFormData submission_data)
        {
            // important: submission_repository must be initialized using this.context
            SubmissionRepository submission_repository = new SubmissionRepository(context);

            Contest contest = context.Contests.Include(x => x.Problems).FirstOrDefault(x => x.Id == contest_id);

            if (contest.EndDate < DateTime.Now)
            {
                throw new InvalidOperationException("Can not create submission to contest that has ended");
            }

            if (contest.StartDate > DateTime.Now)
            {
                throw new InvalidOperationException("Can not create submission to contest that has not started");
            }

            ContestProblem contest_problem = contest.Problems.FirstOrDefault(x => x.Order == problem_no);
            Problem        problem         = contest_problem.Problem;

            submission_repository.OnSubmissionStatusChange += (Object sender, ExecutionResultEventArgs args) => {
                // the submission entry is updated by SubmissionRepository,
                // this handler only updates the contestant

                // replace with real user
                var contestant = context.Contestants.Include(x => x.Submissions).First(x => x.Contest.Id == contest_id);

                contestant.Penalty = contest_service.CalclatePenalty(contestant.Submissions);

                contestant.SolveCount = context.ContestProblems.Count(x => x.Submissions.
                                                                      Count(y => y.Submission.Status.Id == Verdict.Accepted) > 0);

                context.SaveChanges();
            };


            User submitter = context.Users.First();

            Submission submission = submission_repository.CreateProblemSubmission(problem.Id, submission_data);

            ContestSubmission contest_submission = new ContestSubmission()
            {
                Submitter  = context.Contestants.First(x => x.Contest.Id == contest_id && x.User.Id == submitter.Id),
                Problem    = contest_problem,
                Submission = submission,
            };

            contest.Submissions.Add(contest_submission);
            context.SaveChanges();
        }