from dataclasses import dataclass
from typing import Dict, Any, List
import config
from models import Receipt, Transaction

@dataclass
class AIRule:
    name: str
    condition: str
    action: str
    source: str
    status: str = "active"

class AIRulesEngine:
    def __init__(self):
        self.rules: List[AIRule] = []
        self._load_default_rules()
    
    def _load_default_rules(self):
        self.rules = [
            AIRule("exact_amount_match", "amount_diff <= 0.01", "auto_approve", "system"),
            AIRule("same_vendor_same_date", "vendor_match and date_diff <= 1", "high_confidence", "system"),
            AIRule("gas_station_pattern", "vendor contains 'gas' or 'fuel'", "categorize_transport", "system")
        ]
    
    def apply_rules(self, receipt: Receipt, transaction: Transaction) -> Dict[str, Any]:
        results = {"auto_approve": False, "confidence_boost": 0, "category": None}
        
        for rule in self.rules:
            if rule.status != "active":
                continue
                
            if self._evaluate_condition(rule.condition, receipt, transaction):
                self._execute_action(rule.action, results, receipt, transaction)
        
        return results
    
    def _evaluate_condition(self, condition: str, receipt: Receipt, transaction: Transaction) -> bool:
        amount_diff = abs(receipt.amount - transaction.amount)
        date_diff = abs((receipt.receipt_date - transaction.transaction_date).days)
        vendor_match = receipt.vendor.lower() in transaction.vendor.lower() or transaction.vendor.lower() in receipt.vendor.lower()
        
        return eval(condition, {
            "amount_diff": amount_diff,
            "date_diff": date_diff,
            "vendor_match": vendor_match,
            "receipt": receipt,
            "transaction": transaction
        })
    
    def _execute_action(self, action: str, results: Dict[str, Any], receipt: Receipt, transaction: Transaction):
        if action == "auto_approve":
            results["auto_approve"] = True
        elif action == "high_confidence":
            results["confidence_boost"] += 0.2
        elif action == "categorize_transport":
            results["category"] = "Transportation"
    
    def add_rule(self, rule: AIRule):
        self.rules.append(rule)
    
    def remove_rule(self, rule_name: str):
        self.rules = [r for r in self.rules if r.name != rule_name] 