<?php
/**
 * 등록된 카드 목록 조회 API (GetCardEx2)
 * API 레퍼런스: https://dev.barobill.co.kr/docs/references/카드조회-API#GetCardEx2
 * 
 * ============================================================================
 * 데이터 흐름
 * ============================================================================
 * 
 * [호출 경로]
 * 화면(ecard/index.php) → 이 API(cards.php) → barobill_card_config.php::getCardList()
 * → 바로빌 SOAP API(GetCardEx2) → 바로빌 서버
 * 
 * [카드 정보 출처]
 * - 카드 정보는 바로빌 웹사이트(https://www.barobill.co.kr)에서 등록된 정보
 * - 카드번호, 카드사, Web ID, Web 비밀번호 등은 바로빌에 저장되어 있음
 * - 이 API는 바로빌 서버에서 등록된 카드 목록을 조회만 수행
 * 
 * [반환 데이터]
 * - cardNum: 카드번호 (전체)
 * - cardNumMasked: 카드번호 (마스킹 처리, 예: "1234-****-****-5678")
 * - cardCompany: 카드사 코드 (예: "04", "06", "02")
 * - cardCompanyName: 카드사 이름 (예: "삼성카드", "신한카드", "KB국민카드")
 * - cardBrand: 카드 브랜드 (예: "비자", "마스터카드", "카드")
 * - alias: 카드 별칭
 * - webId: 카드사 웹 ID (카드사 홈페이지 로그인 ID)
 * - status: 카드 상태 (0=대기중, 1=정상, 2=해지, 3=수집오류, 4=일시중지)
 * 
 * [주의사항]
 * - Web 비밀번호는 보안상 반환하지 않음
 * - 카드 등록/수정/삭제는 바로빌 웹사이트에서 직접 해야 함
 */
header('Content-Type: application/json; charset=utf-8');

require_once('barobill_card_config.php');

try {
    $availOnly = isset($_GET['availOnly']) ? intval($_GET['availOnly']) : 0;
    
    $result = getCardList($availOnly);
    
    if ($result['success']) {
        $cards = [];
        foreach ($result['data'] as $card) {
            // GetCardEx2 응답 필드 매핑
            // CardCompanyCode (등록 시), CardCompanyName (조회 시)
            $cardCompanyCode = $card->CardCompanyCode ?? $card->CardCompany ?? '';
            
            // 카드 브랜드 (비자, 마스터카드 등) 추측
            $cardBrand = guessCardTypeFromNumber($card->CardNum ?? '');
            
            // 카드 회사명 (신한, KB 등)
            $cardCompanyName = !empty($card->CardCompanyName) 
                ? $card->CardCompanyName 
                : getCardCompanyName($cardCompanyCode);
            
            $cards[] = [
                'cardNum' => $card->CardNum ?? '',
                'cardNumMasked' => maskCardNumber($card->CardNum ?? ''),
                'cardCompany' => $cardCompanyCode,
                'cardCompanyName' => $cardCompanyName,
                'cardBrand' => $cardBrand, // 카드 브랜드 (비자, 마스터카드 등)
                'alias' => $card->Alias ?? '',
                'cardType' => $card->CardType ?? '',
                'cardTypeName' => getCardTypeName($card->CardType ?? ''),
                'status' => $card->Status ?? '',
                'statusName' => getCardStatusName($card->Status ?? ''),
                'collectCycle' => $card->CollectCycle ?? '',
                'collectCycleName' => getCollectCycleName($card->CollectCycle ?? ''),
                'lastCollectDate' => formatDate($card->LastCollectDate ?? ''),
                'lastCollectResult' => $card->LastCollectResult ?? '',
                'lastCollectResultName' => getCollectResultName($card->LastCollectResult ?? ''),
                'nextExtendDate' => formatDate($card->NextExtendDate ?? ''),
                'registDate' => formatDate($card->RegistDate ?? ''),
                'webId' => $card->WebId ?? ''
            ];
        }
        
        echo json_encode([
            'success' => true,
            'cards' => $cards,
            'count' => count($cards)
        ], 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 maskCardNumber($cardNum) {
    if (strlen($cardNum) < 8) return $cardNum;
    return substr($cardNum, 0, 4) . '-****-****-' . substr($cardNum, -4);
}

/**
 * 날짜 포맷팅
 */
function formatDate($date) {
    if (empty($date)) return '';
    if (strlen($date) === 8) {
        return substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2);
    }
    return $date;
}

/**
 * 카드번호로 카드 종류 추측 (BIN 코드 기반)
 */
function guessCardTypeFromNumber($cardNum) {
    if (empty($cardNum) || strlen($cardNum) < 4) {
        return '카드';
    }
    
    $bin = substr($cardNum, 0, 4);
    
    // 주요 카드사 BIN 코드
    $binMappings = [
        '4518' => '비자',
        '4092' => '비자',
        '4569' => '비자',
        '4563' => '비자',
        '5'    => '마스터카드', // 5로 시작
        '3528' => 'JCB',
        '3529' => 'JCB',
        '3'    => '아멕스/다이너스', // 34, 37로 시작
        '9'    => '국내전용카드'
    ];
    
    // 정확한 매칭 시도
    if (isset($binMappings[$bin])) {
        return $binMappings[$bin];
    }
    
    // 첫 번째 숫자로 매칭 시도
    $firstDigit = substr($cardNum, 0, 1);
    if (isset($binMappings[$firstDigit])) {
        return $binMappings[$firstDigit];
    }
    
    return '카드';
}

/**
 * 카드사 코드 -> 이름 변환
 * 바로빌 카드사 코드 참고
 */
function getCardCompanyName($code) {
    $companies = [
        '01' => '비씨카드',
        '02' => 'KB국민카드',
        '03' => '하나카드(외환)',
        '04' => '삼성카드',
        '06' => '신한카드',
        '07' => '현대카드',
        '08' => '롯데카드',
        '11' => 'NH농협카드',
        '12' => '수협카드',
        '13' => '씨티카드',
        '14' => '우리카드',
        '15' => '광주카드',
        '16' => '전북카드',
        '21' => '하나카드',
        '22' => '제주카드',
        '23' => 'SC제일카드',
        '25' => 'KDB산업카드',
        '26' => 'IBK기업카드',
        '27' => '새마을금고',
        '28' => '신협카드',
        '29' => '저축은행',
        '30' => '우체국카드',
        '31' => '카카오뱅크',
        '32' => 'K뱅크',
        '33' => '토스뱅크',
        'BC' => '비씨카드',
        'KB' => 'KB국민카드',
        'HANA' => '하나카드',
        'SAMSUNG' => '삼성카드',
        'SHINHAN' => '신한카드',
        'HYUNDAI' => '현대카드',
        'LOTTE' => '롯데카드',
        'NH' => 'NH농협카드',
        'SUHYUP' => '수협카드',
        'CITI' => '씨티카드',
        'WOORI' => '우리카드',
        'KJBANK' => '광주카드',
        'JBBANK' => '전북카드'
    ];
    return $companies[$code] ?? $code;
}

/**
 * 카드 종류 코드 -> 이름 변환
 */
function getCardTypeName($type) {
    $types = [
        '1' => '개인카드',
        '2' => '법인카드'
    ];
    return $types[$type] ?? $type;
}

/**
 * 카드 상태 코드 -> 이름 변환
 */
function getCardStatusName($status) {
    $statuses = [
        '0' => '대기중',
        '1' => '정상',
        '2' => '해지',
        '3' => '수집오류',
        '4' => '일시중지'
    ];
    return $statuses[$status] ?? $status;
}

/**
 * 수집주기 코드 -> 이름 변환
 */
function getCollectCycleName($cycle) {
    $cycles = [
        '1' => '1일 1회',
        '2' => '1일 2회',
        '3' => '1일 3회'
    ];
    return $cycles[$cycle] ?? $cycle;
}

/**
 * 수집결과 코드 -> 이름 변환
 */
function getCollectResultName($result) {
    $results = [
        '0' => '대기',
        '1' => '성공',
        '2' => '실패',
        '3' => '진행중'
    ];
    return $results[$result] ?? $result;
}
?>

