<?php
/**
 * 계좌 정보 디버깅 API
 * 로컬 DB와 바로빌 API에서 계좌 정보를 조회하는 과정을 상세히 로깅합니다.
 */
header('Content-Type: application/json; charset=utf-8');

require_once __DIR__ . '/../../lib/DotEnv.php';
(new DotEnv(__DIR__ . '/../../.env'))->load();

require_once('barobill_account_config.php');
require_once(getenv('DOCUMENT_ROOT') . '/session.php');
require_once(getenv('DOCUMENT_ROOT') . '/lib/mydb.php');

$debug = [
    'step' => [],
    'tenant_info' => [],
    'local_db' => [],
    'barobill_api' => [],
    'final_result' => []
];

try {
    // Step 1: 세션에서 테넌트 ID 확인
    $selectedTenantId = $_SESSION['eaccount_tenant_id'] ?? null;
    $debug['step'][] = '1. 세션에서 테넌트 ID 확인';
    $debug['tenant_info']['session_tenant_id'] = $selectedTenantId;
    
    // Step 2: DB에서 테넌트 정보 확인
    $pdo = db_connect();
    if (!$pdo) {
        throw new Exception("Database connection failed.");
    }
    
    $debug['step'][] = '2. DB 연결 성공';
    
    // 테넌트 정보 조회
    if ($selectedTenantId) {
        $sql = "SELECT id, company_name, corp_num, barobill_user_id 
                FROM {$DB}.barobill_companies 
                WHERE id = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$selectedTenantId]);
        $tenant = $stmt->fetch(PDO::FETCH_ASSOC);
        
        $debug['tenant_info']['db_query'] = $sql;
        $debug['tenant_info']['db_params'] = [$selectedTenantId];
        $debug['tenant_info']['tenant_found'] = $tenant ? true : false;
        $debug['tenant_info']['tenant_data'] = $tenant;
        
        if ($tenant) {
            $debug['step'][] = '3. 테넌트 정보 조회 성공: ' . $tenant['company_name'];
        } else {
            $debug['step'][] = '3. 테넌트 정보 조회 실패: ID ' . $selectedTenantId . '를 찾을 수 없음';
        }
    } else {
        // 기본값으로 주일기업 찾기
        $sql = "SELECT id, company_name, corp_num, barobill_user_id 
                FROM {$DB}.barobill_companies 
                WHERE company_name LIKE '%주일기업%' 
                   OR company_name LIKE '%주일%'
                   OR barobill_user_id = 'juil5130'
                ORDER BY id ASC
                LIMIT 1";
        $stmt = $pdo->query($sql);
        $tenant = $stmt->fetch(PDO::FETCH_ASSOC);
        
        $debug['tenant_info']['default_search_query'] = $sql;
        $debug['tenant_info']['tenant_found'] = $tenant ? true : false;
        $debug['tenant_info']['tenant_data'] = $tenant;
        
        if ($tenant) {
            $selectedTenantId = $tenant['id'];
            $debug['step'][] = '3. 기본 테넌트(주일기업) 찾기 성공: ' . $tenant['company_name'];
        } else {
            $debug['step'][] = '3. 기본 테넌트(주일기업) 찾기 실패';
        }
    }
    
    // Step 3: 로컬 DB에서 계좌 정보 조회
    if ($selectedTenantId) {
        $debug['step'][] = '4. 로컬 DB 계좌 정보 조회 시작';
        
        $accountSql = "SELECT id, company_id, bank_code, account_num, account_pwd 
                       FROM {$DB}.company_accounts 
                       WHERE company_id = ? 
                       ORDER BY id DESC";
        $accountStmt = $pdo->prepare($accountSql);
        $accountStmt->execute([$selectedTenantId]);
        $localAccounts = $accountStmt->fetchAll(PDO::FETCH_ASSOC);
        
        $debug['local_db']['query'] = $accountSql;
        $debug['local_db']['params'] = [$selectedTenantId];
        $debug['local_db']['count'] = count($localAccounts);
        $debug['local_db']['accounts'] = $localAccounts;
        $debug['step'][] = '4. 로컬 DB 계좌 정보 조회 완료: ' . count($localAccounts) . '개';
        
        // 모든 회사의 계좌 정보도 확인 (디버깅용)
        $allAccountsSql = "SELECT ca.*, c.company_name, c.barobill_user_id 
                           FROM {$DB}.company_accounts ca
                           LEFT JOIN {$DB}.barobill_companies c ON ca.company_id = c.id
                           ORDER BY ca.id DESC
                           LIMIT 20";
        $allAccountsStmt = $pdo->query($allAccountsSql);
        $allAccounts = $allAccountsStmt->fetchAll(PDO::FETCH_ASSOC);
        
        $debug['local_db']['all_companies_accounts'] = $allAccounts;
        $debug['local_db']['all_companies_accounts_count'] = count($allAccounts);
    } else {
        $debug['local_db']['error'] = '테넌트 ID가 없어서 로컬 DB 조회 불가';
    }
    
    // Step 4: 바로빌 API 설정 확인
    global $barobillUserId, $barobillCorpNum, $barobillCertKey, $isTestMode;
    $debug['barobill_api']['config'] = [
        'user_id' => $barobillUserId,
        'corp_num' => $barobillCorpNum,
        'cert_key_length' => strlen($barobillCertKey),
        'cert_key_preview' => !empty($barobillCertKey) ? substr($barobillCertKey, 0, 8) . '...' . substr($barobillCertKey, -4) : 'NOT SET',
        'test_mode' => $isTestMode
    ];
    $debug['step'][] = '5. 바로빌 API 설정 확인 완료';
    
    // Step 5: 바로빌 API 호출 시도
    $debug['step'][] = '6. 바로빌 API 호출 시작';
    $result = callBarobillAccountSOAP('GetBankAccountEx', [
        'AvailOnly' => 0
    ]);
    
    $debug['barobill_api']['success'] = $result['success'];
    $debug['barobill_api']['error'] = $result['error'] ?? null;
    $debug['barobill_api']['error_code'] = $result['error_code'] ?? null;
    
    if ($result['success']) {
        $data = $result['data'];
        $accountList = [];
        
        if (isset($data->BankAccountEx)) {
            if (is_array($data->BankAccountEx)) {
                $accountList = $data->BankAccountEx;
            } else {
                $accountList = [$data->BankAccountEx];
            }
        }
        
        $barobillAccounts = [];
        foreach ($accountList as $acc) {
            if (isset($acc->BankAccountNum) && is_numeric($acc->BankAccountNum) && $acc->BankAccountNum < 0) {
                continue;
            }
            
            $barobillAccounts[] = [
                'bankAccountNum' => $acc->BankAccountNum ?? '',
                'bankCode' => $acc->BankCode ?? '',
                'bankName' => getBankName($acc->BankCode ?? ''),
                'accountName' => $acc->AccountName ?? '',
            ];
        }
        
        $debug['barobill_api']['accounts'] = $barobillAccounts;
        $debug['barobill_api']['count'] = count($barobillAccounts);
        $debug['step'][] = '6. 바로빌 API 호출 성공: ' . count($barobillAccounts) . '개 계좌';
    } else {
        $debug['barobill_api']['accounts'] = [];
        $debug['barobill_api']['count'] = 0;
        $debug['step'][] = '6. 바로빌 API 호출 실패: ' . ($result['error'] ?? '알 수 없는 오류');
    }
    
    // Step 6: 최종 결과 통합
    $allAccounts = [];
    
    // 로컬 DB 계좌 추가
    if (isset($localAccounts)) {
        foreach ($localAccounts as $localAcc) {
            $allAccounts[] = [
                'source' => 'local_db',
                'bankAccountNum' => $localAcc['account_num'],
                'bankCode' => $localAcc['bank_code'],
                'bankName' => getBankName($localAcc['bank_code']),
            ];
        }
    }
    
    // 바로빌 API 계좌 추가
    if (isset($barobillAccounts)) {
        foreach ($barobillAccounts as $barobillAcc) {
            $exists = false;
            foreach ($allAccounts as &$existingAcc) {
                if ($existingAcc['bankAccountNum'] === $barobillAcc['bankAccountNum'] && 
                    $existingAcc['source'] === 'local_db') {
                    $existingAcc['source'] = 'both';
                    $exists = true;
                    break;
                }
            }
            if (!$exists) {
                $allAccounts[] = array_merge($barobillAcc, ['source' => 'barobill_api']);
            }
        }
    }
    
    $debug['final_result']['total_count'] = count($allAccounts);
    $debug['final_result']['accounts'] = $allAccounts;
    $debug['step'][] = '7. 최종 통합 완료: ' . count($allAccounts) . '개 계좌';
    
    // 모든 barobill_companies 목록도 확인
    $allCompaniesSql = "SELECT id, company_name, corp_num, barobill_user_id, parent_id 
                        FROM {$DB}.barobill_companies 
                        ORDER BY id ASC";
    $allCompaniesStmt = $pdo->query($allCompaniesSql);
    $allCompanies = $allCompaniesStmt->fetchAll(PDO::FETCH_ASSOC);
    
    $debug['tenant_info']['all_companies'] = $allCompanies;
    $debug['tenant_info']['all_companies_count'] = count($allCompanies);
    
    echo json_encode([
        'success' => true,
        'debug' => $debug,
        'summary' => [
            'tenant_id' => $selectedTenantId,
            'tenant_name' => $tenant['company_name'] ?? '알 수 없음',
            'local_accounts_count' => count($localAccounts ?? []),
            'barobill_accounts_count' => count($barobillAccounts ?? []),
            'total_accounts_count' => count($allAccounts)
        ]
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    
} catch (Exception $e) {
    $debug['error'] = $e->getMessage();
    $debug['error_trace'] = $e->getTraceAsString();
    
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage(),
        'debug' => $debug
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}

/**
 * 은행 코드 -> 은행명 변환
 */
function getBankName($code) {
    $banks = [
        '002' => 'KDB산업은행',
        '003' => 'IBK기업은행',
        '004' => 'KB국민은행',
        '007' => '수협은행',
        '011' => 'NH농협은행',
        '012' => '지역농축협',
        '020' => '우리은행',
        '023' => 'SC제일은행',
        '027' => '한국씨티은행',
        '031' => '대구은행',
        '032' => '부산은행',
        '034' => '광주은행',
        '035' => '제주은행',
        '037' => '전북은행',
        '039' => '경남은행',
        '045' => '새마을금고',
        '048' => '신협',
        '050' => '저축은행',
        '064' => '산림조합',
        '071' => '우체국',
        '081' => '하나은행',
        '088' => '신한은행',
        '089' => 'K뱅크',
        '090' => '카카오뱅크',
        '092' => '토스뱅크'
    ];
    return $banks[$code] ?? $code;
}
?>

