<?php

namespace App\Controllers;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\Response;

class KisoController extends BaseController
{
    /** @var RequestInterface */
    protected $request;
    
    /** @var ResponseInterface */
    protected $response;

    public function vrfcReq()
    {
        // 1. 요청 방식에 따라 데이터 파싱
        if ( $this->request->is('post') ) {
            // POST 방식: JSON Body에서 데이터 가져오기
            $data = $this->request->getJSON(true);
        } else if ( $this->request->is('get') ) {
            // GET 방식: Query Parameter에서 데이터 가져오기
            $data = $this->request->getGet();
        } else {
            // 지원하지 않는 메소드 처리 (예: PUT, DELETE 등)
            return $this->response->setStatusCode(Response::HTTP_METHOD_NOT_ALLOWED)
                                 ->setJSON(['resultCode' => 'E005', 'resultMessage' => 'Method not allowed. Use GET or POST.']);
        }

        // 2. 필수 항목 검증
        $requiredKeys = ['articleNumber', 'requestType', 'requestDatetime'];

        foreach ($requiredKeys as $key) {
            // 파싱된 데이터($data) 내에 키가 없거나 값이 비어있는지 확인
            if (empty($data[$key])) {
                return $this->response->setStatusCode(Response::HTTP_BAD_REQUEST)
                                     ->setJSON([
                                         'resultCode' => 'E001', 
                                         'resultMessage' => "Missing required parameter: {$key}"
                                     ]);
            }
        }
        
        // 3. Redis 연결 및 예외 처리
        // 3. Redis 연결 및 직접 푸시
        try {
            $redis = new \Redis();
            // Docker 환경이므로 host를 'redis'로 설정
            $success = $redis->connect('redis', 6379);

            if (!$success) {
                throw new \Exception('Redis connection failed');
            }

            $redis->select(10); // 10번 DB 선택

            // 데이터 준비
            $data['retry_count'] = 0; 

            // 리스트에 데이터 삽입 (이 명령어가 실행되어야 monitor에 LPUSH가 뜹니다)
            $redis->lPush('naver:queue', json_encode($data));

        } catch (\Exception $e) {
            log_message('error', 'Redis Push Error: ' . $e->getMessage());
            return $this->response->setStatusCode(500)->setJSON([
                'resultCode' => 'E999',
                'resultMessage' => 'Redis Connection Error'
            ]);
        }

        // 4. 성공 응답
        return $this->response->setStatusCode(Response::HTTP_ACCEPTED) // 202 Accepted
                              ->setJSON([
                                  'resultCode' => 'S000',
                                  'resultMessage' => 'Request successfully queued for processing',
                                  'articleNumber' => $data['articleNumber']
                              ]);
    }
}