<?php

namespace App\Services\ParameterMapper;

/**
 * 파라미터 매퍼 기본 추상 클래스
 * 네이버 API 응답을 데이터베이스 파라미터로 변환하는 로직을 정의
 */
abstract class BaseParameterMapper
{
    protected $db;
    
    public function __construct()
    {
        $this->db = \Config\Database::connect();
        helper('log');
    }
    
    /**
     * 추상 메서드: 매핑 로직 구현
     */
    abstract public function map(string $articleNumber, array $rawData, array $payload): array;
    
    /**
     * 소유자 타입 코드 변환
     */
    protected function mapOwnerTypeCode(?string $ownerTypeCodeRaw): ?int
    {
        return match($ownerTypeCodeRaw) {
            "INDIV" => 0,
            "CORP"  => 1,
            "FRGNR" => 2,
            "DELEG" => 3,
            default => null,
        };
    }
    
    /**
     * 거래 유형 변환
     */
    protected function mapTradeType(?string $tradeType): ?string
    {
        return match(trim($tradeType ?? '')) {
            '매매' => 'A1',
            '전세' => 'B1',
            '월세' => 'B2',
            '단기임대' => 'B3',
            default => null,
        };
    }
    
    /**
     * 파일 배열 추출 (save_yn 플래그 포함)
     */
    public function extractFilesByType(array $files): array
    {
        $certRegister = [];
        $confirmDocImgUrl = [];
        $referenceFileUrl = [];
        
        foreach ($files as $file) {
            $fileTypeCode = $file['fileTypeCode'] ?? '';
            $fileUrl = $file['originalFileUrl'] ?? '';
            
            switch ($fileTypeCode) {
                case 'RCDOC':
                    $certRegister[] = $fileUrl;
                    break;
                case 'ADDOC':
                    $confirmDocImgUrl[] = $fileUrl;
                    break;
                case 'REFER':
                    $referenceFileUrl[] = $fileUrl;
                    break;
            }
        }
        
        return [
            'certRegister' => $certRegister,
            'confirmDocImgUrl' => $confirmDocImgUrl,
            'referenceFileUrl' => $referenceFileUrl,
            'cert_register_save_yn' => !empty($certRegister) ? 'Y' : 'N',
            'confirm_doc_img_url_save_yn' => !empty($confirmDocImgUrl) ? 'Y' : 'N',
            'reference_file_url_save_yn' => !empty($referenceFileUrl) ? 'Y' : 'N',
        ];
    }
    
    /**
     * 파일 URL을 v2_url_img_save 테이블에 저장
     * @param array $files 파일 배열
     * @param string $atclNo 매물번호
     * @param int $vrSq 검증요청순번
     */
    protected function saveUrlImagesToDb(array $files, string $atclNo, int $vrSq): bool
    {
        if (empty($files)) {
            return true;
        }

        $urlImgModel = new \App\Models\Entities\V2urlimgsaveModel();
        
        foreach ($files as $file) {
            $fileTypeCode = $file['fileTypeCode'] ?? '';
            $fileUrl = $file['originalFileUrl'] ?? '';
            
            if (empty($fileUrl)) {
                continue;
            }
            
            // type 매핑: RCDOC, ADDOC = 2(등기), REFER = 1(홍보)
            $type = in_array($fileTypeCode, ['RCDOC', 'ADDOC']) ? '2' : '1';
            
            $data = [
                'url'       => $fileUrl,
                'type'      => $type,
                'atcl_no'   => $atclNo,
                'vr_sq'     => $vrSq,
                'status'    => 'save',
                'try_cnt'   => 0,
                'server_nm' => gethostname(),
            ];
            
            if (!$urlImgModel->insert($data)) {
                write_custom_log("URL 이미지 저장 실패: " . json_encode($data), 'ERROR', 'service');
                return false;
            }
        }
        
        return true;
    }
    
    /**
     * 필수 필드 안전하게 로드
     */
    protected function getSafeData(array $data, string $key, $default = null)
    {
        return $data[$key] ?? $default;
    }
}
