#!/bin/bash

# ==========================================================
# MySQL 소개고객(CS31, CS32, CS33) 업데이트 스크립트
# 작성일: 2026-04-30
# 설명: CS 테이블의 소개고객코드(CS18)를 기반으로 계층 구조를 계산하여 업데이트
# ==========================================================

DEF_SERVER_IP="192.168.56.201"
DEF_DB_LIST=""

# 파라미터 확인 (웹 / CLI 분기)
if [ "$#" -gt 0 ]; then
 SERVER_IP=${1:-$DEF_SERVER_IP}
 DB_LIST=${2:-$DEF_DB_LIST}
 DB_LIST=$(echo "$DB_LIST" | tr '[:lower:]' '[:upper:]')
else
 echo "----------------------------------------------------"
 echo "  소개고객 경로 및 카운트 업데이트를 시작합니다."
 echo "  (입력 없이 Enter를 누르면 기본값이 사용됩니다.)"
 echo "----------------------------------------------------"

 read -p "1. 서버 IP (기본: $DEF_SERVER_IP): " SERVER_IP
 SERVER_IP=${SERVER_IP:-$DEF_SERVER_IP}

 read -p "2. 데이터베이스 (기본: 전체): " DB_LIST
 DB_LIST=${DB_LIST:-$DEF_DB_LIST}
 DB_LIST=$(echo "$DB_LIST" | tr '[:lower:]' '[:upper:]')
fi # End of If

START_DATETIME=$(date "+%Y-%m-%d %H:%M:%S")
echo ""
echo "소개고객 업데이트 시작: $START_DATETIME"
echo "----------------------------------------------------"

# PHP 내장 스크립트로 처리 (트리 계산 및 DB 업데이트를 효율적으로 수행)
php -- "$SERVER_IP" "$DB_LIST" << 'EOF'
<?php
$serverIp = $argv[1] ?? '192.168.56.201'; // 서버IP
$dbListStr = $argv[2] ?? ''; // DB 목록 문자열
$dbUser = 'root'; // DB 사용자
$dbPass = '@smartserver'; // DB 비밀번호

// DB 목록 추출
$dbList = [];
$conn = new mysqli($serverIp, $dbUser, $dbPass);
if ($conn->connect_error) {
 die("서버 접속 실패: " . $conn->connect_error . "\n");
} // End of If

if (empty($dbListStr)) {
 // 전체 DB 조회
 $res = $conn->query("SHOW DATABASES");
 $exclude = ['information_schema', 'performance_schema', 'mysql', 'sys', 'dbo', 'CUBE_MASTER'];
 while ($row = $res->fetch_array()) {
  $dbName = $row[0];
  if (!in_array($dbName, $exclude)) {
   $dbList[] = $dbName;
  } // End of If
 } // End of While
} else {
 $dbList = array_map('trim', explode(',', $dbListStr));
} // End of If
$conn->close();

foreach ($dbList as $dbName) {
 echo "[$dbName] 데이터베이스 소개고객 업데이트 중...\n";
 $mysqli = new mysqli($serverIp, $dbUser, $dbPass, $dbName);
 if ($mysqli->connect_error) {
  echo " > [$dbName] 접속 실패: " . $mysqli->connect_error . "\n";
  continue;
 } // End of If
 
 // CS 테이블 존재 여부 확인
 $tableCheck = $mysqli->query("SHOW TABLES LIKE 'CS'");
 if ($tableCheck->num_rows == 0) {
  echo " > [$dbName] CS 테이블이 존재하지 않습니다.\n";
  $mysqli->close();
  continue;
 } // End of If

 // 1. 모든 고객 데이터 로드 (초진일자 기준 오름차순 정렬 추가)
 $res = $mysqli->query("SELECT CS01, CS08, CS18 FROM CS WHERE CS03 = 1 ORDER BY CS21 ASC, CS01 ASC");
 if (!$res) {
  echo " > [$dbName] 데이터 조회 실패\n";
  $mysqli->close();
  continue;
 } // End of If

 $users = [];
 while ($row = $res->fetch_assoc()) {
  $users[(int)$row['CS01']] = [
   'code' => (int)$row['CS01'],
   'name' => $row['CS08'],
   'parent' => (int)$row['CS18'],
   'cs32' => 0, // 직접 소개수
   'cs33' => 0, // 누적 소개수
   'path' => [] // 소개 경로 배열
  ];
 } // End of While
 $res->free();

 // 2. 트리 구성 및 자식 수 계산
 foreach ($users as $id => $u) {
  $pid = $u['parent'];
  if ($pid > 0 && isset($users[$pid])) {
   $users[$pid]['cs32']++; // 부모의 직접 소개수 증가
  } // End of If
 } // End of Foreach

 // 3. 경로 계산 및 누적수 계산
 foreach ($users as $id => $u) {
  $path = [];
  $curr = $u['parent'];
  $visited = [$id => true]; // 순환 참조 방지
  
  while ($curr > 0 && isset($users[$curr])) {
   if (isset($visited[$curr])) break; // 순환 참조 발견 시 중단
   $visited[$curr] = true;
   
   $path[] = ['code' => $users[$curr]['code'], 'name' => $users[$curr]['name']];
   $users[$curr]['cs33']++; // 경로에 있는 모든 조상의 누적 소개수 증가
   
   $curr = $users[$curr]['parent']; // 다음 조상으로 이동
  } // End of While
  
  // 경로 배열은 상위 조상이 먼저 오도록 뒤집음 (최상위 -> 부모 -> 나)
  $users[$id]['path'] = array_reverse($path);
 } // End of Foreach

 // 4. 업데이트 쿼리 실행
 $mysqli->begin_transaction();
 $stmt = $mysqli->prepare("UPDATE CS SET CS31 = ?, CS32 = ?, CS33 = ? WHERE CS01 = ?");
 if (!$stmt) {
  echo " > [$dbName] Prepare 실패: " . $mysqli->error . "\n";
  $mysqli->rollback();
  $mysqli->close();
  continue;
 } // End of If

 $updateCount = 0;
 foreach ($users as $id => $u) {
  $cs31_json = empty($u['path']) ? '' : json_encode($u['path'], JSON_UNESCAPED_UNICODE);
  $cs32 = $u['cs32'];
  $cs33 = $u['cs33'];
  $stmt->bind_param("siii", $cs31_json, $cs32, $cs33, $id);
  $stmt->execute();
  $updateCount++;
 } // End of Foreach
 
 $mysqli->commit();
 $stmt->close();
 $mysqli->close();
 
 echo " > [$dbName] $updateCount 건 업데이트 완료\n";
} // End of Foreach
?>
EOF

END_DATETIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "----------------------------------------------------"
echo "소개고객 업데이트 완료: $END_DATETIME"
echo "----------------------------------------------------"