import torch
import open_clip
from PIL import Image
import os

_model = None
_preprocess = None
_device = None

def get_model():
    global _model, _preprocess, _device
    if _model is None:
        _device = "cuda" if torch.cuda.is_available() else "cpu"
        # ViT-H-14 is 1024-dim
        _model, _, _preprocess = open_clip.create_model_and_transforms('ViT-H-14', pretrained='laion2b_s32b_b79k')
        _model = _model.to(_device)
        _model.eval()
    return _model, _preprocess, _device

def generate_embedding(image_path):
    model, preprocess, device = get_model()
    try:
        image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)
        with torch.no_grad():
            image_features = model.encode_image(image)
            image_features /= image_features.norm(dim=-1, keepdim=True)
            return image_features.cpu().numpy()[0].tolist()
    except Exception as e:
        print(f"Error generating embedding for {image_path}: {e}")
        return None
