<?php
  
  /**
   * 벤더-인플루언서 재승인요청 API 예제
   *
   * 기능: 해지된 파트너십에 대한 재계약 요청 처리
   * 경로: POST /api/vendor-influencer/reapply-request
   */
  
  namespace App\Controllers;
  
  use App\Controllers\BaseController;
  use App\Models\VendorModel;
  use App\Models\UserModel;
  use App\Models\VendorInfluencerMappingModel;
  use CodeIgniter\HTTP\ResponseInterface;
  
  class VendorInfluencerController extends BaseController
  {
    protected $vendorModel;
    protected $userModel;
    protected $vendorInfluencerModel;
    
    public function __construct()
    {
      $this->vendorModel = new VendorModel();
      $this->userModel = new UserModel();
      $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
    }
    
    /**
     * 재승인 요청 (해지된 파트너십에 대한 재계약 요청)
     *
     * @route POST /api/vendor-influencer/reapply-request
     * @param int vendorSeq 벤더사 SEQ
     * @param int influencerSeq 인플루언서 SEQ
     * @param string requestMessage 요청 메시지
     * @param int requestedBy 요청자 SEQ (인플루언서)
     *
     * @return JSON
     */
    public function reapplyRequest()
    {
      try {
        $request = $this->request->getJSON();
        
        $vendorSeq = $request->vendorSeq ?? null;
        $influencerSeq = $request->influencerSeq ?? null;
        $requestMessage = $request->requestMessage ?? '';
        $requestedBy = $request->requestedBy ?? null;
        
        // 필수 파라미터 검증
        if (!$vendorSeq || !$influencerSeq || !$requestedBy) {
          return $this->response->setStatusCode(400)->setJSON([
            'success' => false,
            'message' => '필수 파라미터가 누락되었습니다.'
          ]);
        }
        
        // 기존 해지된 파트너십 확인
        $terminatedPartnership = $this->vendorInfluencerModel
          ->where('VENDOR_SEQ', $vendorSeq)
          ->where('INFLUENCER_SEQ', $influencerSeq)
          ->where('STATUS', 'TERMINATED')
          ->where('IS_ACT', 'Y')
          ->orderBy('REG_DATE', 'DESC')
          ->first();
        
        if (!$terminatedPartnership) {
          return $this->response->setStatusCode(404)->setJSON([
            'success' => false,
            'message' => '해지된 파트너십 기록을 찾을 수 없습니다.'
          ]);
        }
        
        // 현재 처리 중인 요청이 있는지 확인
        $existingPendingRequest = $this->vendorInfluencerModel
          ->where('VENDOR_SEQ', $vendorSeq)
          ->where('INFLUENCER_SEQ', $influencerSeq)
          ->where('STATUS', 'PENDING')
          ->where('IS_ACT', 'Y')
          ->first();
        
        if ($existingPendingRequest) {
          return $this->response->setStatusCode(409)->setJSON([
            'success' => false,
            'message' => '이미 처리 중인 승인 요청이 있습니다.'
          ]);
        }
        
        // 재승인 요청 생성
        $reapplyData = [
          'VENDOR_SEQ' => $vendorSeq,
          'INFLUENCER_SEQ' => $influencerSeq,
          'REQUEST_TYPE' => 'INFLUENCER_REQUEST',
          'STATUS' => 'PENDING',
          'REQUEST_MESSAGE' => '[재계약 요청] ' . $requestMessage,
          'REQUESTED_BY' => $requestedBy,
          'COMMISSION_RATE' => $terminatedPartnership['COMMISSION_RATE'], // 이전 수수료율 유지
          'SPECIAL_CONDITIONS' => $terminatedPartnership['SPECIAL_CONDITIONS'], // 이전 특별조건 유지
          'EXPIRED_DATE' => date('Y-m-d H:i:s', strtotime('+7 days')),
          'ADD_INFO1' => 'REAPPLY', // 재신청 구분자
          'ADD_INFO2' => $terminatedPartnership['SEQ'], // 이전 파트너십 SEQ 참조
          'ADD_INFO3' => date('Y-m-d H:i:s') // 재신청 일시
        ];
        
        $insertId = $this->vendorInfluencerModel->insert($reapplyData);
        
        // 생성된 재승인 요청 정보 조회
        $createdReapply = $this->vendorInfluencerModel
          ->select('vim.*, v.COMPANY_NAME as vendorName, u.NICK_NAME as influencerName, req_user.NICK_NAME as requestedByName')
          ->from('VENDOR_INFLUENCER_MAPPING vim')
          ->join('VENDOR_LIST v', 'vim.VENDOR_SEQ = v.SEQ', 'left')
          ->join('USER_LIST u', 'vim.INFLUENCER_SEQ = u.SEQ', 'left')
          ->join('USER_LIST req_user', 'vim.REQUESTED_BY = req_user.SEQ', 'left')
          ->where('vim.SEQ', $insertId)
          ->get()
          ->getRowArray();
        
        return $this->response->setJSON([
          'success' => true,
          'message' => '재승인 요청이 성공적으로 생성되었습니다.',
          'data' => [
            'reapplyRequest' => $createdReapply,
            'previousPartnership' => $terminatedPartnership
          ]
        ]);
        
      } catch (\Exception $e) {
        return $this->response->setStatusCode(500)->setJSON([
          'success' => false,
          'message' => '재승인 요청 생성 중 오류가 발생했습니다.',
          'error' => ENVIRONMENT === 'development' ? $e->getMessage() : null
        ]);
      }
    }
  }
  
  /*
  사용 예시:
  
  POST /api/vendor-influencer/reapply-request
  Content-Type: application/json
  
  {
      "vendorSeq": 8,
      "influencerSeq": 15,
      "requestMessage": "이전 계약이 만료되어 재계약을 요청드립니다. 새로운 프로모션 진행을 위해 파트너십을 재개하고 싶습니다.",
      "requestedBy": 15
  }
  
  응답 예시:
  {
      "success": true,
      "message": "재승인 요청이 성공적으로 생성되었습니다.",
      "data": {
          "reapplyRequest": {
              "SEQ": 25,
              "VENDOR_SEQ": 8,
              "INFLUENCER_SEQ": 15,
              "REQUEST_TYPE": "INFLUENCER_REQUEST",
              "STATUS": "PENDING",
              "REQUEST_MESSAGE": "[재계약 요청] 이전 계약이 만료되어 재계약을 요청드립니다...",
              "REQUESTED_BY": 15,
              "COMMISSION_RATE": 10.5,
              "SPECIAL_CONDITIONS": "월 2회 포스팅",
              "EXPIRED_DATE": "2024-01-20 10:30:00",
              "ADD_INFO1": "REAPPLY",
              "ADD_INFO2": "23",
              "ADD_INFO3": "2024-01-13 10:30:00",
              "vendorName": "뷰티코리아",
              "influencerName": "뷰티블로거",
              "requestedByName": "뷰티블로거"
          },
          "previousPartnership": {
              "SEQ": 23,
              "STATUS": "TERMINATED",
              "PARTNERSHIP_END_DATE": "2024-01-10 15:20:00"
          }
      }
  }
  */ 