import argparse
import asyncio
import json
from os import path

from app.db import init_db, Entity, Contract, ContractTemplate, ProvisionTemplate, User


models = [Entity, Contract, User, ContractTemplate, ProvisionTemplate]


async def handle_migration(args):
    await init_db()
    if args.action == "import-fixtures":
        for m in models:
            fname = './fixtures/{}.json'.format(m.__name__)
            if path.isfile(fname):
                with open(fname, 'r') as f:
                    content = json.load(f)
                    for r in content:
                        obj = m(**r)
                        await obj.save()

    elif args.action == "export-fixtures":
        for m in models:
            if await m.count() > 0:
                with open('./fixtures/{}.json'.format(m.__name__), 'w') as f:
                    body = [o.json() for o in await m.find_all().to_list()]
                    f.write('[\n' + ',\n'.join(body) + '\n]\n')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
                        prog='migration.py',
                        description='Migrate data and schemas on the crud project',
                        epilog='Bisou')

    parser.add_argument('action', type=str, help="The action to perform")
    args = parser.parse_args()

    asyncio.run(handle_migration(args))
