import OpenAI from 'openai';
import { Platform } from 'react-native';
import { AiRecognitionResult, ItemCategory } from '../types';

const client = new OpenAI({
  apiKey: process.env.EXPO_PUBLIC_OPENAI_API_KEY ?? '',
  dangerouslyAllowBrowser: true,
});

const PROMPT = `Du bist ein Assistent für eine Haushalts-App. Analysiere das Foto und erkenne den abgebildeten Artikel.

Antworte NUR mit gültigem JSON in diesem Format:
{
  "name": "Artikelname (kurz, auf Deutsch)",
  "description": "Kurze Beschreibung in einem Satz auf Deutsch",
  "category": "food | cleaning | hygiene | other"
}

Kategorien:
- food: Lebensmittel, Getränke
- cleaning: Reinigungsmittel, Putzmittel
- hygiene: Körperpflege, Hygieneartikel
- other: Alles andere

Falls du den Artikel nicht erkennen kannst, nutze category "other" und name "Unbekannter Artikel".`;

async function toBase64(uri: string): Promise<string> {
  if (Platform.OS === 'web') {
    const res = await fetch(uri);
    const blob = await res.blob();
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onloadend = () => resolve((reader.result as string).split(',')[1]);
      reader.onerror = reject;
      reader.readAsDataURL(blob);
    });
  }
  const { readAsStringAsync } = await import('expo-file-system');
  return readAsStringAsync(uri, { encoding: 'base64' });
}

export async function recognizeItemFromPhoto(photoUri: string): Promise<AiRecognitionResult> {
  const base64 = await toBase64(photoUri);

  const response = await client.chat.completions.create({
    model: 'gpt-4o-mini',
    max_tokens: 200,
    messages: [
      {
        role: 'user',
        content: [
          {
            type: 'image_url',
            image_url: {
              url: `data:image/jpeg;base64,${base64}`,
              detail: 'low',
            },
          },
          { type: 'text', text: PROMPT },
        ],
      },
    ],
  });

  const text = response.choices[0]?.message?.content ?? '';

  try {
    const jsonMatch = text.match(/\{[\s\S]*\}/);
    if (!jsonMatch) throw new Error('No JSON in response');
    const parsed = JSON.parse(jsonMatch[0]);
    return {
      name: String(parsed.name ?? 'Unbekannter Artikel'),
      description: String(parsed.description ?? ''),
      category: (['food', 'cleaning', 'hygiene', 'other'].includes(parsed.category)
        ? parsed.category
        : 'other') as ItemCategory,
    };
  } catch {
    return { name: 'Unbekannter Artikel', description: '', category: 'other' };
  }
}
