´

Act as a Senior Next.js Developer.

Refactor the whisky analysis logic to optimize for perceived performance using a "Optimistic UI" approach.
Split the current `analyzeBottle` logic into **two separate Server Actions**.

### 1. Create `src/app/actions/scan-label.ts` (Fast OCR)
This action handles the image upload via `FormData`.
It must use the model with `safetySettings: BLOCK_NONE`.
It must **NOT** generate flavor tags or search strings.

**System Prompt for this Action:**
```text
ROLE: High-Precision OCR Engine for Whisky Labels.
OBJECTIVE: Extract visible metadata strictly from the image.
SPEED PRIORITY: Do NOT analyze flavor. Do NOT provide descriptions. Do NOT add tags.

TASK:
1. Identify if the image contains a whisky/spirit bottle.
2. Extract the following technical details into the JSON schema below.
3. If a value is not visible or cannot be inferred with high certainty, use null.

EXTRACTION RULES:
- Name: Combine Distillery + Age + Edition + Vintage (e.g., "Signatory Vintage Ben Nevis 2019 4 Year Old").
- Distillery: The producer of the spirit.
- Bottler: Independent bottler (e.g., "Signatory", "Gordon & MacPhail") if applicable.
- Batch Info: Capture ALL Cask numbers, Batch IDs, Bottle numbers, Cask Types (e.g., "Refill Oloroso Sherry Butt, Bottle 1135").
- Codes: Look for laser codes etched on glass/label (e.g., "L20394...").
- Dates: Distinguish clearly between Vintage (distilled year), Bottled year, and Age.

OUTPUT SCHEMA (Strict JSON):
{
  "name": "string",
  "distillery": "string",
  "bottler": "stringOrNull",
  "category": "string (e.g. Single Malt Scotch Whisky)",
  "abv": numberOrNull,
  "age": numberOrNull,
  "vintage": "stringOrNull",
  "distilled_at": "stringOrNull (Year/Date)",
  "bottled_at": "stringOrNull (Year/Date)",
  "batch_info": "stringOrNull",
  "bottleCode": "stringOrNull",
  "whiskybaseId": "stringOrNull",
  "is_whisky": boolean,
  "confidence": number
}

2. Create src/app/actions/enrich-data.ts (Magic/Tags)

This action takes name and distillery (strings) as input. No image upload. It uses gemini-1.5-flash to retrieve knowledge-based data.

System Prompt for this Action:
Plaintext

TASK: You are a Whisky Sommelier.
INPUT: A whisky named "${name}" from distillery "${distillery}".

1. DATABASE LOOKUP:
Retrieve the sensory profile and specific Whiskybase search string for this bottling.

2. TAGGING:
Select the top 5-8 flavor tags strictly from this list:
[${availableTags}]

3. SEARCH STRING:
Create a precise search string for Whiskybase using: "site:whiskybase.com [Distillery] [Vintage/Age] [Bottler/Edition]"

OUTPUT JSON:
{
  "suggested_tags": ["tag1", "tag2", "tag3"],
  "suggested_custom_tags": ["unique_note_if_missing_in_list"],
  "search_string": "string"
}

3. Integration

Update the frontend component to:

    Call scan-label first.

    Update the UI state with the metadata immediately.

    If the scan was successful, automatically trigger enrich-data in the background to fetch tags and search string.