<?php

/* カートセッション管理クラス */
class SC_CartSession {
    var $key;
    var $key_tmp;	// ユニークIDを指定する。

    /* コンストラクタ */
    function SC_CartSession($key = 'cart') {
        SC_Utils::sfDomainSessionStart();

        if($key == "") $key = "cart";
        $this->key = $key;
        
        if(!isset($_SESSION[$this->key]['products'])){
        	$_SESSION[$this->key]['products']=array();
        }
    }

    // 商品購入処理中のロック
    function saveCurrentCart($key_tmp) {
        $this->key_tmp = "savecart_" . $key_tmp;
        // すでに情報がなければ現状のカート情報を記録しておく
        if(count($_SESSION[$this->key_tmp]) == 0) {
            $_SESSION[$this->key_tmp] = $_SESSION[$this->key];
        }
        // 1世代古いコピー情報は、削除しておく
        foreach($_SESSION as $key => $val) {
            if($key != $this->key_tmp && preg_match("/^savecart_/", $key)) {
                unset($_SESSION[$key]);
            }
        }
    }

    // 商品購入中の変更があったかをチェックする。
    function getCancelPurchase() {
        $ret = isset($_SESSION[$this->key]['cancel_purchase'])
            ? $_SESSION[$this->key]['cancel_purchase'] : "";
        $_SESSION[$this->key]['cancel_purchase'] = false;
        return $ret;
    }

    // 購入処理中に商品に変更がなかったかを判定
    function checkChangeCart() {
    	//同じであればfalse
    	if($_SESSION[$this->key] == $_SESSION[$this->key_tmp]){
            $_SESSION[$this->key]['cancel_purchase'] = false;
    		return false;
  		//違ったらfalse
    	}else{
	        unset($_SESSION[$this->key_tmp]);
	        $_SESSION[$this->key]['cancel_purchase'] = true;
	        return true;
    	}
    }

    
    // 商品ごとの合計価格
    function getProductTotal($arrInfo, $id) {
    	//商品があれば税込みにして返す
    	$idstr=$this->idArray2str($id);
        if(isset($_SESSION[$this->key]['products'][$idstr])){
            $price = $_SESSION[$this->key]['products'][$idstr]['price'];
            $quantity = $_SESSION[$this->key]['products'][$idstr]['quantity'];
            $pre_tax = SC_Utils_Ex::sfPreTax($price, $arrInfo['tax'], $arrInfo['tax_rule']);
            $total = $pre_tax * $quantity;
            return $total;
        }
        
        return 0;
    }

    // 値のセット
    function setProductValue($id, $key, $val) {
    	$idstr=$this->idArray2str($id);
    	if(isset($_SESSION[$this->key]['products'][$idstr])){
    		$_SESSION[$this->key]['products'][$idstr][$key] = $val;
    	}
    }


    // カート内商品数の合計
    function getTotalQuantity() {
        $total = 0;
        foreach($_SESSION[$this->key]['products'] as $key=>$val){
        	$total+=$val['quantity'];
        }
        return $total;
    }

    // 全商品の合計価格
    function getAllProductsTotal($arrInfo) {
        $total = 0;
        //全商品でループ
        foreach($_SESSION[$this->key]['products'] as $key=>$val){
        	//税込み金額を算出して足す
        	$price = $val['price'];
        	$quantity = $val['quantity'];
            $pre_tax = SC_Utils::sfPreTax($price, $arrInfo['tax'], $arrInfo['tax_rule']);
            $total+= ($pre_tax * $quantity);
        }
        return $total;
    }

    // 全商品の合計税金
    function getAllProductsTax($arrInfo) {
        // 税合計
        $total = 0;
        foreach($_SESSION[$this->key]['products'] as $key=>$val){
        	$price=$val['price'];
        	$quantity=$val['quantity'];
            $tax = SC_Utils_Ex::sfTax($price, $arrInfo['tax'], $arrInfo['tax_rule']);
            $total+= ($tax * $quantity);
        }
        return $total;
    }

    // 全商品の合計ポイント
    function getAllProductsPoint() {
        // ポイント合計
        $total = 0;
        foreach($_SESSION[$this->key]['products'] as $key=>$val){
        	$price=$val['price'];
        	$quantity=$val['quantity'];
        
            if (!isset($_SESSION[$this->key]['products'][$key]['point_rate'])) {
                $_SESSION[$this->key]['products'][$key]['point_rate'] = "";
            }
            $point_rate = $_SESSION[$this->key]['products'][$key]['point_rate'];
            
            if (!isset($_SESSION[$this->key]['products'][$key]['id'][0])) {
                $_SESSION[$this->key]['products'][$key]['id'][0] = "";
            }
            $id = $_SESSION[$this->key]['products'][$key]['id'][0];
            
            $point = SC_Utils_Ex::sfPrePoint($price, $point_rate, POINT_RULE, $id);
            $total+= ($point * $quantity);
        }
        return $total;
    }

    // カートへの商品追加
    function addProduct($id, $quantity, $campaign_id = "") {
    	$idstr=$this->idArray2str($id);
        //既に登録されていれば
        if($_SESSION[$this->key]['products'][$idstr]) {
			//上限を超えたら駄目
        	$val=$_SESSION[$this->key]['products'][$idstr]['quantity'] + $quantity;
			if(strlen($val) > INT_LEN) {return false;}
			//登録
      		$_SESSION[$this->key]['products'][$idstr]['quantity']=$val;
			
      	//無ければ
        }else{
	        //投入
	      	$_SESSION[$this->key]['products'][$idstr]['id']=$id;
	      	$_SESSION[$this->key]['products'][$idstr]['cart_no']=$idstr;
	      	$_SESSION[$this->key]['products'][$idstr]['quantity']=$quantity;
        }
        //共通
        if(!empty($campaign_id)){
           $_SESSION[$this->key][$i]['campaign_id'] = $campaign_id;
           $_SESSION[$this->key][$i]['is_campaign'] = true;
        }
    }

    // 前頁のURLを記録しておく
    function setPrevURL($url) {
        // 前頁として記録しないページを指定する。
        $arrExclude = array(
            "detail_image.php",
            "/shopping/"
        );
        $exclude = false;
        // ページチェックを行う。
        foreach($arrExclude as $val) {
            if(ereg($val, $url)) {
                $exclude = true;
                break;
            }
        }
        // 除外ページでない場合は、前頁として記録する。
        if(!$exclude) {
            $_SESSION[$this->key]['prev_url'] = $url;
        }
    }

    // 前頁のURLを取得する
    function getPrevURL() {
        return isset($_SESSION[$this->key]['prev_url'])
            ? $_SESSION[$this->key]['prev_url'] : "";
    }

    // キーが一致した商品の削除
    function delProductKey($keyname, $value) {
    	foreach($_SESSION[$this->key]['products'] as $key=>$val){
            if($val[$keyname] == $value) {
                unset($_SESSION[$this->key]['products'][$key]);
            }
    	}
    }

    function setValue($key, $val) {
        $_SESSION[$this->key][$key] = $val;
    }

    function getValue($key) {
        return $_SESSION[$this->key][$key];
    }

    function getCartList() {
    	return $_SESSION[$this->key]['products'];
    }

    // カート内にある商品ＩＤを全て取得する
    function getAllProductID() {
    	$ret=array();
    	foreach($_SESSION[$this->key]['products'] as $key=>$val){
    		$ret[]=$val['id'];
    	}
    	return $ret;
        //return array_keys($_SESSION[$this->key]['products']);
    }

    function delAllProducts() {
    	$_SESSION[$this->key]['products']=array();
    }

    // 商品の削除
    function delProduct($cart_no) {
    	unset($_SESSION[$this->key]['products'][$cart_no]);
    }

    // 個数の増加
    function upQuantity($cart_no) {
    	if(isset($_SESSION[$this->key]['products'][$cart_no])){
            if($_SESSION[$this->key]['products'][$cart_no]['quantity'] >= 1) {
                $_SESSION[$this->key]['products'][$cart_no]['quantity']++;
            }
    	}
    }

    // 個数の減少
    function downQuantity($cart_no) {
    	if(isset($_SESSION[$this->key]['products'][$cart_no])){
            if($_SESSION[$this->key]['products'][$cart_no]['quantity'] > 1) {
                $_SESSION[$this->key]['products'][$cart_no]['quantity']--;
            }
    	}
    }

    // 全商品の合計送料
    function getAllProductsDelivFee() {
        $total = 0;
        foreach($_SESSION[$this->key]['products'] as $key=>$val){
            $deliv_fee = $val['deliv_fee'];
            $quantity = $val['quantity'];
            $total+= ($deliv_fee * $quantity);
        }
        return $total;
    }

    // カートの中の売り切れチェック
    function chkSoldOut($arrCartList, $is_mobile = false){
        foreach($arrCartList as $key => $val){
            if($val['quantity'] == 0){
                // 売り切れ商品をカートから削除する
                $this->delProduct($val['cart_no']);
                SC_Utils_Ex::sfDispSiteError(SOLD_OUT, "", true, "", $is_mobile);
            }
        }
    }

    /**
     * カートの中のキャンペーン商品のチェック
     * @param integer $campaign_id キャンペーンID
     * @return boolean True:キャンペーン商品有り False:キャンペーン商品無し
     */
    function chkCampaign($campaign_id){
        $max = $this->getMax();
        foreach($_SESSION[$this->key]['products'] as $key=>$val){
        	if(isset($val['is_campaign']) && $val['is_campaign']==$campaign_id){
        		return true;
        	}
        }
        return false;
        
    }
    
    //ID配列を文字列にしてキーに
    public function idArray2str($id){
    	$idstr=$id[0].'-'.$id[1].'-'.$id[2];
    	return $idstr;
    }
}

