"""
Extract audio features and metadata, encode using PCA or Autoencoder, run clustering, and plot results.
"""

import argparse
import sys

from .log import run, Status
from .utils import add_args


def run_main(status: Status, **kwargs) -> int:
    try:
        from .extract import run_main as run_extract_main
        from .encode import run_main as run_encode_main
        from .cluster import run_main as run_cluster_main
        from .plot import run_main as run_plot_main
        from .playlists import run_main as run_playlists_main

        run_extract_main(status, **kwargs)
        run_encode_main(status, **kwargs)
        run_cluster_main(status, **kwargs)
        run_plot_main(status, **kwargs)
        run_playlists_main(status, **kwargs)
    except KeyboardInterrupt as e:
        status.logger.error(e.__class__.__name__)
        return 130
    except BaseException as e:
        status.logger.exception(str(e), exc_info=e)
        return 1
    else:
        return 0


def main() -> int:
    parser = argparse.ArgumentParser(description=__doc__.strip(), formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    args = add_args(parser).parse_args()
    return run(run_main, **vars(args))


if __name__ == "__main__":
    sys.exit(main())