import os
from unittest import TestCase
from tempfile import mkstemp
from openpyxl import load_workbook

from followthemoney import model
from followthemoney.export.excel import ExcelExporter


ENTITY = {
    "id": "person",
    "schema": "Person",
    "properties": {
        "name": ["Ralph Tester"],
        "birthDate": ["1972-05-01"],
        "idNumber": ["9177171", "8e839023"],
        "website": ["https://ralphtester.me"],
        "phone": ["+12025557612"],
        "email": ["info@ralphtester.me"],
        "topics": ["role.spy"],
    },
}


class ExcelExportTestCase(TestCase):
    def setUp(self):
        _, self.temp = mkstemp(suffix=".xlsx")

    def tearDown(self):
        os.unlink(self.temp)

    def test_excel_export(self):
        entity = model.get_proxy(ENTITY)
        exporter = ExcelExporter(self.temp, extra=["source"])
        exporter.write(entity, extra=["test"])
        exporter.finalize()
        workbook = load_workbook(self.temp)
        self.assertListEqual(workbook.sheetnames, ["People"])
        sheet = workbook["People"]
        rows = list(sheet)
        props = exporter.exportable_properties(entity.schema)
        self.assertListEqual(
            [cell.value for cell in rows[0]],
            ["ID", "source"] + [prop.label for prop in props],
        )
        self.assertListEqual(
            [cell.value for cell in rows[1][:3]], ["person", "test", "Ralph Tester"]
        )

    def test_excel_bytesio(self):
        entity = model.get_proxy(ENTITY)
        exporter = ExcelExporter(self.temp, extra=["source"])
        exporter.write(entity, extra=["test"])
        buffer = exporter.get_bytesio()
        assert len(buffer.getvalue()) > 100
