from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from datetime import date, timedelta
from .models import Journee, Repas, CompositionRepas, Aliment, TypeJournee, TypeRepas
from .forms import JourneeForm, RepasForm, CompositionRepasForm

def index(request):
    """Page d'accueil avec explications du carb-cycling"""
    return render(request, 'nutrition/index.html')

@login_required
def tableau_de_bord(request):
    """Tableau de bord affichant les journées de la semaine"""
    aujourdhui = date.today()
    debut_semaine = aujourdhui - timedelta(days=aujourdhui.weekday())
    fin_semaine = debut_semaine + timedelta(days=6)
    
    journees = Journee.objects.filter(
        user=request.user,
        date__gte=debut_semaine,
        date__lte=fin_semaine
    ).prefetch_related('repas__compositions__aliment')
    
    # Créer un dictionnaire des journées par date
    journees_dict = {j.date: j for j in journees}
    
    # Générer les 7 jours de la semaine
    semaine = []
    for i in range(7):
        jour = debut_semaine + timedelta(days=i)
        semaine.append({
            'date': jour,
            'journee': journees_dict.get(jour)
        })
    
    context = {
        'semaine': semaine,
        'debut_semaine': debut_semaine,
        'fin_semaine': fin_semaine,
    }
    return render(request, 'nutrition/tableau_de_bord.html', context)

@login_required
def creer_journee(request, date_str=None):
    """Créer une nouvelle journée"""
    if date_str:
        date_journee = date.fromisoformat(date_str)
    else:
        date_journee = date.today()
    
    if request.method == 'POST':
        form = JourneeForm(request.POST)
        if form.is_valid():
            journee = form.save(commit=False)
            journee.user = request.user
            journee.date = date_journee
            journee.save()
            messages.success(request, 'Journée créée avec succès!')
            return redirect('detail_journee', pk=journee.pk)
    else:
        form = JourneeForm(initial={'date': date_journee})
    
    return render(request, 'nutrition/creer_journee.html', {
        'form': form,
        'date_journee': date_journee
    })

@login_required
def detail_journee(request, pk):
    """Détail d'une journée avec ses repas"""
    journee = get_object_or_404(Journee, pk=pk, user=request.user)
    repas = journee.repas.all().prefetch_related('compositions__aliment')
    
    # Calculer les apports recommandés selon le type de journée
    recommandations = get_recommandations(journee.type_journee)
    
    context = {
        'journee': journee,
        'repas': repas,
        'recommandations': recommandations,
    }
    return render(request, 'nutrition/detail_journee.html', context)

def get_recommandations(type_journee):
    """Retourne les recommandations selon le type de journée"""
    if type_journee == TypeJournee.PAUVRE:
        return {
            'titre': 'Journée pauvre en glucides',
            'glucides': '0-1 apport',
            'proteines': '3-4 apports',
            'lipides': '3-4 apports',
            'legumes': 'Sans modération',
            'description': 'Privilégiez les protéines et les lipides. Limitez les glucides au maximum.'
        }
    elif type_journee == TypeJournee.NORMAL:
        return {
            'titre': 'Journée normale',
            'glucides': '2-3 apports',
            'proteines': '3-4 apports',
            'lipides': '2-3 apports',
            'legumes': 'Sans modération',
            'description': 'Équilibre entre glucides, protéines et lipides.'
        }
    else:  # RICHE
        return {
            'titre': 'Journée riche en glucides',
            'glucides': '4-5 apports',
            'proteines': '3-4 apports',
            'lipides': '1-2 apports',
            'legumes': 'Sans modération',
            'description': 'Rechargez vos batteries! Privilégiez les glucides, réduisez les lipides.'
        }

@login_required
def ajouter_repas(request, journee_pk):
    """Ajouter un repas à une journée"""
    journee = get_object_or_404(Journee, pk=journee_pk, user=request.user)
    
    if request.method == 'POST':
        form = RepasForm(request.POST)
        if form.is_valid():
            repas = form.save(commit=False)
            repas.journee = journee
            repas.save()
            messages.success(request, 'Repas ajouté avec succès!')
            return redirect('detail_repas', pk=repas.pk)
    else:
        form = RepasForm()
    
    return render(request, 'nutrition/ajouter_repas.html', {
        'form': form,
        'journee': journee
    })

@login_required
def detail_repas(request, pk):
    """Détail d'un repas avec sa composition"""
    repas = get_object_or_404(Repas, pk=pk, journee__user=request.user)
    compositions = repas.compositions.all().select_related('aliment')
    
    return render(request, 'nutrition/detail_repas.html', {
        'repas': repas,
        'compositions': compositions,
    })

@login_required
def ajouter_aliment_repas(request, repas_pk):
    """Ajouter un aliment à un repas"""
    repas = get_object_or_404(Repas, pk=repas_pk, journee__user=request.user)
    
    if request.method == 'POST':
        form = CompositionRepasForm(request.POST)
        if form.is_valid():
            composition = form.save(commit=False)
            composition.repas = repas
            composition.save()
            messages.success(request, 'Aliment ajouté!')
            return redirect('detail_repas', pk=repas.pk)
    else:
        form = CompositionRepasForm()
    
    return render(request, 'nutrition/ajouter_aliment.html', {
        'form': form,
        'repas': repas
    })

def guide_carb_cycling(request):
    """Page explicative du carb-cycling"""
    return render(request, 'nutrition/guide.html')

def liste_aliments(request):
    """Liste des aliments par catégorie"""
    aliments = Aliment.objects.all()
    
    # Regrouper par catégorie
    aliments_par_categorie = {}
    for aliment in aliments:
        categorie = aliment.get_categorie_display()
        if categorie not in aliments_par_categorie:
            aliments_par_categorie[categorie] = []
        aliments_par_categorie[categorie].append(aliment)
    
    return render(request, 'nutrition/liste_aliments.html', {
        'aliments_par_categorie': aliments_par_categorie
    })
