<?php
  
  namespace App\Controllers;
  
  use App\Controllers\BaseController;
  use App\Models\VendorInfluencerMappingModel;
  use App\Models\UserModel;
  use CodeIgniter\HTTP\ResponseInterface;
  
  /**
   * 벤더-인플루언서 파트너십 해지 API 예제
   * 경로: POST /api/vendor-influencer/terminate
   */
  class VendorInfluencerTerminate extends BaseController
  {
    protected $vendorInfluencerModel;
    protected $userModel;
    
    public function __construct()
    {
      $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
      $this->userModel = new UserModel();
    }
    
    /**
     * 승인된 파트너십 해지 처리
     */
    public function terminate()
    {
      try {
        $request = $this->request->getJSON();
        
        $mappingSeq = $request->mappingSeq ?? null;
        $terminateReason = $request->terminateReason ?? null;
        $terminatedBy = $request->terminatedBy ?? null;
        
        // 필수 파라미터 검증
        if (!$mappingSeq || !$terminateReason || !$terminatedBy) {
          return $this->response->setStatusCode(400)->setJSON([
            'success' => false,
            'message' => '필수 파라미터가 누락되었습니다. (mappingSeq, terminateReason, terminatedBy 필요)'
          ]);
        }
        
        // 해지 사유 길이 검증
        if (strlen($terminateReason) > 500) {
          return $this->response->setStatusCode(400)->setJSON([
            'success' => false,
            'message' => '해지 사유는 500자를 초과할 수 없습니다.'
          ]);
        }
        
        // 기존 매핑 확인 (승인된 상태여야 함)
        $existingMapping = $this->vendorInfluencerModel
          ->where('SEQ', $mappingSeq)
          ->where('STATUS', 'APPROVED')
          ->where('IS_ACT', 'Y')
          ->first();
        
        if (!$existingMapping) {
          return $this->response->setStatusCode(404)->setJSON([
            'success' => false,
            'message' => '해지할 수 있는 승인된 파트너십을 찾을 수 없습니다.'
          ]);
        }
        
        // 해지 권한 확인 (벤더사 또는 관련 사용자만 해지 가능)
        $terminatingUser = $this->userModel
          ->where('SEQ', $terminatedBy)
          ->where('IS_ACT', 'Y')
          ->first();
        
        if (!$terminatingUser) {
          return $this->response->setStatusCode(400)->setJSON([
            'success' => false,
            'message' => '해지 처리자 정보를 찾을 수 없습니다.'
          ]);
        }
        
        // 해지 처리 데이터 준비
        $terminateData = [
          'STATUS' => 'TERMINATED',
          'RESPONSE_MESSAGE' => '파트너십 해지: ' . $terminateReason,
          'RESPONSE_DATE' => date('Y-m-d H:i:s'),
          'APPROVED_BY' => $terminatedBy, // 해지 처리자
          'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s'), // 파트너십 종료일
          'MOD_DATE' => date('Y-m-d H:i:s')
        ];
        
        log_message('info', "파트너십 해지 처리 시작 - 매핑 SEQ: {$mappingSeq}, 해지자: {$terminatedBy}");
        
        // 해지 처리 실행
        $result = $this->vendorInfluencerModel->update($mappingSeq, $terminateData);
        
        if (!$result) {
          log_message('error', "파트너십 해지 업데이트 실패 - 매핑 SEQ: {$mappingSeq}");
          return $this->response->setStatusCode(500)->setJSON([
            'success' => false,
            'message' => '파트너십 해지 처리 중 데이터베이스 오류가 발생했습니다.'
          ]);
        }
        
        // 해지된 매핑 정보 조회
        $terminatedMapping = $this->vendorInfluencerModel
          ->select('vim.SEQ, vim.VENDOR_SEQ, vim.INFLUENCER_SEQ, vim.STATUS,
                         vim.RESPONSE_MESSAGE, vim.RESPONSE_DATE, vim.PARTNERSHIP_END_DATE,
                         v.COMPANY_NAME as vendorName,
                         inf.NICK_NAME as influencerNickname, inf.NAME as influencerName')
          ->from('VENDOR_INFLUENCER_MAPPING vim')
          ->join('VENDOR_LIST v', 'vim.VENDOR_SEQ = v.SEQ', 'left')
          ->join('USER_LIST inf', 'vim.INFLUENCER_SEQ = inf.SEQ', 'left')
          ->where('vim.SEQ', $mappingSeq)
          ->get()
          ->getRowArray();
        
        log_message('info', "파트너십 해지 완료 - 매핑 SEQ: {$mappingSeq}");
        
        return $this->response->setJSON([
          'success' => true,
          'message' => '파트너십이 성공적으로 해지되었습니다.',
          'data' => [
            'terminatedMapping' => $terminatedMapping,
            'terminateDate' => date('Y-m-d H:i:s'),
            'terminatedBy' => $terminatingUser['NICK_NAME'] ?? $terminatingUser['NAME']
          ]
        ]);
        
      } catch (\Exception $e) {
        log_message('error', "파트너십 해지 처리 중 예외 발생: " . $e->getMessage());
        
        return $this->response->setStatusCode(500)->setJSON([
          'success' => false,
          'message' => '파트너십 해지 처리 중 오류가 발생했습니다.',
          'error' => ENVIRONMENT === 'development' ? $e->getMessage() : null
        ]);
      }
    }
  }
  
  /**
   * 라우터 설정 예제 (routes.php에 추가)
   *
   * $routes->group('api/vendor-influencer', ['namespace' => 'App\Controllers'], function($routes) {
   *     $routes->post('terminate', 'VendorInfluencerController::terminate');
   * });
   */
  
  /**
   * 프론트엔드에서 호출 예제
   *
   * const params = {
   *   mappingSeq: 123,
   *   terminateReason: "계약 조건 위반으로 인한 해지",
   *   terminatedBy: 8 // 해지 처리자 USER SEQ
   * };
   *
   * useAxios()
   *   .post('/api/vendor-influencer/terminate', params)
   *   .then((res) => {
   *     if (res.data.success) {
   *       console.log('해지 완료:', res.data.data);
   *       // 성공 처리
   *     } else {
   *       console.error('해지 실패:', res.data.message);
   *       // 실패 처리
   *     }
   *   })
   *   .catch((err) => {
   *     console.error('해지 오류:', err);
   *   });
   */
  
  /**
   * 응답 예제
   *
   * 성공시:
   * {
   *   "success": true,
   *   "message": "파트너십이 성공적으로 해지되었습니다.",
   *   "data": {
   *     "terminatedMapping": {
   *       "SEQ": 123,
   *       "VENDOR_SEQ": 8,
   *       "INFLUENCER_SEQ": 23,
   *       "STATUS": "TERMINATED",
   *       "RESPONSE_MESSAGE": "파트너십 해지: 계약 조건 위반으로 인한 해지",
   *       "RESPONSE_DATE": "2025-07-23 10:30:00",
   *       "PARTNERSHIP_END_DATE": "2025-07-23 10:30:00",
   *       "vendorName": "테스트 벤더사",
   *       "influencerNickname": "인플루언서닉네임",
   *       "influencerName": "인플루언서이름"
   *     },
   *     "terminateDate": "2025-07-23 10:30:00",
   *     "terminatedBy": "벤더관리자"
   *   }
   * }
   *
   * 실패시:
   * {
   *   "success": false,
   *   "message": "해지할 수 있는 승인된 파트너십을 찾을 수 없습니다."
   * }
   */