/******************************************************************************
 * The contents of this file are subject to the   Compiere License  Version 1.1
 * ("License"); You may not use this file except in compliance with the License
 * You may obtain a copy of the License at http://www.compiere.org/license.html
 * Software distributed under the License is distributed on an  "AS IS"  basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 * the specific language governing rights and limitations under the License.
 * The Original Code is             Compiere  ERP & CRM Smart Business Solution
 * The Initial Developer of the Original Code is Jorg Janke  and ComPiere, Inc.
 * Portions created by Jorg Janke are Copyright (C) 1999-2003 Jorg Janke, parts
 * created by ComPiere are Copyright (C) ComPiere, Inc.;   All Rights Reserved.
 * Contributor(s): ______________________________________.
 *****************************************************************************/
package org.compiere.model;

import java.sql.ResultSet;
import java.util.Properties;
import java.util.logging.Level;

import org.compiere.util.CLogger;

/**
 *  Asset Change Model (to record changes to asset)
 *	@author Teo Sarca, SC ARHIPAC SERVICE SRL
 *
 */
public class MAssetChange extends X_A_Asset_Change
{
	/**
	 * generated serial id
	 */
	private static final long serialVersionUID = 4083373951793617528L;

	/**	Static Logger */
	private static CLogger s_log = CLogger.getCLogger(MAssetChange.class);
	
    /**
     * UUID based Constructor
     * @param ctx  Context
     * @param A_Asset_Change_UU  UUID key
     * @param trxName Transaction
     */
    public MAssetChange(Properties ctx, String A_Asset_Change_UU, String trxName) {
        super(ctx, A_Asset_Change_UU, trxName);
    }

	/**
	 * 	Default Constructor
	 *	@param ctx context
	 *  @param A_Asset_Change_ID
	 *  @param trxName
	 */
	public MAssetChange (Properties ctx, int A_Asset_Change_ID, String trxName)
	{
		super (ctx, A_Asset_Change_ID, trxName);
	}	//	MAssetChange
	
	/**
	 * 	Load Constructor
	 *	@param ctx context
	 *	@param rs result set
	 */
	public MAssetChange (Properties ctx, ResultSet rs, String trxName)
	{
		super (ctx, rs, trxName);
	}	//	MInventoryLine

	@Override
	protected boolean beforeSave (boolean newRecord)
	{
		String textDetails = getTextDetails();
		if (textDetails == null || textDetails.length() == 0) {
			setTextDetails(MRefList.getListDescription (getCtx(),"A_Update_Type" , getChangeType()));
		}
		return true;
	}	//	beforeSave

	/**
	 * Create and save new MAssetChange record
	 * @param assetAdd
	 * @param assetwk
	 * @return MAssetChange
	 */
	public static MAssetChange createAddition(MAssetAddition assetAdd, MDepreciationWorkfile assetwk) {
		MAssetChange change = new MAssetChange (assetAdd.getCtx(), 0, assetAdd.get_TrxName());
		change.setAD_Org_ID(assetAdd.getAD_Org_ID()); //@win added
		change.setA_Asset_ID(assetAdd.getA_Asset_ID());
		change.setA_QTY_Current(assetAdd.getA_QTY_Current());
		change.setChangeType("ADD");
		change.setTextDetails(MRefList.getListDescription (assetAdd.getCtx(),"A_Update_Type" , "ADD"));
		change.setPostingType(assetwk.getPostingType());
		change.setAssetValueAmt(assetAdd.getAssetValueAmt());
		change.setA_QTY_Current(assetAdd.getA_QTY_Current());	            
		change.saveEx();
		
		return change;
	}
	
	/**
	 * @param ctx
	 * @param changeType
	 * @param pos
	 * @param trxName
	 * @return MAssetChange
	 */
	public static MAssetChange create(Properties ctx, String changeType, PO[] pos, String trxName) {
		return create(ctx, changeType, pos, false, trxName);
	}
	
	/**
	 * TODO
	 * @param ctx
	 * @param changeType
	 * @param pos
	 * @param trxName
	 * @return
	 */
	public static MAssetChange createAndSave(Properties ctx, String changeType, PO[] pos, String trxName) {
		return null;
	}
	
	/**
	 * 
	 * @param ctx
	 * @param changeType
	 * @param pos
	 * @param save
	 * @param trxName
	 * @return MAssetChange
	 */
	public static MAssetChange create(Properties ctx, String changeType, PO[] pos, boolean save, String trxName) {
		if (s_log.isLoggable(Level.FINE)) s_log.fine("Entering: changeType=" + changeType);
		if (pos == null || pos.length == 0) {
			s_log.fine("Entering/Leaving: POs is empty");
			return null;
		}
		MAssetChange change = new MAssetChange (ctx, 0, trxName);
		change.setChangeType(changeType);
		for (PO po : pos) {
			change.addChanges(po);
		}
		if (save) {
			change.saveEx();
		}
		//
		if (s_log.isLoggable(Level.FINE)) s_log.fine("Leaving: change=" + change);
		return change;
	}
	
	/**
	 * TODO
	 * @param po
	 */
	public void addChanges(PO po) {
		if (log.isLoggable(Level.FINE)) log.fine("Entering: po=" + po);
		if (po == null) {
			return;
		}
		//
		if (log.isLoggable(Level.FINE)) log.fine("Leaving: po=" + po);
	}
	
	/**
	 * @param ctx
	 * @param A_Asset_ID
	 * @param changeType
	 * @param trxName
	 * @param C_AcctSchema_ID
	 * @return MAssetChange
	 */
	public static MAssetChange get (Properties ctx, int A_Asset_ID, String changeType,  String trxName, int C_AcctSchema_ID)
	{
		if (A_Asset_ID <= 0 || changeType == null)
		{
			return null;
		}
		
	
		final String whereClause = COLUMNNAME_A_Asset_ID+"=? AND "
								  +COLUMNNAME_ChangeType+"=? AND " 
								  +COLUMNNAME_C_AcctSchema_ID + "=?" ;

		
		MAssetChange ac = new Query(ctx, MAssetChange.Table_Name, whereClause, trxName)
				.setParameters(new Object[]{A_Asset_ID, changeType,C_AcctSchema_ID})
				.firstOnly();
		
		
	
		return ac;
	}
}	//	MAssetChange