import os
import re
import pandas as pd
from flask import Flask, render_template_string, request, session, redirect, url_for

app = Flask(__name__)
app.secret_key = 'dfz_lab_nutrition_secret_key'

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
IRANIAN_FILE = os.path.join(BASE_DIR, "Iranian foods.xlsx")
OTHER_FILE = os.path.join(BASE_DIR, "Whole_Foods_Nutrients .xlsx")

def safe_float(val):
    if pd.isna(val):
        return 0.0
    if isinstance(val, (int, float)):
        return float(val)
    s = str(val).strip().replace(',', '')
    numbers = re.findall(r'[-+]?\d*\.\d+|\d+', s)
    if numbers:
        try:
            return float(numbers[0])
        except:
            return 0.0
    return 0.0

def to_persian_digits(val):
    if pd.isna(val):
        return ""
    if isinstance(val, (int, float)):
        s = f"{val:.2f}" if isinstance(val, float) else str(val)
        if s.endswith('.00'):
            s = s[:-3]
    else:
        s = str(val)
    return s.translate(str.maketrans("0123456789", "۰۱۲۳۴۵۶۷۸۹"))

def load_data():
    df_iranian = pd.read_excel(IRANIAN_FILE)
    df_other = pd.read_excel(OTHER_FILE)
    if len(df_other) > 0 and ("Energy" in str(df_other.iloc[0].values) or "kcal" in str(df_other.iloc[0].values)):
        df_other = df_other.iloc[1:].reset_index(drop=True)
    return df_iranian, df_other

df_iranian, df_other = load_data()

exact_nutrients_order = [
    "انرژی (کیلوکالری)", "پروتئین (گرم)", "چربی کل (گرم)", "کربوهیدرات (با اختلاف) (گرم)", 
    "آب (گرم)", "فیبر، کل رژیم غذایی (گرم)", "کلسیم (میلی‌گرم)", "آهن (میلی گرم)", 
    "منیزیم (میلی‌گرم)", "فسفر (P) (میلی‌گرم)", "پتاسیم (میلی‌گرم)", "سدیم (Na) (میلی گرم)", 
    "روی (Zn) (میلی‌گرم)", "مس (میلی گرم)", "منگنز (میلی‌گرم)", "سلنیوم (Se) (میکروگرم)", 
    "ویتامین A واحد (IU)", "ویتامین D واحد (IU)", "ویتامین E (میلی‌گرم)", "ویتامین K (میکروگرم)", 
    "ویتامین C (میلی‌گرم)", "تیامین (B1) (میلی‌گرم)", "ریبوفلاوین (B2) (میلی‌گرم)", "نیاسین (B3) (میلی‌گرم)", 
    "اسید پانتوتنیک (B5) (میلی گرم)", "ویتامین B6 (میلی‌گرم)", "بیوتین (میکروگرم)", "فولات (B9) (میکروگرم)", 
    "ویتامین B12 (میکروگرم)", "کولین (میلی‌گرم)", "امگا ۳ (میلی‌گرم)", "کلسترول (میلی‌گرم)", "نمک (گرم)"
]

nutrient_mapping = {
    "Energy (kcal)": "انرژی (کیلوکالری)", "Protein (g)": "پروتئین (گرم)", 
    "Total lipid (fat) (g)": "چربی کل (گرم)", "Carbohydrate (by difference) (g)": "کربوهیدرات (با اختلاف) (گرم)", 
    "Water  (g)": "آب (گرم)", "Fiber, total dietary  (g)": "فیبر، کل رژیم غذایی (گرم)", 
    "Calcium (Ca) (mg)": "کلسیم (میلی‌گرم)", "Iron (Fe)(mg)": "آهن (میلی گرم)", 
    "Magnesium (mg)": "منیزیم (میلی‌گرم)", "Phosphorus (P)(mg)": "فسفر (P) (میلی‌گرم)", 
    "Potassium (K)(mg)": "پتاسیم (میلی‌گرم)", "Sodium (Na)(mg)": "سدیم (Na) (میلی گرم)", 
    "Zinc (Zn)(mg)": "روی (Zn) (میلی‌گرم)", "Copper (Cu)(mg)": "مس (میلی گرم)", 
    "Manganese (Mn)(mg)": "منگنز (میلی‌گرم)", "Selenium (Se)(µg)": "سلنیوم (Se) (میکروگرم)", 
    "Vitamin A (IU)": "ویتامین A واحد (IU)", "Vitamin D (IU)": "ویتامین D واحد (IU)", 
    "Vitamin E (mg)": "ویتامین E (میلی‌گرم)", "Vitamin K (µg)": "ویتامین K (میکروگرم)", 
    "Vitamin C (mg)": "ویتامین C (میلی‌گرم)", "Thiamin (B1) (mg)": "تیامین (B1) (میلی‌گرم)", 
    "Riboflavin (B2) (mg)": "ریبوفلاوین (B2) (میلی‌گرم)", "Niacin (B3) (mg)": "نیاسین (B3) (میلی‌گرم)", 
    "Pantothenic acid (B5)(mg)": "اسید پانتوتنیک (B5) (میلی گرم)", "B6(mg)": "ویتامین B6 (میلی‌گرم)", 
    "Biotin (µg)": "بیوتین (میکروگرم)", "Folate (B9)(µg)": "فولات (B9) (میکروگرم)", 
    "B12 (µg)": "ویتامین B12 (میکروگرم)", "Choline (mg)": "کولین (میلی‌گرم)", 
    "Omega 3(mg)": "امگا ۳ (میلی‌گرم)", "Cholestrol (mg)": "کلسترول (میلی‌گرم)", "Salt (g)": "نمک (گرم)"
}

HTML_TEMPLATE = """
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
    <meta charset="UTF-8">
    <title>محاسبه‌گر ارزش غذایی و کالری - آزمایشگاه DFZ</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/Vazirmatn-font-face.css">
    <style>
        body { font-family: 'Vazirmatn', sans-serif !important; background-color: #f9fafb; margin: 0; padding: 20px; direction: rtl; text-align: right; color: #1f2937; }
        .container { max-width: 1200px; margin: 0 auto; background: white; padding: 30px; border-radius: 12px; box-shadow: 0 4px 6px rgba(0,0,0,0.05); }
        h1, h2, h3 { color: #111827; }
        label { display: block; margin-bottom: 8px; font-weight: 500; }
        select, input { width: 100%; padding: 10px; border: 1px solid #d1d5db; border-radius: 8px; font-family: 'Vazirmatn'; font-size: 14px; }
        button { background-color: #10b981; color: white; border: none; padding: 12px 20px; border-radius: 8px; font-family: 'Vazirmatn'; font-size: 15px; cursor: pointer; width: 100%; font-weight: bold; }
        button:hover { background-color: #059669; }
        .btn-danger { background-color: #ef4444; padding: 5px 10px; font-size: 12px; width: auto; }
        .btn-danger:hover { background-color: #dc2626; }
        table { width: 100%; border-collapse: collapse; margin-top: 15px; }
        th, td { border: 1px solid #e5e7eb; padding: 10px; text-align: right; font-size: 14px; }
        th { background-color: #f3f4f6; }
        .metric-card { background: #f0fdf4; border: 1px solid #bbf7d0; padding: 15px; border-radius: 8px; display: inline-block; margin-bottom: 20px; }
    </style>
</head>
<body>
<div class="container">
    <h1>🥗 محاسبه‌گر ارزش غذایی و کالری</h1>
    <p>با انتخاب غذاها و مقدار مصرف، مجموع انرژی و ارزش غذایی سبد خود را محاسبه کنید.</p>
    <hr style="border: 0; border-top: 1px solid #e5e7eb; margin: 20px 0;">

    <form method="POST" action="/add">
        <div style="display: flex; gap: 20px;">
            <div style="flex: 1;">
                <label>دسته‌بندی غذا را انتخاب کنید:</label>
                <select name="category" onchange="this.form.submit()">
                    <option value="ایرانی" {% if category == 'ایرانی' %}selected{% endif %}>غذاهای ایرانی</option>
                    <option value="سایر" {% if category == 'سایر' %}selected{% endif %}>غذاهای دیگر</option>
                </select>
            </div>
            <div style="flex: 2;">
                <label>نام غذا را انتخاب کنید:</label>
                <select name="food_name">
                    {% for f in food_list %}
                        <option value="{{ f }}" {% if f == selected_food %}selected{% endif %}>{{ f }}</option>
                    {% endfor %}
                </select>
            </div>
        </div>
        <div style="margin-top: 15px;">
            <label>مقدار مصرف (پرس یا گرم):</label>
            <input type="number" step="0.25" name="amount" value="{{ default_amount }}" required>
        </div>
        <div style="margin-top: 15px;">
            <button type="submit">➕ افزودن به سبد غذایی</button>
        </div>
    </form>

    <hr style="border: 0; border-top: 1px solid #e5e7eb; margin: 30px 0;">

    <h2>🛒 سبد غذایی شما</h2>
    {% if not cart %}
        <p style="color: #6b7280;">سبد غذایی شما در حال حاضر خالی است.</p>
    {% else %}
        <table>
            <tr>
                <th>ردیف</th>
                <th>نام غذا</th>
                <th>مقدار</th>
                <th>عملیات</th>
            </tr>
            {% for item in cart %}
            <tr>
                <td>{{ loop.index }}</td>
                <td>{{ item.food_name }} ({{ item.source }})</td>
                <td>{{ item.amount_label }}</td>
                <td><a href="/remove/{{ loop.index0 }}"><button class="btn-danger">🗑️ حذف</button></a></td>
            </tr>
            {% endfor %}
        </table>

        <div style="margin-top: 30px;">
            <div class="metric-card">
                <h3 style="margin: 0; color: #166534;">🔥 کالری کل سبد: {{ total_cal }} کیلوکالری</h3>
            </div>
            
            <h2>📊 جدول کامل تمامی ریزمغذی‌ها، املاح و ویتامین‌ها</h2>
            <table>
                <tr>
                    <th>شاخص غذایی</th>
                    <th>مقدار کل</th>
                </tr>
                {% for k, v in total_nutrients.items() %}
                <tr>
                    <td><strong>{{ k }}</strong></td>
                    <td>{{ v }}</td>
                </tr>
                {% endfor %}
            </table>
        </div>
    {% endif %}
</div>
</body>
</html>
"""

@app.route('/', methods=['GET', 'POST'])
def index():
    if 'cart' not in session:
        session['cart'] = []
    category = request.form.get('category', 'ایرانی')
    if category == 'ایرانی':
        name_col = [c for c in df_iranian.columns if 'نام' in str(c)][0]
        food_list = df_iranian[name_col].dropna().unique().tolist()
    else:
        name_col = [c for c in df_other.columns if 'نام' in str(c)][0]
        food_list = df_other[name_col].dropna().unique().tolist()
    selected_food = food_list[0] if food_list else ""
    return render_template_string(HTML_TEMPLATE, category=category, food_list=food_list, selected_food=selected_food, default_amount=1.0, cart=session.get('cart', []), total_cal=0, total_nutrients={})

@app.route('/add', methods=['POST'])
def add():
    category = request.form.get('category', 'ایرانی')
    food_name = request.form.get('food_name')
    amount = float(request.form.get('amount', 1.0))
    item_nutrients = {}
    if category == 'ایرانی':
        name_col = [c for c in df_iranian.columns if 'نام' in str(c)][0]
        row = df_iranian[df_iranian[name_col] == food_name].iloc[0]
        factor = amount
        amount_label = f"{to_persian_digits(amount)} پرس"
        for ir_col, fa_col in nutrient_mapping.items():
            if ir_col in row:
                item_nutrients[fa_col] = safe_float(row[ir_col])
    else:
        name_col = [c for c in df_other.columns if 'نام' in str(c)][0]
        row = df_other[df_other[name_col] == food_name].iloc[0]
        factor = amount / 100.0
        amount_label = f"{to_persian_digits(amount)} گرم"
        for fa_col in nutrient_mapping.values():
            match_cols = [c for c in df_other.columns if fa_col in str(c)]
            if match_cols:
                item_nutrients[fa_col] = safe_float(row[match_cols[0]])

    if 'cart' not in session:
        session['cart'] = []
    cart = session['cart']
    cart.append({"source": category, "food_name": food_name, "amount_label": amount_label, "factor": factor, "nutrients": item_nutrients})
    session['cart'] = cart
    return redirect(url_for('calculate'))

@app.route('/calculate')
def calculate():
    cart = session.get('cart', [])
    total_nutrients_raw = {nut: 0.0 for nut in exact_nutrients_order}
    for item in cart:
        factor = item["factor"]
        for nutrient, val in item["nutrients"].items():
            if nutrient in total_nutrients_raw:
                total_nutrients_raw[nutrient] += val * factor
    cal_val = to_persian_digits(round(total_nutrients_raw.get("انرژی (کیلوکالری)", 0.0), 2))
    formatted_nutrients = {k: to_persian_digits(round(v, 2)) for k, v in total_nutrients_raw.items()}
    name_col = [c for c in df_iranian.columns if 'نام' in str(c)][0]
    food_list = df_iranian[name_col].dropna().unique().tolist()
    return render_template_string(HTML_TEMPLATE, category='ایرانی', food_list=food_list, selected_food=food_list[0] if food_list else "", default_amount=1.0, cart=cart, total_cal=cal_val, total_nutrients=formatted_nutrients)

@app.route('/remove/<int:idx>')
def remove(idx):
    cart = session.get('cart', [])
    if 0 <= idx < len(cart):
        cart.pop(idx)
        session['cart'] = cart
    return redirect(url_for('calculate'))

if __name__ == '__main__':
    app.run()