#!/usr/bin/env python3

"""Reads an iXBRL file on input, and outputs a CSV representation.
The CSV file contains one fact per row.  Columns are created for:
namespace, fact name, fact value, the unit (if applicable), entity,
entity scheme, period start, period end, instant date.  Additional
columns are created for dimensions used, the header row has the dimension
name.
"""

import datetime
from lxml import etree as ET
import sys
import argparse
import csv

from ixbrl_parse.ixbrl import parse

maxwidth=200

parser = argparse.ArgumentParser(
    description=__doc__
)
parser.add_argument('input', metavar='input', nargs=1,
                    help='Input iXBRL file')

# Parse arguments
args = parser.parse_args(sys.argv[1:])

tree = ET.parse(args.input[0])

i = parse(tree)

fields = [
    "namespace", "name", "value", "unit", "entity", "scheme", "start", "end",
    "instant"
]
fieldset = set(fields)
rows = []

for c in i.contexts.values():

    for v in c.values.values():

        row = {
            "namespace": v.name.namespace,
            "name": v.name.localname,
            "value": str(v.to_value().get_value())[:maxwidth],
            "unit": v.to_value().get_unit(),
        }

        if c.entity:
            row["entity"] = c.entity.id
            row["scheme"] = c.entity.scheme

        if c.period:
            row["start"] = c.period.start
            row["end"] = c.period.end

        if c.instant:
            row["instant"] = c.instant.instant

        for dim in c.dimensions:

            d = dim.dimension.localname
            v = dim.value.localname

            if d not in fieldset:
                fields.append(d)
                fieldset.add(d)

            row[d] = v

        rows.append(row)

writer = csv.DictWriter(sys.stdout, fields)
writer.writeheader()

for row in rows:
    writer.writerow(row)

