#!/usr/bin/env python

"""
Scan the models directory and print out a new models.yaml
"""

import argparse
import os
import sys
from pathlib import Path

from omegaconf import OmegaConf


def main():
    parser = argparse.ArgumentParser(description="Model directory scanner")
    parser.add_argument("models_directory")
    parser.add_argument(
        "--all-models",
        default=False,
        action="store_true",
        help="If true, then generates stanzas for all models; otherwise just diffusers",
    )

    args = parser.parse_args()
    directory = args.models_directory

    conf = OmegaConf.create()
    conf["_version"] = "3.0.0"

    for root, dirs, files in os.walk(directory):
        parents = root.split("/")
        subpaths = parents[parents.index("models") + 1 :]
        if len(subpaths) < 2:
            continue
        base, model_type, *_ = subpaths

        if args.all_models or model_type == "diffusers":
            for d in dirs:
                conf[f"{base}/{model_type}/{d}"] = {
                    "path": os.path.join(root, d),
                    "description": f"{model_type} model {d}",
                    "format": "folder",
                    "base": base,
                }

            for f in files:
                basename = Path(f).stem
                format = Path(f).suffix[1:]
                conf[f"{base}/{model_type}/{basename}"] = {
                    "path": os.path.join(root, f),
                    "description": f"{model_type} model {basename}",
                    "format": format,
                    "base": base,
                }

    OmegaConf.save(config=dict(sorted(conf.items())), f=sys.stdout)


if __name__ == "__main__":
    main()