'''6. Revenus de valeurs mobilières et de capitaux mobiliers.'''


from openfisca_tunisia.variables.base import *  # noqa analysis:ignore


class tspr(Variable):
    value_type = float
    entity = FoyerFiscal
    label = 'Traitements, salaires, indemnités, pensions et rentes viagères'
    definition_period = YEAR

    def formula(foyer_fiscal, period):
        revenu_assimile_salaire_apres_abattements = foyer_fiscal(
            'revenu_assimile_salaire_apres_abattements', period = period)
        revenu_assimile_pension_apres_abattements = foyer_fiscal(
            'revenu_assimile_pension_apres_abattements', period = period)

        return revenu_assimile_salaire_apres_abattements + revenu_assimile_pension_apres_abattements


class revenu_assimile_salaire(Variable):
    value_type = float
    entity = FoyerFiscal
    label = 'Revenu assimilé à des salaires'
    definition_period = YEAR

    def formula(foyer_fiscal, period):
        salaire_imposable = foyer_fiscal.declarant_principal('salaire_imposable', period = period, options = [ADD])
        salaire_en_nature = foyer_fiscal.declarant_principal('salaire_en_nature', period = period, options = [ADD])
        return (salaire_imposable + salaire_en_nature)


class smig(Variable):
    value_type = bool
    entity = FoyerFiscal
    label = 'Indicatrice de SMIG ou SMAG déduite du montant des salaires'
    definition_period = YEAR

    def formula(foyer_fiscal, period, parameters):
        revenu_assimile_salaire = foyer_fiscal('revenu_assimile_salaire', period = period)
        salarie_declarant_percevoir_smig = foyer_fiscal.declarant_principal('salarie_declarant_percevoir_smig', period = period.first_month)
        smig_40h_mensuel = parameters(period.start).marche_travail.smig_40h_mensuel
        smig = (
            salarie_declarant_percevoir_smig
            + (revenu_assimile_salaire <= 12 * smig_40h_mensuel)
            )
        return smig


class revenu_assimile_salaire_apres_abattements(Variable):
    value_type = float
    entity = FoyerFiscal
    label = 'Revenu imposé comme des salaires net des abatements'
    definition_period = YEAR

    def formula_2011(foyer_fiscal, period, parameters):
        revenu_assimile_salaire = foyer_fiscal('revenu_assimile_salaire', period = period)
        smig = foyer_fiscal('smig', period = period)
        tspr = parameters(period.start).impot_revenu.tspr
        abattement_frais_professionnels = min_(revenu_assimile_salaire * tspr.abat_sal, tspr.max_abat_sal)
        revenu_assimile_salaire_apres_abattements = max_(
            (
                revenu_assimile_salaire
                - abattement_frais_professionnels
                - max_(
                    smig * tspr.abattement_pour_salaire_minimum,
                    (revenu_assimile_salaire <= tspr.smig_ext) * tspr.abattement_pour_salaire_minimum
                    )
                ),
            0
            )
        return revenu_assimile_salaire_apres_abattements

    def formula(foyer_fiscal, period, parameters):
        revenu_assimile_salaire = foyer_fiscal('revenu_assimile_salaire', period = period)
        smig = foyer_fiscal('smig', period = period)
        tspr = parameters(period.start).impot_revenu.tspr
        abattement_frais_professionnels = min_(revenu_assimile_salaire * tspr.abat_sal, tspr.max_abat_sal)
        revenu_assimile_salaire_apres_abattements = min_(
            revenu_assimile_salaire
            - abattement_frais_professionnels
            - smig * tspr.abattement_pour_salaire_minimum,
            0
            )
        return revenu_assimile_salaire_apres_abattements


class revenu_assimile_pension_apres_abattements(Variable):
    value_type = float
    entity = FoyerFiscal
    label = 'Revenu assimilé à des pensions après abattements'
    definition_period = YEAR

    def formula(foyer_fiscal, period, parameters):
        revenu_assimile_pension = foyer_fiscal.declarant_principal('revenu_assimile_pension', period = period)
        avantages_nature_assimile_pension = foyer_fiscal.declarant_principal(
            'avantages_nature_assimile_pension', period = period)
        tspr = parameters(period.start).impot_revenu.tspr
        return (revenu_assimile_pension + avantages_nature_assimile_pension) * (1 - tspr.abat_pen)
