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.device.models import Placeholder
from ereuse_devicehub.resources.documents.device_row import InternalStatsRow

# import click


class Report:
    def __init__(self, app) -> None:
        super().__init__()
        self.app = app
        short_help = 'Creates reports devices and users.'
        self.app.cli.command('report', short_help=short_help)(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',
                    'EraseBasic',
                    'EraseSectors',
                )
            )
        )
        return self.generate_post_csv(query)

    def generate_post_csv(self, query):
        data = StringIO()
        cw = csv.writer(data, delimiter=';', lineterminator="\n", quotechar='"')
        cw.writerow(InternalStatsRow('', "2000-1", [], []).keys())

        for row in self.get_rows(query):
            cw.writerow(row)

        return print(data.getvalue())

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

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

        for user, createds in d.items():
            for create, actions in createds.items():
                r = InternalStatsRow(user, create, actions, disks)
                dd[user][create] = r

        return self.get_placeholders(dd)

    def get_placeholders(self, dd):

        for p in Placeholder.query.all():
            create = '{}-{}'.format(p.created.year, p.created.month)
            user = p.owner.email

            if user not in dd:
                dd[user] = {}

            if create not in dd[user]:
                dd[user][create] = None

            if not dd[user][create]:
                dd[user][create] = InternalStatsRow(user, create, [], [])

            dd[user][create]['Placeholders'] += 1

        rows = []
        for user, createds in dd.items():
            for create, row in createds.items():
                rows.append(row.values())
        return rows