#! /usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd

from ..common import initData, initMeta
from core import runner, prepareMeta
from flagger.dmpflagger import DmpFlagger, FlagFields


def test_basic():

    flagger = DmpFlagger()
    data = initData()
    var1, var2, *_ = data.columns
    var1mean = data[var1].mean()
    var2mean = data[var2].mean()

    metastring = f"""
    headerout, Flag_1, Flag_2
    {var1},"generic, {{func: this < {var1mean}}}","range, {{min: 10, max: 20, comment: saqc}}"
    {var2},"generic, {{func: this > {var2mean}, cause: error}}"
    """
    meta = initMeta(metastring, data)

    data, flags = runner(meta, flagger, data)

    col1 = data[var1]
    col2 = data[var2]

    flags11 = flags.loc[col1 < var1mean, (var1, FlagFields.FLAG)]
    flags12 = flags.loc[((col1 < 10) | (col1 > 20)), (var1, FlagFields.COMMENT)]

    flags21 = flags.loc[col2 > var2mean, (var2, FlagFields.CAUSE)]

    assert (flags11 >= flagger.flags.min()).all()
    assert (flags12 == "saqc").all()
    assert (flags21 == "error").all()


def test_flagOrder():

    data = initData()
    var, *_ = data.columns

    flagger = DmpFlagger()
    fmin = flagger.flags.min()
    fmax = flagger.flags.max()

    metastring = f"""
    headerout,Flag
    {var},"generic, {{func: this > mean(this), flag: {fmax}}}"
    {var},"generic, {{func: this >= min(this), flag: {fmin}}}"
    """
    meta = initMeta(metastring, data)

    pdata, pflags = runner(meta, flagger, data)

    datacol = pdata[var]
    flagcol = pflags[(var, FlagFields.FLAG)]

    assert (flagcol[datacol > datacol.mean()] == fmax).all()
    assert (flagcol[datacol <= datacol.mean()] == fmin).all()


if __name__ == "__main__":

    test_basic()
    test_flagOrder()