package jp.ossc.petstore.peer.impl;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import jp.ossc.petstore.common.Cart;
import jp.ossc.petstore.common.CartItem;
import jp.ossc.petstore.dto.BaseDTO;
import jp.ossc.petstore.dto.peerdto.OrderPeerDTO;
import jp.ossc.petstore.dto.functiondto.CustomerFunctionDTO;
import jp.ossc.petstore.dto.functiondto.ProductFunctionDTO;
import jp.ossc.petstore.dto.functiondto.OrderFunctionDTO;
import jp.ossc.petstore.peer.IPeer;
import jp.ossc.petstore.peer.impl.BasePeer;
import jp.ossc.petstore.function.IOrderFunction;
import jp.ossc.petstore.function.ICustomerFunction;
import jp.ossc.petstore.function.IProductFunction;
import jp.ossc.petstore.OpenstandiaConst;

/**
 * 注文peerクラス
 * @author ossc
 * @version $Revision: 1.2 $
 */
public class OrderPeer extends BasePeer implements IPeer {

	/**
	 * ログ
	 */
	private static final Log LOG = LogFactory.getLog(OrderPeer.class);

	/**
	 * ＤＢ存在チェックエラー時ログ出力文言　顧客情報
	 */
	private static final String DATA_NOT_FOUND_CUSTOMER = "顧客情報が存在しません。顧客ＩＤ：";

	/**
	 * ＤＢ存在チェックエラー時ログ出力文言　商品情報
	 */
	private static final String DATA_NOT_FOUND_PRODUCT = "商品情報が存在しません。商品ＩＤ：";
	
	/**
	 * 注文ファンクション
	 */
	private IOrderFunction orderFunction;
	
	/**
	 * 顧客ファンクション
	 */
	private ICustomerFunction customerFunction;
	
	/**
	 * 商品ファンクション
	 */
	private IProductFunction productFunction;


	/**
	 * 注文ファンクション設定
	 * @param orderFunction 注文ファンクション
	 */
	public void setOrderFunction(IOrderFunction orderFunction) {
		this.orderFunction = orderFunction;
	}

	/**
	 * 顧客ファンクション設定
	 * @param customerFunction 顧客ファンクション
	 */
	public void setCustomerFunction(ICustomerFunction customerFunction) {
		this.customerFunction = customerFunction;
	}

	/**
	 * 商品ファンクション設定
	 * @param productFunction 商品ファンクション
	 */
	public void setProductFunction(IProductFunction productFunction) {
		this.productFunction = productFunction;
	}

	
	/**
	 * 注文業務処理実行<br>
	 * 以下の処理を行う。チェックエラー時はエラーメッセージを設定し処理を終了する。
	 * <li>顧客情報の存在チェック。
	 * <li>商品情報の存在チェック。
	 * <li>注文情報の登録。
	 * @param dto DTOオブジェクト
	 */
	public void execute(BaseDTO dto) {
		
		// PeerDTO
		OrderPeerDTO orderPeerDTO = (OrderPeerDTO)dto;
		
		
		////////// 顧客情報存在チェック //////////
		
		// ユーザＩＤ取得
		String userId = String.valueOf(orderPeerDTO.getCustomer().getId());
		
		// DTO生成
		CustomerFunctionDTO customerFunctionDTO = new CustomerFunctionDTO();
		customerFunctionDTO.setUserId(userId);
		
		// 顧客情報取得
		customerFunction.getCustomer(customerFunctionDTO);
		
		// ステータスチェック
		if (customerFunctionDTO.getStatus() == OpenstandiaConst.ENV_STATUS_DATA_NOT_FOUND) {
			
			// ステータス設定
			orderPeerDTO.setStatus(customerFunctionDTO.getStatus());
			
			// エラーメッセージ設定
			ActionMessage msg = new ActionMessage("exception.data");
			ActionMessages msgs = new ActionMessages();
			msgs.add("Customer", msg);
			orderPeerDTO.setActionMessages(msgs);

			// ログ出力
			LOG.error(DATA_NOT_FOUND_CUSTOMER + userId);
			
			return;
		}
		
		////////// 商品情報存在チェック //////////
		
		// カート情報取得
		Cart cart = orderPeerDTO.getCart();
		
		// カートアイテムリスト取得
		List<CartItem> list = cart.getItemList();
		
		// カートアイテムリスト分、商品情報存在チェックを実行
		ProductFunctionDTO productFunctionDTO = null;
		String productId = null;
		for (CartItem item : list) {
			
			// DTO生成
			productFunctionDTO = new ProductFunctionDTO();
			productId = String.valueOf(item.getId());
			productFunctionDTO.setProductId(productId);
			
			// 商品情報取得
			productFunction.getProduct(productFunctionDTO);
			
			// ステータスチェック
			if (productFunctionDTO.getStatus() == OpenstandiaConst.ENV_STATUS_DATA_NOT_FOUND) {
				
				// ステータス設定
				orderPeerDTO.setStatus(productFunctionDTO.getStatus());

				// エラーメッセージ設定
				ActionMessage msg = new ActionMessage("exception.data");
				ActionMessages msgs = new ActionMessages();
				msgs.add("Product", msg);
				orderPeerDTO.setActionMessages(msgs);

				// ログ出力
				LOG.error(DATA_NOT_FOUND_PRODUCT + productId);

				return;
			}
		}
		
		////////// 注文情報登録 //////////
		
		// DTO生成
		OrderFunctionDTO orderFunctionDTO = new OrderFunctionDTO();
		orderFunctionDTO.setCustomer(orderPeerDTO.getCustomer());
		orderFunctionDTO.setCart(orderPeerDTO.getCart());
		
		// 注文情報登録
		orderFunction.insertOrder(orderFunctionDTO);
		
		// 注文ＩＤを設定
		orderPeerDTO.setOrderId(orderFunctionDTO.getOrderId());
	}

}
