//
//  RibInterfaceController.java
//  Structure
//
//  Created by Luc-Henri Barthélémy on Tue Jan 09 2007.
//  Copyright (c) 2001 __MyCompanyName__. All rights reserved.
//

package Structure.client;

import com.webobjects.foundation.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoapplication.*;
import com.webobjects.eointerface.*;
import com.webobjects.eointerface.swing.*;
import javax.swing.*;
import java.awt.*;

public class RibInterfaceController extends EOInterfaceController {
	//EODisplayGroup mainDG;
	//public EODisplayGroup displayGroup;
	public EODisplayGroup banqueDG, modPaieDG, fournisDG, masterDG,ribDG;
	public EOFrame choixBanquePanel;
	public JButton choixButton;
	public EOInterfaceController senderIC;
	public JFrame displayListe;
	
    public RibInterfaceController() {
        super();
    }

    public RibInterfaceController(EOEditingContext substitutionEditingContext) {
        super(substitutionEditingContext);
    }
	
    public RibInterfaceController(EOEditingContext substitutionEditingContext, EOInterfaceController sender) {
        super(substitutionEditingContext);
		senderIC = sender;
    }
	
	/**
    public RibInterfaceController(EOEditingContext substitutionEditingContext, EODisplayGroup sendDG) {
        super(substitutionEditingContext);
		mainDG = sendDG;
    }
	**/
	
	
	public void connectionWasEstablished()
	{
		// revoir pour genericite
		modPaieDG.fetch();
		ClicAndCloseButtonController myCAndC = new ClicAndCloseButtonController(choixButton);
	}
	
	public void establishConnection(EODisplayGroup senderDG)
	{
		establishConnection();
		masterDG = senderDG;
		
		//
		// on trie les enregistrements fournisseur par date de mise à jour
		// le plus recent est affiche par defaut
		//
		displayGroup().setSortOrderings(new NSMutableArray(EOSortOrdering.sortOrderingWithKey("dModification",EOSortOrdering.CompareDescending)));
		
		//
		// tests sur disabled de masse
		//
		// ca marche
		//
		//_setEnabledAspect(ribDG,"alwaysDisabled");
		
		
		//displayGroup().setDataSource(senderDG.dataSource());
		//initEOAssociation(senderDG);
		//displayGroup().fetch();
		//displayGroup().redisplay();
	}
	
	public void setObjects(NSArray sendObjects)
	{
		//NSLog.debug.appendln("nb objets RIB " + sendObjects.count());
			displayGroup().setObjectArray(sendObjects);
			_notify_associations(controllerDisplayGroup());
	}

	
	
	//
	// finalement je ne
	// l utilise pas
	// (pb de rafraichissement a contourner)
	//
	
	//
	// il vaut mieux
	// faire un setObjects ds le DG principal
	// a partir du nib master
	//
	 public void initEOAssociation (EODisplayGroup senderDG)
	 {
		 EOMasterPeerAssociation masterDetailAssoc;

		 //
		 // la relation StructureUlr FournisUlr
		 // est un to one optionel
		 //
		 // on passe par un to many
		 //
		 // comme le DG principal du sous-nib est obligatoirement de type independant,
		 // avec un EODatabaseDataSource
		 // l association doit etre de type peer
		 //
		 //
		 // on passe le DG du nib maitre de type StructureUlr
		 // on lie le DG du nib fils de type FournisUlr
		 // par la relation fournisseurs
		 //
		 // il n y a cependant qu une occurence max dans ce DG
		 //
		 
		 // pas reussi a binder par ces methodes
		 // un attribut rajoute dans le nib (vers le toOne)
		 // genere a partir du toMany
		 //
		 masterDetailAssoc = new EOMasterPeerAssociation(displayGroup());
		 
		 //
		 //
		 
		 //
		 // la ligne suivante est la seule qui soit
		 // specifique vs une classe InterfaceController deporte
		 // master detail generique
		 //
		 // on pourrait donc factoriser
		 //
		 // j oublie le fetch ds
		 // connectionWasEstablished
		 //
		 
		 masterDetailAssoc.bindAspect("parent",senderDG,"fournisseurs");
		 
		 //
		 
		 masterDetailAssoc.establishConnection();
		 
		 displayGroup().setDelegate(this);
		 
		 
	 }
	
	public void displayGroupDidChangeSelection(EODisplayGroup group)
	{
		
		//NSLog.out.appendln("displayGroupDidChangeSelection Fournisseur");
		//_notify_associations(controllerDisplayGroup());
	}
	
	// petit truc
	// pour envoyer la recherche
	// si retour dans le champ
	// guichet
	//
	
	public void searchBanque()
	{
		banqueDG.qualifyDataSource();
	}
	
	//
	// methodes du controller DG
	//
	public void choixBanque()
	{
		if(!UserInfo.useModal())
		{
		EOFrameController myLoadMessage = MessagesInterfaceController.initMessage("Chargement des Banques","Veuillez Patienter : Chargement en cours ...","Dictionnaire des Banques");
		//banqueDG.fetch();
		myLoadMessage.makeInvisible();

		choixBanquePanel.setVisible(true);
		}
		else
		{
			initChoixModal(choixBanquePanel,"Dictionnaire des Banques");
		}
		
	}
	
	public void addFournisseur()
	{

		//System.out.println("addFournisseur !");
		//
		// le fournisseur est cree a la volee
		//
		masterDG.insert();
		//
		// la cle  primaire du fournisseur-fils (persId) n est pas celle du pere (Individu ou Structure)
		//
		// on doit dc l affecter a la main
		//
		((STFournisUlr)masterDG.selectedObject()).setPersId((Number)mainObject().valueForKey("persId"));
		
		//
		// on doit inserer ce fournisseur ds l un des deux groupes fournisseur (structures ou individus)
		//
		
		((STFournisUlr)masterDG.selectedObject()).setParentClasseName(mainObject().entityName());
		//System.out.println("Fournisseur Class >>> " + mainObject().entityName());

		save();
	}
	
	protected void saveFailed(Exception exception,
							  boolean showErrorDialog,
							  String saveOperationTitle)
	{
		//
		// on a un pb ici avec une exception a null, journalisation ?
		//
		System.out.println("Fournisseur pb au save ? " + exception.toString());
		super.saveFailed( exception, showErrorDialog, saveOperationTitle);
	}
	
	
	public boolean addFournisseurAllowed()
	{
		//
		// evidemment il faudra revoir les droits (via fonctions)
		//
		// fait dans administrationAllowed()
		//
		
		//if(UserInfo.Agent() != null && (masterDG.selectedObject() == null) && (UserInfo.currentStructure() != null && hasAdresse()))
		
		// le pere peut etre une structure ou un individu
		// ds la cas structure on teste les droits de l utilisateur sur la structure puis l existence des adresses valides
		// ds le cas d un individu isAdministrationAllowed retourne tjrs vrai
		// on se base donc sur les droits generaux de l utilisateur (a preciser enfction de ce qui existe ds Annuaire.app et JefyAdmin)
		//
		
		//
		// toDo : on doit aussi gerer le droit d ajouter ce fournisseur ds le groupe des fournisseurs
		//
		
		//
		// si on a le droit, on rajoute le fournisseur
		// au groupe des fournisseurs valides
		// autrement a celui des fournisseurs en attente de validation
		//
		// a faire ds le validateForInsert de FournisUlr ?
		//
		
		//if(mainObject() != null && (Boolean)mainObject().valueForKey("isAdministrationAllowed") == Boolean.TRUE && UserInfo.Agent() != null && masterDG.selectedObject() == null && hasAdresse() && !(editingContext().hasChanges()))
		if(mainObject() != null && (Boolean)mainObject().valueForKey("isAdministrationAllowed") == Boolean.TRUE && UserInfo.isFouCre() && masterDG.selectedObject() == null && hasAdresse() && !(editingContext().hasChanges()))
		{
			//System.out.println("addFournisseurAllowed >>> TRUE");
			 return true;
		}
		else
		{
			//System.out.println("addFournisseurAllowed >>> FALSE");
			return false;
		}
	}
	
	public boolean addRibAllowed()
	{
		//
		// rajouter les droits jefyco ??
		//
		if(mainObject() != null && (Boolean)mainObject().valueForKey("isAdministrationAllowed") == Boolean.TRUE && UserInfo.isFouCre() && masterDG.selectedObject() != null)
			return true;
		else
			return false;
	}
	
	//
	// la structure doit avoir une adresse
	// pro ou de facturation valide
	// pour etre transformee en fournisseur
	//
	public boolean hasAdresse()
	{
		//
		//  une adresse ?
		//
		if(getAdresseFact() != null || getAdressePro() != null)
			return true;
		else
			return false;
	}
	
	public void addRib()
	{
		ribDG.insert();
		//
		// on doit creer un accesseur nom_Fournisseur
		// ds Structure et Individu
		//
		if(mainObject() != null)
		 ((STRibfourUlr)ribDG.selectedObject()).setRibTitco((String)mainObject().valueForKey("nomTitulaire"));
	}
	
	public void deleteRib()
	{
		ribDG.deleteSelection();
	}
	
	public void displayListe()
	{
		displayListe.setVisible(true);
	}
	
	public boolean listeAllowed()
	{
		if(displayGroup().allObjects() != null && displayGroup().allObjects().count() > 1)
			return true;
		else
			return false;
	}
	
	
	public EOGenericRecord mainObject()
	{
		//
		// de tps en tps on plante ici alors ...
		//
		
		try
	{
		if(senderIC != null && senderIC.displayGroup() != null && senderIC.displayGroup().selectedObject()!=null)
		{
			return 	(EOGenericRecord)senderIC.displayGroup().selectedObject();
		}
	}
		
		catch (Exception exception) {
			System.out.println("Impossible de selectionner un mainObject ds RibInterfaceController " + exception.toString());
		}
		return null;
	}
	
	//
	// ces methodes st generiques
	// car le fournisseur peut etre
	// un individu ou une structure
	//
	public Number getAdresseFact()
	{
		Number adrNumber;
		NSArray repartAdresses = null;
		// modif pour ne pas se retaper un fetch
		//repartAdresses = STRepartPersonneAdresse.AdressesDeType(editingContext(),UserInfo.currentStructure().persId(), "FACT", true);
		if(mainObject() != null)
			//repartAdresses = UserInfo.currentStructure().repartAdressesFactValides();
			repartAdresses = (NSArray)mainObject().valueForKey("repartAdressesFactValides");
		if(repartAdresses!= null && repartAdresses.count()>0)
		{
			//System.out.println("adresse facturation trouvee ");
			return ((STRepartPersonneAdresse)repartAdresses.objectAtIndex(0)).adrOrdre();
		}
		else
		{
			//System.out.println("adresse facturation NON trouvee ");
			return null;
		}
	}
	
	public Number getAdressePro()
	{
		Number adrNumber;
		NSArray repartAdresses=null;
		// modif pour ne pas se retaper un fetch
		//repartAdresses = STRepartPersonneAdresse.AdressesDeType(editingContext(),UserInfo.currentStructure().persId(), "PRO", true);
		if(mainObject() != null)
			//repartAdresses = (NSArray)((EOGenericRecord)senderIC.displayGroup().selectedObject()).valueForKey("repartAdressesProValides");
			repartAdresses = (NSArray)mainObject().valueForKey("repartAdressesProValides");
		//repartAdresses = UserInfo.currentStructure().repartAdressesProValides();
		if(repartAdresses!= null && repartAdresses.count()>0)
		{
			//System.out.println("adresse professionnelle trouvee ");
			return ((STRepartPersonneAdresse)repartAdresses.objectAtIndex(0)).adrOrdre();
		}
		else
		{
			//System.out.println("adresse professionnelle NON trouvee ");
			return null;
		}
	}
	
	//
	// on cree des dialogues modaux ds le meme nib
	//
	
	public void initChoixModal(JFrame myPanel,String title)
	{
		JDialog myDialog = new JDialog((Frame)null,title,true);
		myDialog.setContentPane(myPanel.getContentPane());
		myDialog.pack();
		//panelSetLoc(myDialog,component());
		//mainWD.setVisible(true);
		//if(mainWD.isVisible())
		panelSetLoc(myDialog,component());
		//else
		//panelSetLoc(myDialog,component());
		
		myDialog.setVisible(true);
		
	}
	//
	// on positionne le panel des individus
	// a droite de la fenetre base
	//
	public void panelSetLoc(JDialog myFrame, Component base)
	{
		Point loc;
		//
		// parfois la fenetre principale
		// n est pas le component
		//
		// si base n est pas visible (StructureEditor par ex)
		// on se base sur le component()
		//
		
		try
		{
			if(base.isVisible())
				loc = base.getLocationOnScreen();
			else
				loc = component().getLocationOnScreen();
		}
		catch (Exception exception) {
			System.out.println("Impossible de localiser la fenetre de reference" + exception.toString());
			myFrame.setLocationRelativeTo((Component)null);
			return;		
			
		}
		
		int j = (int)((loc.getX())+base.getSize().getWidth()/1.5);
		//int k = (int)((mainTabView.getSize().getHeight()  + loc.getY()/2D));
		int k = (int)( loc.getY());
		if(j < 0)
			j = 0;
		if(k < 0)
			k = 0;
		myFrame.setLocation(j, k);
	}
	
	//
	// Ce truc sert a rafraichir les champs
	//
	// a passer avec la methode suivante ds une super classe
	// commune a ts les interfaceControllers
	//
	protected void _notify_associations (EODisplayGroup  
										 a_display_group) {
		java.util.Enumeration en = a_display_group.observingAssociations ().objectEnumerator();
		while (en.hasMoreElements ()) {
			EOAssociation myAss = (EOAssociation)en.nextElement();
			myAss.subjectChanged ();
		}
		//a_display_group.redisplay();
		a_display_group.updateDisplayedObjects();
	}
	
	//
	// Ce truc sert a affecter une methode enable-disable par defaut a toutes
	// les associations d un DG
	//
	// on est pas oblige de binder a la main vers la meme methode
	// tous les objets editable de l interface
	//
	protected void _setEnabledAspect (EODisplayGroup  
										 a_display_group, String aspect) {
		java.util.Enumeration en = a_display_group.observingAssociations().objectEnumerator();
		while (en.hasMoreElements ()) {
			EOAssociation myAss = (EOAssociation)en.nextElement();
			//
			// important on ne peut binder qu une EOAssociation non connectee
			//
			myAss.breakConnection();
			//
			// bonne nouvelle, on a pas perdu les autres binds
			//
			
			//
			// en cas de generalisation de cette methode
			// introduire un try-catch
			//
			myAss.bindAspect(EOAssociation.EnabledAspect,controllerDisplayGroup(),aspect);
			
			//
			
			myAss.establishConnection();
			
			myAss.subjectChanged ();
		}

		a_display_group.updateDisplayedObjects();
	}
	
	
}
