import com.rameses.rcp.annotations.*
import com.rameses.rcp.common.*
import com.rameses.osiris2.client.*
import com.rameses.osiris2.common.*
import java.rmi.server.*;
import com.rameses.util.*;

public class BusinessOwnerUtil {

    @Service("EntityLookupService")
    def entityLookupSvc;

    @Service("EntityService")
    def entitySvc;


    @Caller
    def caller;

    def orgTypes = LOV.ORG_TYPES;

    def getBusiness() {
        return caller.entity.business;
    }

    def getHandler() {
        caller.binding.refresh("entity.business.owner.*");
    }

    def find = [
        fetchList: { o-> 
            o.type = (business.orgtype == 'SING') ?'INDIVIDUAL':'JURIDICAL'; 
            return entityLookupSvc.getList( o ); 
        },
        onselect: { o->
            business.owner = [ objid:o.objid, name:o.name, address:o.address ];
            if(handler) handler();

            notifyDepends( 'entity.business.owner' ); 
        },
        onempty: {
            business.owner = [ address:[:] ];
            if(handler) handler(); 

            notifyDepends( 'entity.business.owner' ); 
        }
    ] as SuggestModel;
            
    def add() {
        String stype = (business.orgtype=='SING' ? 'entityindividual':'entityjuridical');
        def sh = { o->
            business.owner = [ objid:o.objid, name:o.name, address:o.address ];
            if ( handler ) handler();

            notifyDepends( 'entity.business.owner' ); 
        }
        def m = [:];
        if( business.owner ) {
            m.putAll( business.owner );
        }
        m.objid = null;
        m.entityno = null;

        def opener = InvokerUtil.lookupOpener( stype+":create", [onselect:sh, entity:m] );
        if ( opener ) opener.target = 'popup'; 

        return opener; 
    }  
    
    def show() {
        if( !business.owner?.objid ) throw new Exception("Please select an owner");

        String stype = (business.orgtype=='SING' ? 'entityindividual':'entityjuridical');
        def opener = InvokerUtil.lookupOpener( stype + ":open", [entity: business.owner] ); 
        if ( opener ) opener.target = 'popup'; 

        return opener; 
    }
    
    void verify() {
        if( !business.owner.objid ) 
            throw new Exception("Error in owner. Please map the owner.");
        if( !business.owner.address?.objid)
            throw new Exception("Error in owner address. Please check the address of owner by editing the entity.");

        business.orgtypename = orgTypes.find{ it.key == business.orgtype }?.value;    
    }

    void reset() {;}

    def reload() {
        if(!business.owner.objid) throw new Exception("Please select first an owner");
        def owner = entitySvc.open([objid:business.owner.objid]);
        business.owner = owner;
        caller.binding.refresh("entity.business.owner.*");
    }
       
    def lookupAddress() {
        if( !business.owner?.objid )
            throw new Exception("Business owner not yet mapped");
        def p = [:];
        p.onselect = { o->
            business.owner.address = o;
            caller.binding.refresh();
        };
        p['query.objid'] = business.owner.objid;
        p['query.name'] = business.owner.name;
        return Inv.lookupOpener( "entity_address:lookup", p );
    }
     
    void notifyDepends( String name ) {
        try { 
            caller.binding.notifyDepends( name ); 
        } catch(Throwable t){;} 
    } 
}