def _create_next_status_change()

in playground/process_analysis/utils/status_transition_data_generator.py [0:0]


def _create_next_status_change(current: StatusChange) -> StatusChange | None:
    next_status = None
    changed_date = current.changed_date

    match current.to_status:
        case Status.BACKLOG:
            next_status = rand.choice(
                [None, Status.TODO, Status.READY, Status.IN_PROGRESS, Status.WONT_FIX],
                p=[0.1, 0.6, 0.15, 0.05, 0.1],
            )
            changed_date = current.changed_date + timedelta(hours=rand.gumbel(24 * 50, 24 * 20))
        case Status.TODO:
            next_status = rand.choice(
                [
                    None,
                    Status.BACKLOG,
                    Status.READY,
                    Status.IN_PROGRESS,
                    Status.WONT_FIX,
                ],
                p=[0.1, 0.1, 0.45, 0.25, 0.1],
            )
            changed_date = current.changed_date + timedelta(hours=rand.gumbel(24 * 28, 24 * 7))
        case Status.READY:
            next_status = rand.choice(
                [
                    None,
                    Status.BACKLOG,
                    Status.TODO,
                    Status.IN_PROGRESS,
                    Status.WONT_FIX,
                ],
                p=[0.1, 0.05, 0.05, 0.75, 0.05],
            )
            changed_date = current.changed_date + timedelta(hours=rand.gumbel(24 * 14, 24 * 3))
        case Status.IN_PROGRESS:
            next_status = rand.choice(
                [None, Status.TODO, Status.READY, Status.REVIEW, Status.TEST],
                p=[0.05, 0.05, 0.1, 0.6, 0.2],
            )
            changed_date = current.changed_date + timedelta(hours=rand.gumbel(24 * 7, 24 * 3))
        case Status.REVIEW:
            next_status = rand.choice(
                [None, Status.TODO, Status.IN_PROGRESS, Status.TEST],
                p=[0.02, 0.03, 0.15, 0.8],
            )
            changed_date = current.changed_date + timedelta(hours=rand.gumbel(24 * 1, 24 * 0.5))
        case Status.TEST:
            next_status = rand.choice(
                [None, Status.TODO, Status.IN_PROGRESS, Status.RELEASE],
                p=[0.02, 0.06, 0.17, 0.75],
            )
            changed_date = current.changed_date + timedelta(hours=rand.gumbel(24 * 2, 24 * 1))
        case Status.RELEASE:
            next_status = rand.choice([None, Status.TODO, Status.TEST, Status.DONE], p=[0.02, 0.01, 0.1, 0.87])
            changed_date = current.changed_date + timedelta(hours=rand.gumbel(24 * 3, 24 * 1))
        case Status.DONE:
            next_status = rand.choice([None, Status.TODO, Status.IN_PROGRESS], p=[0.85, 0.02, 0.13])
            changed_date = current.changed_date + timedelta(hours=rand.gumbel(24 * 7, 24 * 3))
        case Status.WONT_FIX:
            next_status = rand.choice(
                [None, Status.BACKLOG, Status.TODO, Status.IN_PROGRESS, Status.DONE],
                p=[0.85, 0.05, 0.05, 0.02, 0.03],
            )
            changed_date = current.changed_date + timedelta(hours=rand.gumbel(24 * 60, 24 * 10))
        case _:
            pass

    if next_status is None:
        return None

    return StatusChange(
        current.issue_key,
        current.issue_type,
        current.created_date,
        current.to_status,
        next_status,
        changed_date,
    )