from inspect import cleandoc
from io import StringIO

import pandas as pd
from my_wrapper import TaxCalculator
from pandas import DataFrame


def read_table(table: str, delimiter="|") -> DataFrame:
    """
    Read table from string and return pandas DataFrame.
    """
    df = pd.read_table(StringIO(cleandoc(table)), delimiter=delimiter)
    df = df.loc[:, ~df.columns.str.match("Unnamed")]
    df.columns = df.columns.str.strip()
    return df


# ----------------------------------------------------------------------------------------------------------------------
# The Data to process
# ----------------------------------------------------------------------------------------------------------------------
input = read_table(
    """
    | Name     | Income | Children |
    | John     | 75600  | 2        |
    | Bob      | 34000  | 1        |
    | Chloe    | 111500 | 3        |
    | Thomas   | 234546 | 1        |
    | Ellis    | 144865 | 2        |
    | Deane    | 138500 | 4        |
    | Mariella | 69412  | 5        |
    | Carlos   | 65535  | 0        |
    | Toney    | 43642  | 3        |
    | Ramiro   | 117850 | 2        |
    """
)

# ----------------------------------------------------------------------------------------------------------------------
# Tax Rate & Credit rules
# ----------------------------------------------------------------------------------------------------------------------
tax_rates = {
    "Income < 50000": 0.15,  # < 50k: Tax rate is 15 %
    "Income > 50000 and Income < 70000": 0.18,  # 50k to 70k: Tax rate is 18 %
    "Income > 70000 and Income < 100000": 0.2,  # 70k to 100k: Tax rate is 20 %
    "Income > 100000 and Income < 120000": 0.22,  # 100k to 120k: Tax rate is 22 %
    "Income > 120000 and Income < 150000": 0.25,  # 120k to 150k: Tax rate is 25 %
    "Income > 150000": 0.28,  # over 150k: Tax rate is 28 %
}

tax_credits = {
    "Children == 0": 0.0,  # 0 child: Tax credit 0 %
    "Children == 1": 0.02,  # 1 child: Tax credit 2 %
    "Children == 2": 0.04,  # 2 children: Tax credit 4 %
    "Children == 3": 0.06,  # 3 children: Tax credit 6 %
    "Children == 4": 0.08,  # 4 children: Tax credit 8 %
    "Children > 4": 0.1,  # over 4 children: Tax credit 10 %
}

# ----------------------------------------------------------------------------------------------------------------------
# Run the Tax Calculator
# ----------------------------------------------------------------------------------------------------------------------

# Visualize the DAG
TaxCalculator.visualize()

# Calculate the taxes
output = TaxCalculator.calculate(input, tax_rates, tax_credits)
print(output.to_string())
