# =======================
# FIXED INTEREST INCOME REPORT - Added to fix missing function
# =======================

@login_required
def enhanced_interest_income_report(request):
    """Enhanced interest income report with interactive charts and analytics"""
    selected_branch_id = request.session.get('selected_branch_id')
    
    # Get filter parameters
    period = request.GET.get('period', 'current_month')
    start_date = request.GET.get('start_date')
    end_date = request.GET.get('end_date')
    
    # Convert string dates to date objects if provided
    if start_date:
        try:
            start_date = datetime.strptime(start_date, '%Y-%m-%d').date()
        except ValueError:
            start_date = None
    
    if end_date:
        try:
            end_date = datetime.strptime(end_date, '%Y-%m-%d').date()
        except ValueError:
            end_date = None
    
    try:
        # Get interest income data with enhanced structure - EXCLUDE rolled-over loans
        loans_qs = Loan.objects.filter(status='active').exclude(
            status='rolled_over'
        ).exclude(
            is_rolled_over=True
        ).select_related('borrower', 'application', 'application__loan_product')
        
        if selected_branch_id:
            loans_qs = loans_qs.filter(borrower__branch_id=selected_branch_id)
        
        # Calculate interest income
        total_interest = Decimal('0.00')
        total_loans = 0
        loans_data = []
        interest_rates = []
        
        for loan in loans_qs:
            # Get actual interest rate from loan product
            try:
                interest_rate = float(loan.get_display_interest_rate())
                interest_rates.append(interest_rate)
            except:
                interest_rate = 15.0  # Fallback
            
            # Calculate interest using stored values
            principal = loan.principal_amount or Decimal('0.00')
            interest_earned = loan.interest_amount
            processing_fee = loan.processing_fee
            
            # Calculate outstanding interest (portion of interest not yet paid)
            total_loan_amount = loan.total_amount
            amount_paid = loan.amount_paid or Decimal('0.00')
            
            # Calculate what portion is interest in outstanding amount
            if total_loan_amount > 0:
                interest_portion = interest_earned / total_loan_amount
                outstanding_balance = total_loan_amount - amount_paid
                outstanding_interest = max(Decimal('0.00'), outstanding_balance * interest_portion)
            else:
                outstanding_interest = Decimal('0.00')
            
            total_interest += interest_earned
            total_loans += 1
            
            # Get loan product name
            product_name = 'Standard Loan'
            try:
                if hasattr(loan, 'application') and loan.application and loan.application.loan_product:
                    product_name = loan.application.loan_product.name
            except:
                pass
            
            # Get loan term and repayment frequency
            try:
                duration_days = loan.duration_days
                # Convert days to months for display
                duration_months = max(1, round(duration_days / 30))
                repayment_method = loan.repayment_method if hasattr(loan, 'repayment_method') else 'monthly'
                payment_frequency = dict([
                    ('daily', 'Daily'),
                    ('weekly', 'Weekly'),
                    ('monthly', 'Monthly')
                ]).get(repayment_method, 'Monthly')
            except:
                duration_months = 1
                payment_frequency = 'Monthly'
            
            loans_data.append({
                'id': loan.id,
                'loan_number': loan.loan_number or f'LOAN-{loan.id}',
                'borrower_name': f"{loan.borrower.first_name} {loan.borrower.last_name}",
                'borrower_phone': loan.borrower.phone_number,
                'product_name': product_name,
                'principal_amount': principal,
                'interest_rate': interest_rate,
                'interest_earned': interest_earned,
                'outstanding_interest': outstanding_interest,
                'loan_term': duration_months,
                'term_unit': 'months',
                'payment_frequency': payment_frequency,
                'status': loan.status,
            })
        
        # Calculate average interest rate from actual loans
        avg_rate = sum(interest_rates) / len(interest_rates) if interest_rates else 0.0
        
        # Calculate portfolio yield
        total_principal = loans_qs.aggregate(total=Sum('principal_amount'))['total'] or Decimal('1.00')
        portfolio_yield = (total_interest / total_principal) * 100 if total_principal > 0 else 0
        
        report_data = {
            'summary': {
                'total_interest_income': total_interest,
                'total_loans': total_loans,
                'average_interest_rate': avg_rate,
                'portfolio_yield': float(portfolio_yield),
                'projected_monthly_income': total_interest / 12 if total_interest > 0 else Decimal('0.00'),
                'interest_collected': sum([loan.amount_paid or Decimal('0.00') for loan in loans_qs]) - total_principal,
                'interest_outstanding': sum([loan['outstanding_interest'] for loan in loans_data]),
                'collection_rate': 80.0,  # This would need actual calculation
                'growth_rate': 0.0,
                'highest_earning': max([loan['interest_earned'] for loan in loans_data]) if loans_data else Decimal('0.00'),
                'top_product': loans_data[0]['product_name'] if loans_data else 'N/A',
                'simple_interest': total_interest,  # All simple interest in this system
                'compound_interest': Decimal('0.00'),
                'compound_loans': 0,
                'compound_income': Decimal('0.00'),
                'effective_rate': avg_rate,
            },
            'rate_distribution': {
                'low_rate_count': len([l for l in loans_data if l['interest_rate'] < 15]),
                'medium_rate_count': len([l for l in loans_data if 15 <= l['interest_rate'] <= 25]),
                'high_rate_count': len([l for l in loans_data if l['interest_rate'] > 25]),
                'low_rate_income': sum([l['interest_earned'] for l in loans_data if l['interest_rate'] < 15], Decimal('0.00')),
                'medium_rate_income': sum([l['interest_earned'] for l in loans_data if 15 <= l['interest_rate'] <= 25], Decimal('0.00')),
                'high_rate_income': sum([l['interest_earned'] for l in loans_data if l['interest_rate'] > 25], Decimal('0.00')),
            },
            'loans': loans_data,
            'product_breakdown': {
                'labels': ['Standard Loan'],
                'amounts': [float(total_interest)],
            }
        }
        
        # Get trend data for charts
        trend_data = {
            'labels': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
            'amounts': [0, 0, 0, 0, 0, float(total_interest)],
        }
        
        context = {
            'report_data': report_data,
            'trend_data': trend_data,
            'selected_period': period,
            'start_date': start_date,
            'end_date': end_date,
            'title': 'Interest Income Report',
            'page_title': 'Interest Income Analytics',
        }
        
        return render(request, 'reports/enhanced_interest_income_report.html', context)
        
    except Exception as e:
        messages.error(request, f'Error loading interest income report: {str(e)}')
        return redirect('reports:reports_dashboard')
