private async Task PrepRegattaVmAsync(RegattaWithOptionsViewModel model)
    {
        if (model.StartDate.HasValue)
        {
            var seasons = await _coreSeasonService.GetSeasons(model.ClubId);

            model.Season = seasons.Single(s =>
                                          s.Start <= model.StartDate.Value &&
                                          s.End >= model.StartDate.Value);
        }
        if (model.ScoringSystemId == Guid.Empty)
        {
            model.ScoringSystemId = null;
        }
        model.Fleets = new List <Fleet>();
        var fleets = await _coreFleetService.GetAllFleetsForClub(model.ClubId);

        if (model.FleetIds != null)
        {
            foreach (var fleetId in model.FleetIds)
            {
                model.Fleets.Add(fleets
                                 .Single(f => f.Id == fleetId));
            }
        }
    }
    public async Task <ActionResult> Create(
        string clubInitials,
        RegattaWithOptionsViewModel model)
    {
        var clubId = await _clubService.GetClubId(clubInitials);

        try
        {
            if (!await _authService.CanUserEdit(User, clubId))
            {
                return(Unauthorized());
            }
            model.ClubId = clubId;
            if (!ModelState.IsValid)
            {
                var blank = await _regattaService.GetBlankRegattaWithOptions(clubId);

                model.SeasonOptions        = blank.SeasonOptions;
                model.ScoringSystemOptions = blank.ScoringSystemOptions;
                model.FleetOptions         = blank.FleetOptions;

                return(View(model));
            }

            var regattaId = await _regattaService.SaveNewAsync(model);

            var savedRegatta = await _regattaService.GetRegattaAsync(regattaId);

            return(RedirectToAction("Details", new
            {
                clubInitials,
                season = savedRegatta.Season.UrlName,
                regattaName = savedRegatta.UrlName
            }));
        }
        catch
        {
            var blank = await _regattaService.GetBlankRegattaWithOptions(clubId);

            model.SeasonOptions        = blank.SeasonOptions;
            model.ScoringSystemOptions = blank.ScoringSystemOptions;
            model.FleetOptions         = blank.FleetOptions;

            return(View(model));
        }
    }
    public async Task <RegattaWithOptionsViewModel> GetBlankRegattaWithOptions(Guid clubId)
    {
        var vm = new RegattaWithOptionsViewModel
        {
            SeasonOptions = await _coreSeasonService.GetSeasons(clubId),
            FleetOptions  = await _coreFleetService.GetAllFleetsForClub(clubId)
        };
        var scoringSystemOptions = await _coreScoringService.GetScoringSystemsAsync(clubId, true);

        scoringSystemOptions.Add(new ScoringSystem
        {
            Id   = Guid.Empty,
            Name = "<Use Club Default>"
        });
        vm.ScoringSystemOptions = scoringSystemOptions.OrderBy(s => s.Name).ToList();

        return(vm);
    }
    public async Task <Guid> SaveNewAsync(RegattaWithOptionsViewModel model)
    {
        await PrepRegattaVmAsync(model);

        return(await _coreRegattaService.SaveNewRegattaAsync(model));
    }
    public async Task <Guid> UpdateAsync(RegattaWithOptionsViewModel model)
    {
        await PrepRegattaVmAsync(model);

        return(await _coreRegattaService.UpdateAsync(model));
    }