import com.rameses.rcp.annotations.*;
import com.rameses.rcp.common.*;
import com.rameses.osiris2.common.*;
import com.rameses.osiris2.client.*;
import java.util.*;
import com.rameses.rcp.framework.*;
import com.rameses.seti2.models.*;

public class TaskNotifier implements com.rameses.rcp.framework.NotificationHandler {

    def svc;
    def eventProvider;

    def handler;

    boolean activated;
    def nodes;

    String processName;
    def secProvider = ClientContext.getCurrentContext().getSecurityProvider();

    void activate( processName, handler ) {
        this.processName = processName; 
        this.handler = handler;
        this.svc = InvokerProxy.getInstance().create("NotificationService");

        try {
            eventProvider = ClientContext.currentContext.notificationProvider; 
            eventProvider.add( this );
            activated = true;
            fetchNodes();
        } catch(Throwable e) {
            println "Task Notification service not activated. " + e.message; 
            activated = false;
        }
    }

    void deactivate() { 
        activated = false;
        if ( eventProvider ) { 
            eventProvider.remove(this); 
        } 
    }

    void send( msg ) {
        if ( activated ) {
            try {
                svc.send( msg ); 
            } catch(Throwable e) {
                activated = false;
                println "task notifier error. " + e.message;    
            }
        } else { 
            println "No service provided. " + msg; 
        } 
    }

    void onMessage(Object data) { 
        if ( activated && handler ) { 
            handler( data );
        }
    } 

    void onRead(Object data) {
        //do nothing 
    } 

    public def getNodeList() {
        return nodes;
    }

    public int getCount( def param ) {
        if( !activated) return 0;
        try {
            return svc.getCount( param );
        } catch(Throwable e) {
            activated = false;
            println "task notifier error. " + e.message;   
            return 0;
        }
    }

    public void fetchNodes() {
        if ( !nodes ) { 
            nodes = WorkflowCache.getNodeList( processName ); 
        } 
        nodes.each { 
            if ( it.origtitle==null ) { 
                it.origtitle = it.title; 
            } 
            if( it.domain && it.role ) {
                boolean pass = false;
                try {
                    pass = secProvider.checkPermission( it.domain, it.role, null );
                } catch(Throwable e){;} 

                if( pass) {
                    def icount = getCount([ tag: processName+':'+ it.name ]);
                    if ( icount > 0 ) {
                        it.title = "<html>"+it.origtitle+"&nbsp;&nbsp;<font color=red><b>("+ icount +")</b></font></html>";
                    }
                }
            }
        }
    }
    

}