from .dates_add_days import add_days from .subscriptions_trial_end_types import TrialPeriod def trial_end(start_date: str, trial_days: int) -> TrialPeriod: """The last free day and the first charge date of a trial of ``trial_days`` days starting on ``start_date``. The start day counts as day one, so the last free day is start + trial_days - 1 and the charge is the day after it. """ if isinstance(trial_days, bool) or not isinstance(trial_days, int): raise TypeError("trial days must be an integer, received %r" % (trial_days,)) if trial_days < 0: raise ValueError("trial days must not be negative, received %d" % (trial_days,)) # add_days validates the start date even when there is no trial, so a # malformed date never slips through as the "first charge date". first_charge_date = add_days(start_date, trial_days) last_trial_day = None if trial_days == 0 else add_days(start_date, trial_days - 1) return TrialPeriod(last_trial_day=last_trial_day, first_charge_date=first_charge_date)