/***********************************************************************************************************
 * Name         : DmlUtils
 * Purpose      : Utility class for DML operations
 **********************************************************************************************************/
public with sharing class DmlUtils {
    public static String DELETE_FROM_SNOWFLAKE_FIELD = 'Delete_From_Snowflake__c';

    /**
     * @description Flags records to be deleted in Snowflake
     * @param List<SObject>  records to be flagged
     */
    public static Database.SaveResult[] flagRecordsForDeletion(List<SObject> sObjects) {
        for (SObject sObj : sObjects) {
            sObj.put(DmlUtils.DELETE_FROM_SNOWFLAKE_FIELD, true);
        }
        return Database.update(sObjects, false);
    }

    /**
     * @description Deletes records that are flagged to be deleted in Snowflake
     * @param List<SObject>  records to be analyzed
     */
    public static void deleteRecords(List<SObject> sObjects) {
        List<SObject> sObjsToDelete = new List<SObject>();
        for (SObject sObj : sObjects) {
            if (
                sObj.isSet(DmlUtils.DELETE_FROM_SNOWFLAKE_FIELD) &&
                Boolean.valueOf(sObj.get(DmlUtils.DELETE_FROM_SNOWFLAKE_FIELD))
            ) {
                sObjsToDelete.add(sObj.Id.getSobjectType().newSObject(sObj.Id));
            }
        }
        delete sObjsToDelete;
    }
}
