import csv

# import click_spinner
# import ereuse_utils.cli
from io import StringIO

from ereuse_devicehub.resources.action import models as evs
from ereuse_devicehub.resources.documents.device_row import InternalStatsRow

# import click


class Report:

    def __init__(self, app) -> None:
        super().__init__()
        self.app = app
        self.app.cli.command('report', short_help='Creates reports devices and users.')(
            self.run
        )

    def run(self):
        stats = InternalStatsView()
        stats.print()


class InternalStatsView:
    def print(self):
        query = evs.Action.query.filter(
            evs.Action.type.in_(('Snapshot', 'Live', 'Allocate', 'Deallocate')))
        return self.generate_post_csv(query)

    def generate_post_csv(self, query):
        d = {}
        for ac in query:
            create = '{}-{}'.format(ac.created.year, ac.created.month)
            user = ac.author.email

            if user not in d:
                d[user] = {}
            if create not in d[user]:
                d[user][create] = []
            d[user][create].append(ac)

        data = StringIO()
        cw = csv.writer(data, delimiter=';', lineterminator="\n", quotechar='"')
        cw.writerow(InternalStatsRow('', "2000-1", []).keys())
        for user, createds in d.items():
            for create, actions in createds.items():
                cw.writerow(InternalStatsRow(user, create, actions).values())

        return print(data.getvalue())