
    sojI                        d dl mZ d dlmZ d dlmZ  G d d          Z eej        	                                ej
                                                  Z eej        	                                ej                                                  Z eej        	                                ej                                                  Z eej        	                                ej                                                  Z eej        	                                ej                                                  Z eej        	                                ej                                                  Z eej        	                                ej                                                  Z eej        	                                ej                                                   Z! eej"        	                                ej#                                                  Z$ eej%        	                                ej&                                                  Z' eej(        	                                ej)                                                  Z* eej+        	                                ej,                                                  Z-eeeeeeee!e$e'e*e-gZ.dS )    N)IncomeTaxBreakdown)get_value_from_percentagec                       e Zd ZdedefdZededd fd            Zedededee	         fd            Z
ededd fd	            Zeddededd fd            Zedededefd            ZdS )IncomeTaxBracket
min_amount
percentagec                 "    || _         || _        d S )N)r   r   )selfr   r   s      3/app/src/model/enums/income_tax/IncomeTaxBracket.py__init__zIncomeTaxBracket.__init__   s    $$    amountreturnc                 R    t          t                    D ]}| |j        k    r|c S dS )zh
        Get the tax bracket
        :param amount: The amount
        :return: The tax bracket
        N)reversedTAX_BRACKETSr   )r   tax_brackets     r   get_bracketzIncomeTaxBracket.get_bracket   sD     $L11 	# 	#K///"""" 0	# 	#r   starting_amountc           	         g }|}|dk    rt                               |           }t                               |           }t          |j        | z
  |          }|dk    r|}t          ||j                  }|                    t          ||j        t          |                               ||z  }|r|j        nd} |dk    |S )a(  
        Calculate a tax breakdown for the given amount, showing the taxable amounts, tax brackets,
        and tax amounts for
        each tier.

        :param starting_amount: The starting amount
        :param amount: The total amount
        :return: A list of tax breakdown tuples
        r   )
r   r   get_next_bracketminr   r   r   appendr   int)r   r   tax_inforemaining_amountcurrent_bracketnext_brackettaxable_amount
tax_amounts           r   get_tax_breakdownz"IncomeTaxBracket.get_tax_breakdown   s     .0!"".::?KKO+<<_MML !8?!JL\]]N""!12>?C]^^JOO">?3MsS]__   .9ELl551O! ""$ r   c                     t          t                    D ]7\  }}| |j        k    r'	 t          |dz            c S # t          $ r |cY c S w xY w8t          d         S )zr
        Get the next tax bracket
        :param amount: The amount
        :return: The next tax bracket
           )	enumerater   r   
IndexError)r   ir   s      r   r   z!IncomeTaxBracket.get_next_bracket:   s     (55 	' 	'NA{///''A....! ' ' '&&&&&&' 0 Bs   8A	A	r#   levels_downc                     t                               |           }t                              |          }||z
  dk    rt          ||z
           S t          d         S )z
        Get the previous tax bracket
        :param amount: The amount
        :param levels_down: The number of levels down
        :return: The previous tax bracket
        r   )r   r   r   index)r   r(   r   current_bracket_indexs       r   get_previous_bracketz%IncomeTaxBracket.get_previous_bracketK   sV     +66v>> , 2 2? C C ;.!33 5 CDDAr   c                 f    t          d t                              | |          D                       S )z
        Get the tax
        :param starting_amount: The starting amount
        :param amount: The amount
        :return: The tax
        c                     g | ]	}|j         
S  )r    ).0taxs     r   
<listcomp>z,IncomeTaxBracket.get_tax.<locals>.<listcomp>e   s    cccS^cccr   )sumr   r!   )r   r   s     r   get_taxzIncomeTaxBracket.get_tax\   s9     cc'7'I'I/[a'b'bccc
 
 	
r   N)r#   )__name__
__module____qualname__r   floatr   staticmethodr   listr   r!   r   r,   r4   r/   r   r   r   r      s@       %3 %E % % % % 	#C 	#$6 	# 	# 	# \	#  3    EW@X       \ D    );       \    S s CU    \  	
 	
c 	
c 	
 	
 	
 \	
 	
 	
r   r   )/resources.EnvironmentEnvironmentEnv-src.model.enums.income_tax.IncomeTaxBreakdownr   src.utils.math_utilsr   r   TAX_BRACKET_0_TOTAL_BOUNTYget_intTAX_BRACKET_0_PERCENTAGE	get_floatTAX_BRACKET_0TAX_BRACKET_1_TOTAL_BOUNTYTAX_BRACKET_1_PERCENTAGETAX_BRACKET_1TAX_BRACKET_2_TOTAL_BOUNTYTAX_BRACKET_2_PERCENTAGETAX_BRACKET_2TAX_BRACKET_3_TOTAL_BOUNTYTAX_BRACKET_3_PERCENTAGETAX_BRACKET_3TAX_BRACKET_4_TOTAL_BOUNTYTAX_BRACKET_4_PERCENTAGETAX_BRACKET_4TAX_BRACKET_5_TOTAL_BOUNTYTAX_BRACKET_5_PERCENTAGETAX_BRACKET_5TAX_BRACKET_6_TOTAL_BOUNTYTAX_BRACKET_6_PERCENTAGETAX_BRACKET_6TAX_BRACKET_7_TOTAL_BOUNTYTAX_BRACKET_7_PERCENTAGETAX_BRACKET_7TAX_BRACKET_8_TOTAL_BOUNTYTAX_BRACKET_8_PERCENTAGETAX_BRACKET_8TAX_BRACKET_9_TOTAL_BOUNTYTAX_BRACKET_9_PERCENTAGETAX_BRACKET_9TAX_BRACKET_10_TOTAL_BOUNTYTAX_BRACKET_10_PERCENTAGETAX_BRACKET_10TAX_BRACKET_11_TOTAL_BOUNTYTAX_BRACKET_11_PERCENTAGETAX_BRACKET_11r   r/   r   r   <module>rf      s1   # # # # # # L L L L L L : : : : : :`
 `
 `
 `
 `
 `
 `
 `
H ! "**,,c.J.T.T.V.V  ! "**,,c.J.T.T.V.V  ! "**,,c.J.T.T.V.V  ! "**,,c.J.T.T.V.V  ! "**,,c.J.T.T.V.V  ! "**,,c.J.T.T.V.V  ! "**,,c.J.T.T.V.V  ! "**,,c.J.T.T.V.V  ! "**,,c.J.T.T.V.V  ! "**,,c.J.T.T.V.V  "!#++--s/L/V/V/X/X  "!#++--s/L/V/V/X/X 
 r   