"""
Consistent amount transaction analysis module.
"""

import pandas as pd
from .config import MODEL_CONFIG

class ConsistentAmountAnalyzer:
    def __init__(self, df):
        self.df = df
        self.const_df = None

    def calculate_coefficient_of_variation(self, group):
        """Calculate coefficient of variation for a group of transactions."""
        amounts = group[group['initiated_by'] == 'C']['amount']
        mean = amounts.mean()
        std = amounts.std(ddof=0)

        if mean == 0:
            return float('nan')
        return std / mean

    def flag_consistent_amounts(self, group, cv_threshold=None):
        """Flag accounts with low variance in transaction amounts."""
        if cv_threshold is None:
            cv_threshold = MODEL_CONFIG['cv_threshold']

        filtered_group = group[group['initiated_by'] == 'C']
        cv = self.calculate_coefficient_of_variation(filtered_group)
        is_consistent = cv <= cv_threshold if not pd.isna(cv) else False

        return pd.Series(
            [is_consistent] * len(group),
            index=group.index,
            name='is_consistent_amount'
        )

    def identify_consistent_amount_accounts(self, cv_threshold=None):
        """Identify accounts with consistent transaction amounts."""
        if cv_threshold is None:
            cv_threshold = MODEL_CONFIG['cv_threshold']

        # Create a copy of the original DataFrame
        self.const_df = self.df.copy()
        
        # Calculate consistent amount flags
        consistent_flags = self.const_df.groupby('accountid').apply(
            lambda group: self.flag_consistent_amounts(group, cv_threshold)
        ).reset_index(level=0, drop=True)
        
        # Add the flags to the original DataFrame
        self.const_df['is_consistent_amount'] = consistent_flags
        
        return self.const_df

    def get_consistent_amount_data(self):
        """Get transactions identified as having consistent amounts."""
        if self.const_df is None:
            self.identify_consistent_amount_accounts()
        
        return self.const_df[
            (self.const_df['is_consistent_amount']) &
            (self.const_df['initiated_by'] == 'C')
        ] 