<?php
include_once('./_common.php');

// itemcart.php 는 "장바구니 담기" 전용 엔드포인트이므로 항상 일반 장바구니로 처리한다.
// (분리 스킨/커스텀 폼에서 sw_direct 값이 잘못 넘어와도 ss_cart_id 에 저장되도록 강제)
$sw_direct = 0;

$itemcart_trace = function($msg) {};

$cart_ct1_col = sql_fetch(" SHOW COLUMNS FROM {$g5['g5_shop_cart_table']} LIKE 'ct_1' ");
$has_cart_ct1 = (isset($cart_ct1_col['Field']) && $cart_ct1_col['Field'] === 'ct_1');

// 보관기간이 지난 상품 삭제
cart_item_clean();

// cart id 설정
set_cart_id($sw_direct);

if($sw_direct)
    $tmp_cart_id = get_session('ss_cart_direct');
else
    $tmp_cart_id = get_session('ss_cart_id');

// 브라우저에서 쿠키를 허용하지 않은 경우라고 볼 수 있음.
if (!$tmp_cart_id)
{
    die('더 이상 작업을 진행할 수 없습니다.\n\n브라우저의 쿠키 허용을 사용하지 않음으로 설정한것 같습니다.\n\n브라우저의 인터넷 옵션에서 쿠키 허용을 사용으로 설정해 주십시오.\n\n그래도 진행이 되지 않는다면 쇼핑몰 운영자에게 문의 바랍니다.');
}

$tmp_cart_id = preg_replace('/[^a-z0-9_\-]/i', '', $tmp_cart_id);

$itemcart_trace('BEGIN sw_direct='.$sw_direct.', tmp_cart_id='.$tmp_cart_id.', ss_cart_id='.get_session('ss_cart_id').', ss_cart_direct='.get_session('ss_cart_direct').', post_it_count='.(is_array($_POST['it_id']) ? count($_POST['it_id']) : 0));

$contract_days_expr = "(ct_qty + (ct_qty_hour / 24))";
$contract_hours_expr = "((ct_qty * 24) + ct_qty_hour)";

// 레벨(권한)이 상품구입 권한보다 작다면 상품을 구입할 수 없음.
if ($member['mb_level'] < $default['de_level_sell'])
{
    die('회원이시라면 로그인하신 후에 주문하여 주십시오.\n비회원은 상품을 구입할 수 있는 권한이 없습니다.');
}

$count = count($_POST['it_id']);
if ($count < 1)
    die('장바구니에 담을 상품을 선택하여 주십시오.');

$ct_count = 0;
for($i=0; $i<$count; $i++) {
    $it_id = $_POST['it_id'][$i];
    $opt_count = (isset($_POST['io_id'][$it_id]) && is_array($_POST['io_id'][$it_id])) ? count($_POST['io_id'][$it_id]) : 0;
    $itemcart_trace('ITEM it_id='.$it_id.', initial_opt_count='.$opt_count);

    if($opt_count && $_POST['io_type'][$it_id][0] != 0)
        die('상품의 선택옵션을 선택해 주십시오.');

    for($k=0; $k<$opt_count; $k++) {
        if ($_POST['ct_qty'][$it_id][$k] < 1) {
            if ($_POST['ct_qty_hour'][$it_id][$k] < 1) {
                $row_buy_min_qty = sql_fetch(" select it_buy_min_qty from {$g5['g5_shop_item_table']} where it_id = '$it_id' ");
                if ($row_buy_min_qty) {
                    $min_hours = apms_buy_qty_to_hours($row_buy_min_qty['it_buy_min_qty']);
                    if($min_hours <= 0) {
                        $min_hours = 1;
                    }

                    list($min_day, $min_hour) = apms_contract_day_hour_from_hours($min_hours);
                    $_POST['ct_qty'][$it_id][$k] = (string)$min_day;
                    $_POST['ct_qty_hour'][$it_id][$k] = (string)$min_hour;
                } else {
                    $_POST['ct_qty'][$it_id][$k] = "1";
                    $_POST['ct_qty_hour'][$it_id][$k] = "0";
                }
            }
        }
    }

	// 본인인증, 성인인증체크
	if(!$is_admin) {
		$msg = shop_member_cert_check($it_id, 'item');
		if($msg)
            die($msg);
	}

    // 상품정보
    $sql = " select * from {$g5['g5_shop_item_table']} where it_id = '$it_id' ";
    $it = sql_fetch($sql);
    if(!$it['it_id'])
        die('상품정보가 존재하지 않습니다.');

    if(function_exists('is_item_permanently_locked') && is_item_permanently_locked($it_id)) {
        if(function_exists('sync_item_permanent_soldout')) {
            sync_item_permanent_soldout($it_id);
        }
        die('해당 상품번호는 결제완료 이력이 있는 고유 식별상품으로 재판매할 수 없습니다.');
    }

    // RPC/VPN 분리 스킨에서 io_* 배열이 누락되어도 기본 주문행이 저장되도록 보정
    if($opt_count < 1) {
        $_POST['io_id'][$it_id] = array('');
        $_POST['io_type'][$it_id] = array('0');
        $_POST['io_value'][$it_id] = array($it['it_name']);
        $_POST['ct_qty'][$it_id] = array(isset($_POST['ct_qty'][$it_id][0]) ? $_POST['ct_qty'][$it_id][0] : 0);
        $_POST['ct_qty_hour'][$it_id] = array(isset($_POST['ct_qty_hour'][$it_id][0]) ? $_POST['ct_qty_hour'][$it_id][0] : 1);
        $_POST['ct_pricing_unit'][$it_id] = array(isset($_POST['ct_pricing_unit'][$it_id][0]) ? $_POST['ct_pricing_unit'][$it_id][0] : 'hour');
        $_POST['ct_pricing_count'][$it_id] = array(isset($_POST['ct_pricing_count'][$it_id][0]) ? $_POST['ct_pricing_count'][$it_id][0] : 1);
        $_POST['pt_msg1'][$it_id] = array(isset($_POST['pt_msg1'][$it_id][0]) ? $_POST['pt_msg1'][$it_id][0] : '');
        $_POST['pt_msg2'][$it_id] = array(isset($_POST['pt_msg2'][$it_id][0]) ? $_POST['pt_msg2'][$it_id][0] : '');
        $_POST['pt_msg3'][$it_id] = array(isset($_POST['pt_msg3'][$it_id][0]) ? $_POST['pt_msg3'][$it_id][0] : '');
        $opt_count = 1;
        $itemcart_trace('ITEM it_id='.$it_id.', fallback_opt_count=1 applied');
    }

	// 바로구매에 있던 장바구니 자료를 지운다.
    if($i == 0 && $sw_direct)
		sql_query(" delete from {$g5['g5_shop_cart_table']} where od_id = '$tmp_cart_id' and ct_direct = 1 ", false);

    // 이미 존재하는 품번일때 기존 장바구니 자료를 먼저 삭제 (사실상 바로 위에서 옵션수정일 때 기존 장바구니 자료 삭제와 별도로 동일한 품번은 무조건 삭제 시키는 것임) JSLEE
    sql_query(" delete from {$g5['g5_shop_cart_table']} where od_id = '$tmp_cart_id' and mb_id = '{$member['mb_id']}' and it_id = '$it_id' ", false);

    // 최소, 최대 수량 체크
    if($it['it_buy_min_qty'] || $it['it_buy_max_qty']) {
        $sum_hours = 0;
        for($k=0; $k<$opt_count; $k++) {
            if($_POST['io_type'][$it_id][$k] == 0) {
                $sum_hours += apms_contract_hours_from_day_hour(
                    (int)$_POST['ct_qty'][$it_id][$k],
                    (int)$_POST['ct_qty_hour'][$it_id][$k]
                );
            }
        }

        $min_hours = apms_buy_qty_to_hours($it['it_buy_min_qty']);
        $max_hours = apms_buy_qty_to_hours($it['it_buy_max_qty']);

        if($min_hours > 0 && $sum_hours < $min_hours) {
            die($it['it_name'].'의 계약시간 총합은 '.apms_contract_hours_text($min_hours).' 이상으로 주문해 주십시오.');
        }

        if($max_hours > 0 && $sum_hours > $max_hours)
            die($it['it_name'].'의 계약시간 총합은 '.apms_contract_hours_text($max_hours).' 이하로 주문해 주십시오.');

        // 기존에 장바구니에 담긴 상품이 있는 경우에 최대 계약일수 체크
        if($max_hours > 0) {
                        $sql4 = " select SUM({$contract_hours_expr}) as ct_sum_hours
                        from {$g5['g5_shop_cart_table']}
                        where od_id = '$tmp_cart_id'
                          and it_id = '$it_id'
                          and io_type = '0'
                          and ct_status = '쇼핑' ";
            $row4 = sql_fetch($sql4);

			$row_hours = (int)$row4['ct_sum_hours'];
			$option_sum_hours = ($act === 'optionmod') ? $sum_hours : $sum_hours + $row_hours;

			if($option_sum_hours > $max_hours)
                die($it['it_name'].'의 계약시간 총합은 '.apms_contract_hours_text($max_hours).' 이하로 주문해 주십시오.');
        }
    }

    // 옵션정보를 얻어서 배열에 저장
    $opt_list = array();
    $sql = " select * from {$g5['g5_shop_item_option_table']} where it_id = '$it_id' and io_use = 1 order by io_no asc ";
    $result = sql_query($sql);
    $lst_count = 0;
    for($k=0; $row=sql_fetch_array($result); $k++) {
        $opt_list[$row['io_type']][$row['io_id']]['id'] = $row['io_id'];
        $opt_list[$row['io_type']][$row['io_id']]['use'] = $row['io_use'];
        $opt_list[$row['io_type']][$row['io_id']]['price'] = $row['io_price'];
        $opt_list[$row['io_type']][$row['io_id']]['stock'] = $row['io_stock_qty'];

        // 선택옵션 개수
        if(!$row['io_type'])
            $lst_count++;
    }

    //--------------------------------------------------------
	//  재고 검사, 바로구매일 때만 체크
    //--------------------------------------------------------
    // 이미 장바구니에 있는 같은 상품의 수량합계를 구한다.
	if($sw_direct) {
		for($k=0; $k<$opt_count; $k++) {
			$io_id = preg_replace(G5_OPTION_ID_FILTER, '', $_POST['io_id'][$it_id][$k]);
			$io_type = preg_replace('#[^01]#', '', $_POST['io_type'][$it_id][$k]);
			$io_value = $_POST['io_value'][$it_id][$k];
            $pricing_unit_raw = isset($_POST['ct_pricing_unit'][$it_id][$k]) ? $_POST['ct_pricing_unit'][$it_id][$k] : '';
            $has_custom_pricing_submission = (
                trim((string)$pricing_unit_raw) !== ''
                || isset($_POST['ct_qty'][$it_id][$k])
                || isset($_POST['ct_qty_hour'][$it_id][$k])
                || isset($_POST['ct_pricing_count'][$it_id][$k])
            );

            $sql = " select SUM({$contract_days_expr}) as cnt from {$g5['g5_shop_cart_table']}
					  where od_id <> '$tmp_cart_id'
						and it_id = '$it_id'
						and io_id = '$io_id'
						and io_type = '$io_type'
						and ct_stock_use = 0
						and ct_status = '쇼핑'
						and ct_select = '1' ";
			$row = sql_fetch($sql);
			//$sum_qty = is_int($row['cnt']) ? $row['cnt'] : 0;
            $sum_qty = $row['cnt'] ? $row['cnt'] : 0;

			// 재고 구함
			$ct_qty = (float)$_POST['ct_qty'][$it_id][$k];
			$ct_qty_hour = (float)$_POST['ct_qty_hour'][$it_id][$k];
			if(!$io_id)
				$it_stock_qty = get_it_stock_qty($it_id);
			else
				$it_stock_qty = get_option_stock_qty($it_id, $io_id, $io_type);

            if ($ct_qty + $sum_qty > $it_stock_qty)
			{
	            die($io_value.' 의 재고수량이 부족합니다.\n\n현재 재고수량 : ' . number_format($it_stock_qty - $sum_qty) . ' 개');
			}
		}
	}
    //--------------------------------------------------------

	// 옵션수정일 때 기존 장바구니 자료를 먼저 삭제
	if($act == 'optionmod')
		sql_query(" delete from {$g5['g5_shop_cart_table']} where od_id = '$tmp_cart_id' and it_id = '$it_id' ");

    // 장바구니에 Insert
    // 바로구매일 경우 장바구니가 체크된것으로 강제 설정
    if($sw_direct) {
        $ct_select = 1;
		$ct_select_time = G5_TIME_YMDHIS;
    } else {
        $ct_select = 0;
		$ct_select_time = '0000-00-00 00:00:00';
	}

    // 장바구니에 Insert
    $comma = '';
    $usage_remain_mb_point = (int)(isset($member['mb_point']) ? $member['mb_point'] : 0);
    if($usage_remain_mb_point < 0) {
        $usage_remain_mb_point = 0;
    }
    $cart_insert_columns = "od_id, mb_id, it_id, it_name, it_sc_type, it_sc_method, it_sc_price, it_sc_minimum, it_sc_qty, ct_status, ct_price, ct_install_price";
    if($has_cart_ct1) {
        $cart_insert_columns .= ", ct_1";
    }
    $cart_insert_columns .= ", ct_point, ct_point_use, ct_stock_use, ct_option, ct_qty, ct_qty_hour, ct_notax, io_id, io_type, io_price, ct_time, ct_ip, ct_send_cost, ct_direct, ct_select, ct_select_time, pt_it, pt_msg1, pt_msg2, pt_msg3";

    $sql = " INSERT INTO {$g5['g5_shop_cart_table']} ( {$cart_insert_columns} ) VALUES ";

    for($k=0; $k<$opt_count; $k++) {
		$io_id = preg_replace(G5_OPTION_ID_FILTER, '', $_POST['io_id'][$it_id][$k]);
		$io_type = preg_replace('#[^01]#', '', $_POST['io_type'][$it_id][$k]);
        $io_value = $_POST['io_value'][$it_id][$k];
        $pricing_unit_raw = isset($_POST['ct_pricing_unit'][$it_id][$k]) ? $_POST['ct_pricing_unit'][$it_id][$k] : '';
        $has_custom_pricing_submission = (
            trim((string)$pricing_unit_raw) !== ''
            || isset($_POST['ct_qty'][$it_id][$k])
            || isset($_POST['ct_qty_hour'][$it_id][$k])
            || isset($_POST['ct_pricing_count'][$it_id][$k])
        );

        $pt_msg1 = sql_real_escape_string(get_text($_POST['pt_msg1'][$it_id][$k]));
        $pt_msg2 = sql_real_escape_string(get_text($_POST['pt_msg2'][$it_id][$k]));
        $pt_msg3 = sql_real_escape_string(get_text($_POST['pt_msg3'][$it_id][$k]));

        // 선택옵션정보가 존재하는데 선택된 옵션이 없으면 건너뜀
        // 단, RPC/VPN 커스텀 요금제 제출(ct_pricing_unit)이 있으면 io_id 공백도 유효한 주문행으로 본다.
        if($lst_count && $io_id == '' && !$has_custom_pricing_submission)
            continue;

        // 구매할 수 없는 옵션은 건너뜀
        if($io_id && !$opt_list[$io_type][$io_id]['use'])
            continue;

        $io_price = $opt_list[$io_type][$io_id]['price'];
        $ct_qty = (float)$_POST['ct_qty'][$it_id][$k];
        $ct_qty_hour = (float)$_POST['ct_qty_hour'][$it_id][$k];
        $pricing_unit = apms_pricing_unit_normalize($pricing_unit_raw);
        $pricing_count_raw = isset($_POST['ct_pricing_count'][$it_id][$k]) ? $_POST['ct_pricing_count'][$it_id][$k] : 0;
        $pricing_count = (int)$pricing_count_raw;
        if($pricing_unit === 'usage') {
            $ct_qty = 0;
            $ct_qty_hour = 1;
        }
        $total_contract_hours = apms_contract_hours_from_day_hour($ct_qty, $ct_qty_hour);
        if($total_contract_hours < 1) {
            $total_contract_hours = 1;
        }
        $allowed_units = apms_allowed_pricing_units_from_item($it);
        if(empty($allowed_units[$pricing_unit])) {
            $pricing_unit = apms_best_pricing_unit_for_hours($it, $total_contract_hours, 'hour');
        }
        if($pricing_unit === 'usage') {
            if($pricing_count < 5000) $pricing_count = 5000;
            if($pricing_count > 1000000) $pricing_count = 1000000;
            $usage_request_amount = (int)$pricing_count;
            $target_base_total = $usage_request_amount - $usage_remain_mb_point;
            if($target_base_total < 0) {
                $target_base_total = 0;
            }
            $usage_remain_mb_point -= $usage_request_amount;
            if($usage_remain_mb_point < 0) {
                $usage_remain_mb_point = 0;
            }
        } else {
            $pricing_quote = apms_best_pricing_quote_for_hours($it, $total_contract_hours, $pricing_unit);
            $pricing_unit = $pricing_quote['unit'];
            $target_base_total = (int)$pricing_quote['total_price'];
        }
        if($has_cart_ct1) {
            $line_hourly_price = (int)floor($target_base_total / $total_contract_hours);
            if($line_hourly_price < 0) {
                $line_hourly_price = 0;
            }
            $pricing_adjust = (int)($target_base_total - ($line_hourly_price * $total_contract_hours));
            if($pricing_adjust < 0) {
                $pricing_adjust = 0;
            }
        } else {
            // ct_1 컬럼이 없는 환경에서는 잔여금액을 분리 저장할 수 없으므로
            // 시간단가를 소수로 저장해 총합(base total)을 그대로 보존한다.
            $line_hourly_price = round(((float)$target_base_total / (float)$total_contract_hours), 8);
            if($line_hourly_price < 0) {
                $line_hourly_price = 0;
            }
            $pricing_adjust = 0;
        }

        // 구매가격이 음수인지 체크
        if($io_type) {
            if((float)$io_price < 0)
                die('구매금액이 음수인 상품은 구매할 수 없습니다.');
        } else {
            if((float)$line_hourly_price + (float)$io_price < 0)
                die('구매금액이 음수인 상품은 구매할 수 없습니다.');
        }

        // 동일옵션의 상품이 있으면 수량 더함 // 수량 더하지 않도록 변경. JSLEE
        /*
        $sql2 = " select ct_id, ct_qty, io_type
                    from {$g5['g5_shop_cart_table']}
                    where od_id = '$tmp_cart_id'
                      and it_id = '$it_id'
                      and io_id = '$io_id'
					  and pt_msg1 = '{$pt_msg1}'
					  and pt_msg2 = '{$pt_msg2}'
					  and pt_msg3 = '{$pt_msg3}'
					  and ct_status = '쇼핑' ";
        $row2 = sql_fetch($sql2);
		if($row2['ct_id']) {
			// 재고체크
			$tmp_ct_qty = $row2['ct_qty'];
			if(!$io_id)
				$tmp_it_stock_qty = get_it_stock_qty($it_id);
			else
				$tmp_it_stock_qty = get_option_stock_qty($it_id, $io_id, $row2['io_type']);

			if ($tmp_ct_qty + $ct_qty > $tmp_it_stock_qty)
			{
				die($io_value." 의 재고수량이 부족합니다.\\n\\n현재 재고수량 : " . number_format($tmp_it_stock_qty) . " 개");
			}

			$sql3 = " update {$g5['g5_shop_cart_table']}
						set ct_qty = ct_qty + '$ct_qty'
						where ct_id = '{$row2['ct_id']}' ";
			sql_query($sql3);
			continue;
		}
        */

        // 포인트
        $point = 0;
        if($config['cf_use_point']) {
            if($io_type == 0) {
                $point = get_item_point($it, $io_id);
            } else {
                $point = $it['it_supply_point'];
            }

            if($point < 0)
                $point = 0;
        }

        // 개통비/설치비 계산 (설정 규칙 적용)
        $install_price = apms_install_price_by_hours($it, $total_contract_hours);

        // 배송비결제
        if($it['it_sc_type'] == 1)
            $ct_send_cost = 2; // 무료
        else if($it['it_sc_type'] > 1 && $it['it_sc_method'] == 1)
            $ct_send_cost = 1; // 착불

        $io_value = sql_real_escape_string(strip_tags($io_value));
		$remote_addr = get_real_client_ip();

        $ct1_value_sql = $has_cart_ct1 ? ", '{$pricing_adjust}'" : "";
        $sql .= $comma."( '$tmp_cart_id', '{$member['mb_id']}', '{$it['it_id']}', '".addslashes($it['it_name'])."', '{$it['it_sc_type']}', '{$it['it_sc_method']}', '{$it['it_sc_price']}', '{$it['it_sc_minimum']}', '{$it['it_sc_qty']}', '쇼핑', '{$line_hourly_price}', '{$install_price}'{$ct1_value_sql}, '$point', '0', '0', '$io_value', '$ct_qty', '$ct_qty_hour', '{$it['it_notax']}', '$io_id', '$io_type', '$io_price', '".G5_TIME_YMDHIS."', '$remote_addr', '$ct_send_cost', '$sw_direct', '$ct_select', '$ct_select_time', '{$it['pt_it']}', '$pt_msg1', '$pt_msg2', '$pt_msg3' )";
        $comma = ' , ';
        $ct_count++;
    }

    if($ct_count > 0) {
        $insert_result = sql_query($sql, false);
        if(!$insert_result) {
            $err_info = function_exists('sql_error_info') ? sql_error_info($g5['connect_db']) : 'sql_error_info_unavailable';
            $itemcart_trace('INSERT_FAIL it_id='.$it_id.', ct_count='.$ct_count.', err='.$err_info.', sql_prefix='.substr(preg_replace('/\s+/', ' ', $sql), 0, 500));
            die('장바구니 저장 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.');
        }
        $itemcart_trace('INSERT_OK it_id='.$it_id.', ct_count='.$ct_count);
    }
}

if($ct_count < 1) {
    $itemcart_trace('END_FAIL ct_count=0, tmp_cart_id='.$tmp_cart_id);
    die('장바구니에 담을 유효 주문항목이 없습니다. 선택기간/요금제를 다시 확인해 주세요.');
}

$itemcart_trace('END_OK ct_count='.$ct_count.', tmp_cart_id='.$tmp_cart_id);
die('OK');
?>