"""
Provides functions to manage the database while the server is offline.
"""

import argparse
import csv
import os

from piket_server.models import Person, Settlement, ConsumptionType, Consumption
from piket_server.flask import db


def main():
    """ Main entry point. """

    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    # Clear command
    parser_clear = subparsers.add_parser("clear", help="Clear the database.")
    parser_clear.set_defaults(func=cmd_clear)
    parser_clear.add_argument("--removemydata", action="store_true")

    # Parser load_seeds
    parser_load_persons = subparsers.add_parser(
        "load_persons", help="Load Person data."
    )
    parser_load_persons.set_defaults(func=cmd_load_persons)
    parser_load_persons.add_argument("datafile")

    args = parser.parse_args()
    args.func(args)


def cmd_clear(args) -> None:
    """ Entry point for 'clear' subcommand. """

    if not args.removemydata:
        print("WARNING! This command will delete all contents in your database!")
        print("Type 'removemydata' to continue, anything else or CTRL-C to abort.")

        confirmation = input("> ")

        do_wipe = confirmation == "removemydata"

    else:
        do_wipe = True

    if do_wipe:
        print("Dropping all tables...")
        db.drop_all()

        print("All data removed. Recreating database...")
        db.create_all()

        from alembic.config import Config  # type: ignore
        from alembic import command  # type: ignore

        alembic_cfg = Config(os.path.join(os.path.dirname(__file__), "alembic.ini"))
        command.stamp(alembic_cfg, "head")

        print("Done.")
        return

    print("Aborting.")


def cmd_load_persons(args) -> None:
    """ Entrypoint for 'load_persons" subcommand. """

    print("Loading persons.")

    with open(args.datafile) as csvfile:
        reader = csv.DictReader(csvfile)

        for row in reader:
            p = Person(name=row["name"], active=bool(int(row["active"])))
            db.session.add(p)

    db.session.commit()

    print("Done.")


if __name__ == "__main__":
    main()