import sys

import click

from .. import util
from . import cli
from ._util import exit_on_broken_pipe


@cli.command()
@click.argument("chromsizes", type=str, metavar="CHROMSIZES_PATH")
@click.argument("binsize", type=int, metavar="BINSIZE")
@click.option("--out", "-o", help="Output file (defaults to stdout)")
@click.option(
    "--header",
    "-H",
    help="Print the header of column names as the first row.",
    is_flag=True,
    default=False,
    show_default=True,
)
@click.option(
    "--rel-ids",
    "-i",
    type=click.Choice(["0", "1"]),
    help="Include a column of relative bin IDs for each chromosome. "
    "Choose whether to report them as 0- or 1-based.",
)
@exit_on_broken_pipe(1)
def makebins(chromsizes, binsize, out, header, rel_ids):
    """
    Generate fixed-width genomic bins.

    Output a genome segmentation at a fixed resolution as a BED file.

    CHROMSIZES_PATH : UCSC-like chromsizes file, with chromosomes in desired
    order.

    BINSIZE : Resolution (bin size) in base pairs <int>.

    """
    chromsizes = util.read_chromsizes(chromsizes, all_names=True)
    bins = util.binnify(chromsizes, binsize)

    if rel_ids is not None:
        bins["id"] = bins.groupby("chrom", observed=True).cumcount()
        if int(rel_ids) == 1:
            bins["id"] += 1

    # Write output
    if out is None:
        f = sys.stdout
    else:
        f = open(out, "w")

    if header:
        bins[0:0].to_csv(
            f, sep="\t", lineterminator='\n', index=False, header=True
        )
    bins.to_csv(f, sep="\t", lineterminator='\n', index=False, header=False)
    f.flush()
