from app.extensions import db
from app.models import HeartTransaction, HeartRule


class HeartService:
    @staticmethod
    def credit(employee_id, rule_code, source_type, source_id, units=1, description=None):
        rule = HeartRule.query.filter_by(code=rule_code, is_active=True).first()
        if not rule:
            return None

        existing = HeartTransaction.query.filter_by(
            employee_id=employee_id,
            source_type=source_type,
            source_id=source_id,
            rule_id=rule.id,
        ).first()
        if existing:
            return existing

        hearts = rule.hearts if rule.calculation_type == "FIXED" else int(units * rule.hearts)
        tx = HeartTransaction(
            employee_id=employee_id,
            rule_id=rule.id,
            source_type=source_type,
            source_id=source_id,
            transaction_type="CREDIT",
            hearts=hearts,
            description=description,
        )
        db.session.add(tx)
        db.session.commit()
        return tx
