<?php
  
  namespace App\Models;
  
  use CodeIgniter\Model;
  
  class UserModel extends Model
  {
    protected $table = 'USER_LIST';
    protected $primaryKey = 'SEQ';
    protected $useAutoIncrement = true;
    protected $returnType = 'array';
    protected $useSoftDeletes = false;
    
    protected $allowedFields = [
      'ID',
      'PASSWORD',
      'NICK_NAME',
      'EMAIL',
      'PHONE',
      'MEMBER_TYPE',
      'STATUS',
      'LAST_LOGIN_DATE',
      'IS_ACT',
      'REG_DATE',
      'MOD_DATE',
      // 인플루언서 관련 필드들
      'INFLUENCER_TYPE',
      'PRIMARY_CATEGORY',
      'FOLLOWER_COUNT',
      'AVG_VIEWS',
      'PROFILE_IMAGE',
      'BIO',
      'INSTAGRAM_URL',
      'YOUTUBE_URL',
      'TIKTOK_URL',
      'BLOG_URL',
      'PREFERRED_REGION',
      'MIN_COMMISSION_RATE',
      'VERIFICATION_STATUS',
      'VERIFIED_DATE'
    ];
    
    protected $useTimestamps = true;
    protected $createdField = 'REG_DATE';
    protected $updatedField = 'MOD_DATE';
    
    protected $validationRules = [
      'ID' => 'required|max_length[50]|is_unique[USER_LIST.ID,SEQ,{SEQ}]',
      'PASSWORD' => 'required|min_length[8]',
      'NICK_NAME' => 'required|max_length[100]',
      'EMAIL' => 'required|valid_email|is_unique[USER_LIST.EMAIL,SEQ,{SEQ}]',
      'PHONE' => 'permit_empty|max_length[20]',
      'MEMBER_TYPE' => 'required|in_list[ADMIN,INFLUENCER,VENDOR]',
      'STATUS' => 'required|in_list[ACTIVE,INACTIVE,SUSPENDED,PENDING]',
      'IS_ACT' => 'required|in_list[Y,N]',
      'INFLUENCER_TYPE' => 'permit_empty|in_list[MACRO,MICRO,NANO,MEGA]',
      'PRIMARY_CATEGORY' => 'permit_empty|in_list[FASHION_BEAUTY,FOOD_HEALTH,LIFESTYLE,TECH_ELECTRONICS,SPORTS_LEISURE,CULTURE_ENTERTAINMENT]',
      'FOLLOWER_COUNT' => 'permit_empty|integer|greater_than_equal_to[0]',
      'AVG_VIEWS' => 'permit_empty|integer|greater_than_equal_to[0]',
      'PREFERRED_REGION' => 'permit_empty|in_list[SEOUL,GYEONGGI,INCHEON,BUSAN,DAEGU,DAEJEON,GWANGJU,ULSAN,OTHER]',
      'MIN_COMMISSION_RATE' => 'permit_empty|decimal|greater_than_equal_to[0]|less_than_equal_to[100]',
      'VERIFICATION_STATUS' => 'permit_empty|in_list[UNVERIFIED,PENDING,VERIFIED,REJECTED]'
    ];
    
    protected $validationMessages = [
      'ID' => [
        'required' => '아이디는 필수입니다.',
        'max_length' => '아이디는 50자를 초과할 수 없습니다.',
        'is_unique' => '이미 사용 중인 아이디입니다.'
      ],
      'PASSWORD' => [
        'required' => '비밀번호는 필수입니다.',
        'min_length' => '비밀번호는 최소 8자 이상이어야 합니다.'
      ],
      'NICK_NAME' => [
        'required' => '닉네임은 필수입니다.',
        'max_length' => '닉네임은 100자를 초과할 수 없습니다.'
      ],
      'EMAIL' => [
        'required' => '이메일은 필수입니다.',
        'valid_email' => '유효한 이메일 형식이 아닙니다.',
        'is_unique' => '이미 사용 중인 이메일입니다.'
      ],
      'MEMBER_TYPE' => [
        'required' => '회원 유형은 필수입니다.',
        'in_list' => '유효하지 않은 회원 유형입니다.'
      ],
      'STATUS' => [
        'required' => '상태는 필수입니다.',
        'in_list' => '유효하지 않은 상태입니다.'
      ],
      'IS_ACT' => [
        'required' => '활성 상태는 필수입니다.',
        'in_list' => '활성 상태는 Y 또는 N이어야 합니다.'
      ]
    ];
    
    protected $skipValidation = false;
    protected $cleanValidationRules = true;
    
    /**
     * 인플루언서 목록 조회
     */
    public function getInfluencers($filters = [], $page = 1, $perPage = 12)
    {
      $builder = $this->where('MEMBER_TYPE', 'INFLUENCER')
        ->where('IS_ACT', 'Y')
        ->where('STATUS', 'ACTIVE');
      
      // 키워드 검색
      if (!empty($filters['keyword'])) {
        $builder->groupStart()
          ->like('NICK_NAME', $filters['keyword'])
          ->orLike('ID', $filters['keyword'])
          ->groupEnd();
      }
      
      // 카테고리 필터
      if (!empty($filters['category'])) {
        $builder->where('PRIMARY_CATEGORY', $filters['category']);
      }
      
      // 인플루언서 타입 필터
      if (!empty($filters['influencer_type'])) {
        $builder->where('INFLUENCER_TYPE', $filters['influencer_type']);
      }
      
      // 팔로워 수 범위
      if (!empty($filters['follower_min'])) {
        $builder->where('FOLLOWER_COUNT >=', $filters['follower_min']);
      }
      if (!empty($filters['follower_max'])) {
        $builder->where('FOLLOWER_COUNT <=', $filters['follower_max']);
      }
      
      // 페이징
      $offset = ($page - 1) * $perPage;
      return $builder->limit($perPage, $offset)->findAll();
    }
    
    /**
     * 인플루언서 검색 결과 총 개수
     */
    public function countInfluencers($filters = [])
    {
      $builder = $this->where('MEMBER_TYPE', 'INFLUENCER')
        ->where('IS_ACT', 'Y')
        ->where('STATUS', 'ACTIVE');
      
      // 키워드 검색
      if (!empty($filters['keyword'])) {
        $builder->groupStart()
          ->like('NICK_NAME', $filters['keyword'])
          ->orLike('ID', $filters['keyword'])
          ->groupEnd();
      }
      
      // 카테고리 필터
      if (!empty($filters['category'])) {
        $builder->where('PRIMARY_CATEGORY', $filters['category']);
      }
      
      // 인플루언서 타입 필터
      if (!empty($filters['influencer_type'])) {
        $builder->where('INFLUENCER_TYPE', $filters['influencer_type']);
      }
      
      // 팔로워 수 범위
      if (!empty($filters['follower_min'])) {
        $builder->where('FOLLOWER_COUNT >=', $filters['follower_min']);
      }
      if (!empty($filters['follower_max'])) {
        $builder->where('FOLLOWER_COUNT <=', $filters['follower_max']);
      }
      
      return $builder->countAllResults();
    }
    
    /**
     * 인플루언서 타입별 통계
     */
    public function getInfluencerTypeStats()
    {
      return $this->select('INFLUENCER_TYPE, COUNT(*) as count')
        ->where('MEMBER_TYPE', 'INFLUENCER')
        ->where('IS_ACT', 'Y')
        ->where('STATUS', 'ACTIVE')
        ->groupBy('INFLUENCER_TYPE')
        ->findAll();
    }
    
    /**
     * 카테고리별 인플루언서 통계
     */
    public function getInfluencerCategoryStats()
    {
      return $this->select('PRIMARY_CATEGORY, COUNT(*) as count')
        ->where('MEMBER_TYPE', 'INFLUENCER')
        ->where('IS_ACT', 'Y')
        ->where('STATUS', 'ACTIVE')
        ->groupBy('PRIMARY_CATEGORY')
        ->findAll();
    }
    
    /**
     * 사용자 로그인
     */
    public function authenticate($id, $password)
    {
      $user = $this->where('ID', $id)
        ->where('IS_ACT', 'Y')
        ->first();
      
      if ($user && password_verify($password, $user['PASSWORD'])) {
        // 로그인 날짜 업데이트
        $this->update($user['SEQ'], ['LAST_LOGIN_DATE' => date('Y-m-d H:i:s')]);
        return $user;
      }
      
      return false;
    }
  }