#! /usr/bin/env python3

import anndata, sys, argparse

def main():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description="Print out info about metadata in an h5ad file")
    parser.add_argument('h5ad', type=str, help='an h5ad file')
    parser.add_argument('-f', '--fields', type=int, default=5, \
      help='number of values to print for a field')
    args = parser.parse_args()

    ad = anndata.read_h5ad(args.h5ad)

    # Prints out general info about the matrix/dataset
    print(ad,"\n")

    # Loop goes through each field in obs and prints out at least 5 values
    for annot in ad.obs_keys():
        # Get list of unique vals in obs annotation
        # value_counts from here: https://stackoverflow.com/questions/45759966/counting-unique-values-in-a-column-in-pandas-dataframe-like-in-qlik
        annot_vals = ad.obs[annot].value_counts().to_frame()
        val_count = len(annot_vals)
        # Can't color on annots with >500 vals, so no need to display them here
        if val_count < 500:
            print(annot, "-", val_count, "unique values")
            # to_string from https://python.tutorialink.com/printing-pandas-df-without-column-name/
            print(annot_vals.head(args.fields).to_string(header=False))
            print()

if __name__ == "__main__":
    main()
