<?php
/**
 * 등록된 계좌 목록 조회 API (GetBankAccountEx)
 */
header('Content-Type: application/json; charset=utf-8');

require_once('barobill_account_config.php');

try {
    // 0: 전체, 1: 사용가능, 2: 해지
    $availOnly = isset($_GET['availOnly']) ? intval($_GET['availOnly']) : 0;
    
    // GetBankAccountEx 호출
    $result = callBarobillAccountSOAP('GetBankAccountEx', [
        'AvailOnly' => $availOnly
    ]);
    
    if ($result['success']) {
        $accounts = [];
        $data = $result['data'];
        
        // 에러 코드 체크 (전체 응답 레벨)
        if (isset($data->BankAccountEx)) {
            // 단일 객체가 에러 코드인 경우
            if (is_numeric($data->BankAccountEx) && $data->BankAccountEx < 0) {
                $errorCode = $data->BankAccountEx;
                $errorMsg = '계좌 목록 조회 실패: ' . $errorCode;
                
                // 상세 에러 메시지 매핑
                if ($errorCode == -50214) {
                    $errorMsg = '은행 로그인 실패 (-50214). 바로빌 사이트에서 계좌 비밀번호/인증서를 점검해주세요.';
                } else if ($errorCode == -24005) {
                    $errorMsg = '사용자 정보 불일치 (-24005). 사업자번호를 확인해주세요.';
                } else if ($errorCode == -25001) {
                    $errorMsg = '등록된 계좌가 없습니다 (-25001). 바로빌 사이트에서 계좌를 등록해주세요.';
                }
                
                echo json_encode([
                    'success' => false,
                    'error' => $errorMsg,
                    'error_code' => $errorCode
                ], JSON_UNESCAPED_UNICODE);
                return;
            }
        }
        
        // 실제 SOAP 응답 구조 확인:
        // GetBankAccountExResult -> BankAccount (단일 객체 또는 배열)
        // 또는 BankAccountEx (배열) - 다른 API 버전일 수 있음
        
        $accountList = [];
        
        // 우선순위 1: BankAccount 확인 (실제 응답 구조)
        if (isset($data->BankAccount)) {
            if (is_array($data->BankAccount)) {
                $accountList = $data->BankAccount;
            } else if (is_object($data->BankAccount)) {
                // 단일 객체인 경우 배열로 변환
                $accountList = [$data->BankAccount];
            }
        }
        // 우선순위 2: BankAccountEx 배열 확인 (다른 API 버전)
        else if (isset($data->BankAccountEx)) {
            if (is_array($data->BankAccountEx)) {
                $accountList = $data->BankAccountEx;
            } else if (is_object($data->BankAccountEx)) {
                // 단일 객체인 경우 배열로 변환
                $accountList = [$data->BankAccountEx];
            }
        }
        
        foreach ($accountList as $acc) {
            // 객체가 아닌 경우 스킵
            if (!is_object($acc)) {
                continue;
            }
            
            // 에러 코드 체크 (개별 계좌 레벨)
            if (isset($acc->BankAccountNum)) {
                // BankAccountNum이 음수인 경우 에러 코드
                if (is_numeric($acc->BankAccountNum) && $acc->BankAccountNum < 0) {
                    continue;
                }
                // BankAccountNum이 비어있는 경우도 스킵
                if (empty($acc->BankAccountNum)) {
                    continue;
                }
            } else {
                // BankAccountNum이 없는 경우도 스킵
                continue;
            }
            
            // BankName으로 BankCode 추론 (응답에 BankCode가 없는 경우)
            $bankCode = $acc->BankCode ?? '';
            if (empty($bankCode) && isset($acc->BankName)) {
                // BankName으로 BankCode 찾기
                $bankName = $acc->BankName;
                $bankCodeMap = [
                    '기업은행' => '003',
                    'IBK기업은행' => '003',
                    'KB국민은행' => '004',
                    '국민은행' => '004',
                    '우리은행' => '020',
                    '신한은행' => '088',
                    '하나은행' => '081',
                    'NH농협은행' => '011',
                    '농협은행' => '011'
                ];
                $bankCode = $bankCodeMap[$bankName] ?? '';
            }
            
            // UseState 처리: 없으면 기본값 1 (사용중)으로 설정
            $useState = isset($acc->UseState) ? intval($acc->UseState) : 1;
            
            $accounts[] = [
                'bankAccountNum' => $acc->BankAccountNum ?? '',
                'bankCode' => $bankCode,
                'bankName' => getBankName($bankCode) ?: ($acc->BankName ?? ''),
                'accountName' => $acc->AccountName ?? '', // 계좌 별칭/이름
                'accountType' => $acc->AccountType ?? '', // 1:입출금, 2:예적금
                'currency' => $acc->Currency ?? 'KRW',
                'issueDate' => $acc->IssueDate ?? '',
                'balance' => $acc->Balance ?? 0,
                'status' => $useState // 1:사용, 0:중지, 2:해지
            ];
        }
        
        $response = [
            'success' => true,
            'accounts' => $accounts,
            'count' => count($accounts)
        ];
        
        // 디버그 정보 추가
        if (isset($result['debug'])) {
            $response['debug'] = $result['debug'];
        }
        
        echo json_encode($response, JSON_UNESCAPED_UNICODE);
    } else {
        // API 호출 실패 시 (예: SoapClient 미설치, 통신 등) 로컬 DB에서 조회
        error_log('바로빌 API 호출 실패, 로컬 DB 조회 시도: ' . $result['error']);

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

        $accounts = [];
        $selectedTenantId = $_SESSION['eaccount_tenant_id'] ?? null;

        if ($selectedTenantId) {
            try {
                $pdo = db_connect();
                if ($pdo) {
                     // 로컬 DB에서 계좌 정보 조회
                    $sql = "SELECT id, company_id, bank_code, account_num, account_pwd 
                            FROM {$DB}.company_accounts 
                            WHERE company_id = ? 
                            ORDER BY id DESC";
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([$selectedTenantId]);
                    $localAccounts = $stmt->fetchAll(PDO::FETCH_ASSOC);

                    foreach ($localAccounts as $acc) {
                         // 은행명 변환
                        $bankName = getBankName($acc['bank_code']);
                        
                        $accounts[] = [
                            'bankAccountNum' => $acc['account_num'],
                            'bankCode' => $acc['bank_code'],
                            'bankName' => $bankName,
                            'accountName' => $bankName . ' ' . $acc['account_num'],
                            'accountType' => '', // 로컬 정보 없음
                            'currency' => 'KRW',
                            'issueDate' => '',
                            'balance' => 0, // 잔액 정보 없음
                            'status' => 1, // 기본값: 사용중
                            'source' => 'local_db_fallback',
                            'error_message' => 'API 연동 실패로 로컬 데이터 표시'
                        ];
                    }
                }
            } catch (Exception $dbEx) {
                error_log('로컬 DB 조회 실패: ' . $dbEx->getMessage());
            }
        }

        // 로컬 데이터가 있으면 성공으로 masquerade
        if (!empty($accounts)) {
             echo json_encode([
                'success' => true,
                'accounts' => $accounts,
                'count' => count($accounts),
                'message' => '바로빌 API 연동에 실패하여 로컬 저장된 계좌 목록을 표시합니다.',
                'api_error' => $result['error']
            ], JSON_UNESCAPED_UNICODE);
        } else {
             // 로컬 데이터도 없으면 에러 리턴
            echo json_encode([
                'success' => false,
                'error' => $result['error'],
                'error_code' => $result['error_code'] ?? null
            ], JSON_UNESCAPED_UNICODE);
        }
    }
} catch (Exception $e) {
    echo json_encode([
        'success' => false,
        'error' => '서버 오류: ' . $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
}

/**
 * 은행 코드 -> 은행명 변환
 */
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;
}
?>
