def sliding_window_regions(start, end, window_size, step_size):
    """
    sliding_window_regions
    ======================
    This method will split a gene into different regions based on a sliding window and step size.
     Each region is based on the window size. The window is slid down the gene using the step size.
     Each step size results in a new window. For example, if the gene is ~67000 bp long, the window size
     is 1.5kb and the step size is 375 bp, then you would get ~180 overlapping regions, with each region
     having a size of 1.5kb. The first region will start at the start site of the gene and the last
     region will end at the end site of the gene.

    Parameters:
    -----------
    1) start:           (int) The genomic start position of a gene
    2) end:             (int) The genomic end position of a gene
    3) window_size:     (int) The size of the window/region in bp to use for the sliding window
    4) step_size:       (int) The sliding step size in bp to slide the window across a gene.

    Returns:
    ++++++++
    (list) A 2d list of regions created by sliding a window across the gene positions. Each inner list
            have the region start pos at index 0 and the end pos as index 1
    """
    start = int(start)
    end = int(end)
    window_size = int(window_size)
    step_size = int(step_size)

    ## Start and end of first region
    ## First region will start at the start of the gene
    window_start = start
    window_end = start + (
        window_size - 1
    )  ## The size of the region will include the start position to the end position. This accounts for a off by 1 error.

    gene_regions = []

    ## Iterate over the gene range and get all regions
    while window_end < end:

        ## Add region
        gene_regions.append([window_start, window_end])

        ## Slide the window by the step size
        window_start += step_size
        window_end += step_size

    ## Start and end of last region
    ## Last region will end at the end of the gene
    window_start = end - (window_size - 1) if end - (window_size - 1) > start else start
    window_end = end
    ## Add region
    gene_regions.append([window_start, window_end])

    return gene_regions