package siprp.higiene.gestao.normalizacao;

import static com.evolute.utils.strings.UnicodeLatin1Map.atilde;
import static com.evolute.utils.strings.UnicodeLatin1Map.ccedil;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

import leaf.ui.LeafDialog;
import leaf.ui.TreeInserterDialog;
import leaf.ui.TreeTools;
import siprp.database.cayenne.objects.Empresas;
import siprp.database.cayenne.objects.Estabelecimentos;
import siprp.database.cayenne.objects.HsNormalizacao;
import siprp.database.cayenne.objects.HsNormalizacaoEmpresa;
import siprp.database.cayenne.objects.HsNormalizacaoEstabelecimento;
import siprp.higiene.gestao.AdicionarPanel;
import siprp.logic.HigieneSegurancaLogic;

public class AdicionarNormalizacaoPanel extends AdicionarPanel
{

	private static final long serialVersionUID = 1L;
	
	private Empresas empresa = null;
	
	private Estabelecimentos estabelecimento = null;

	public void setEmpresa( Empresas empresa )
	{
		this.empresa = empresa;
		this.estabelecimento = null;
		refresh();
		setEnabled();
	}
	
	public void setEstabelecimento( Estabelecimentos estabelecimento )
	{
		this.empresa = null;
		this.estabelecimento = estabelecimento;
		refresh();
		setEnabled();
	}

	@Override
	protected void add()
	{
		DefaultMutableTreeNode allNormalizacao = getAllNormalizacao();
		removeCurrent( allNormalizacao );
		TreeInserterDialog dialog = new TreeInserterDialog( "Adicionar Normaliza" + ccedil + atilde + "o", allNormalizacao );
		DefaultMutableTreeNode result = dialog.getResult();
		if( result != null )
		{
			addResult( result );
			refresh();
		}
		setEnabled();
	}
	
	private DefaultMutableTreeNode getAllNormalizacao()
	{
		DefaultMutableTreeNode result = new DefaultMutableTreeNode();
		if( empresa != null )
		{
			result = HigieneSegurancaLogic.getNormalizacaoTreeForEmpresa( null );
		}
		else if( estabelecimento != null )
		{
			result = HigieneSegurancaLogic.getNormalizacaoTreeForEmpresa( estabelecimento.getToEmpresas() );
		}
		return result;
	}
	
	private void removeCurrent( DefaultMutableTreeNode all )
	{
		if( all != null && root.getChildCount() == 2 && all.getChildCount() == 2 )
		{
			DefaultMutableTreeNode portuguesaAll = (DefaultMutableTreeNode) all.getChildAt( 0 );
			DefaultMutableTreeNode internacionalAll = (DefaultMutableTreeNode) all.getChildAt( 1 );
			DefaultMutableTreeNode portuguesaCurrent = (DefaultMutableTreeNode) root.getChildAt( 0 );
			DefaultMutableTreeNode internacionalCurrent = (DefaultMutableTreeNode) root.getChildAt( 1 );
			TreeTools.remove( portuguesaAll, portuguesaCurrent );
			TreeTools.remove( internacionalAll, internacionalCurrent );
		}
		setEnabled();
	}
	
	private void addResult( DefaultMutableTreeNode root )
	{
		try
		{
			if( root != null )
			{
				Object userObject = root.getUserObject();
				if( userObject instanceof HsNormalizacao )
				{
					if( empresa != null )
					{
						HsNormalizacaoEmpresa rel = new HsNormalizacaoEmpresa();
						rel.setToEmpresa( empresa );
						rel.setToHsNormalizacao( ((HsNormalizacao) userObject ) );
						rel.save();
					}
					else if( estabelecimento != null )
					{
						HsNormalizacaoEstabelecimento rel = new HsNormalizacaoEstabelecimento();
						rel.setToEstabelecimento( estabelecimento );
						rel.setToHsNormalizacao( ((HsNormalizacao) userObject ) );
						rel.save();
					}
				}
			}
			for( int i = 0; i < root.getChildCount(); ++i )
			{
				DefaultMutableTreeNode child = (DefaultMutableTreeNode) root.getChildAt( i );
				addResult( child );
			}
		}
		catch( Exception e )
		{
			LeafDialog.error( e );
		}
	}

	@Override
	public void refresh()
	{
		root.removeAllChildren();
		if( empresa != null)
		{
			TreeTools.merge( root, HigieneSegurancaLogic.getNormalizacaoTreeForEmpresa( empresa ) );
		}
		if( estabelecimento != null )
		{
			TreeTools.merge( root, HigieneSegurancaLogic.getNormalizacaoTreeForEstabelecimento( estabelecimento ) );
		}
		TreeTools.refreshTree( tree, root );
	}

	@Override
	protected void setEnabled()
	{
		buttonAdicionar.setEnabled( empresa != null || estabelecimento != null );
		buttonRemover.setEnabled( tree.getSelectionCount() > 0 );
	}

	@Override
	protected void rem()
	{
		try
		{
			TreePath path = tree.getSelectionPath();
			if( path != null )
			{
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
				Object obj = node.getUserObject();
				if( obj != null && (obj instanceof HsNormalizacao) )
				{
					if( empresa != null )
					{
						removeFromEmpresa( ((HsNormalizacao) obj ) );
					}
					else if( estabelecimento != null )
					{
						removeFromEstabelecimento( ((HsNormalizacao) obj ));
					}
					refresh();
				}
			}
		}
		catch( Exception e )
		{
			LeafDialog.error( e );
		}
	}
	
	private void removeFromEmpresa( HsNormalizacao normalizacao ) throws Exception
	{
		if( normalizacao != null && empresa != null && LeafDialog.confirmDelete( false, false, "normaliza" + ccedil + atilde + "o" ) )
		{
			for( HsNormalizacaoEmpresa rel : empresa.getHsNormalizacaoEmpresaArray() )
			{
				if( normalizacao.equals( rel.getToHsNormalizacao() ) )
				{
					rel.delete();
					break;
				}
			}
		}
	}
	
	private void removeFromEstabelecimento( HsNormalizacao normalizacao ) throws Exception
	{
		if( normalizacao != null && estabelecimento != null && LeafDialog.confirmDelete( false, false, "normaliza" + ccedil + atilde + "o" ) )
		{
			for( HsNormalizacaoEstabelecimento rel : estabelecimento.getHsNormalizacaoEstabelecimentoArray() )
			{
				if( normalizacao.equals( rel.getToHsNormalizacao() ) )
				{
					rel.delete();
					break;
				}
			}
			
		}
	}
	
}
