# -*- coding: utf-8 -*-
"""
@file : feature_extraction_model.py
@author: hsj100
@license: A2D2
@brief: 이미지 임베딩 모델 관리 정보

@section Modify History
- 2025-06-27 오후 2:07 hsj100 base

"""

"""
Basic logger: custom color logger
"""
try:
    from custom_logger.main_log import vactor_logger as log
except ImportError:
    import logging as log; log.basicConfig(level=log.DEBUG)


"""
Package: standard
"""
from abc import ABC, abstractmethod
from enum import Enum
import sys
from pydantic import BaseModel, Field, ConfigDict
from typing import Optional


"""
Package: 3rd party
"""


"""
Package: custom
"""
from custom_apps.FEATURE_VECTOR_SIMILARITY_FAISS.const import *


"""
Definition
"""

class FEMArguments(BaseModel):
    """
    특징 추출(이미지 임베딩) 모델 인수 정보
    NOTE: 모델별 추가내용 필요시, 항목 추가해서 사용
    """
    device:str = Field(default=MODEL_DEVICE_GPU, description=f'FEM 동작 장치[{MODEL_DEVICE_CPU},{MODEL_DEVICE_GPU}]')
    trained_model:str = Field(default=None, description='학습된 모델(경로 또는 파일명) FEM 모델별로 상이함')
    token:str = Field(default=None, description='FEM 사용시 필요한 token 정보')
    index_type:str = Field(default=INDEX_TYPE_L2, description=f'인덱스 타입[{INDEX_TYPE_L2}, {INDEX_TYPE_COSINE}]')

    model_config = ConfigDict(from_attributes=True)

def function_name():
    return sys._getframe(1).f_code.co_name


"""
Implementation
"""
class FeatureExtractionModel(ABC):
    """
    특징 벡터 추출 모델의 추상 인터페이스
    """

    @abstractmethod
    def load_model(self, fem_arguments:FEMArguments):
        """
        모델 초기화 및 메모리 적재
        :param fem_arguments: 모델 파라미터
        :return:
        """
        raise NotImplementedError(f'Subclasses must implement this method[{function_name()}]')

    @abstractmethod
    def release_model(self):
        """
        모델 메모리 해제
        :return:
        """
        raise NotImplementedError(f'Subclasses must implement this method[{function_name()}]')

    @abstractmethod
    def image_embedding(self, image_np):
        """
        이미지 임베딩 - 이미지 데이터(numpy)
        :param image_np: 이미지 데이터(numpy array)
        :return:
        """
        raise NotImplementedError(f'Subclasses must implement this method[{function_name()}]')


def test():
    """
    module test function
    """
    log.info('\nModule: feature_extraction_model.py')


if __name__ == '__main__':
    """
    test module
    """
    test()
