from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Person, Referral
from .forms import PersonForm, ReferralForm

def home(request):
    return render(request, 'referral_system/home.html')

# People Views
@login_required
def person_list(request):
    people = Person.objects.all()
    return render(request, 'referral_system/person_list.html', {'people': people})

@login_required
def person_detail(request, pk):
    person = get_object_or_404(Person, pk=pk)
    referrals = person.referrals.all()
    return render(request, 'referral_system/person_detail.html', {'person': person, 'referrals': referrals})

@login_required
def person_create(request):
    if request.method == 'POST':
        form = PersonForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('person_list')
    else:
        form = PersonForm()
    return render(request, 'referral_system/person_form.html', {'form': form})

@login_required
def person_update(request, pk):
    person = get_object_or_404(Person, pk=pk)
    form = PersonForm(request.POST or None, instance=person)
    if form.is_valid():
        form.save()
        return redirect('person_detail', pk=pk)
    return render(request, 'referral_system/person_form.html', {'form': form})

@login_required
def person_delete(request, pk):
    person = get_object_or_404(Person, pk=pk)
    if request.method == 'POST':
        person.delete()
        return redirect('person_list')
    return render(request, 'referral_system/person_confirm_delete.html', {'person': person})

# Referral Views
@login_required
def referral_list(request):
    referrals = Referral.objects.select_related('person').all()
    return render(request, 'referral_system/referral_list.html', {'referrals': referrals})

@login_required
def referral_detail(request, pk):
    referral = get_object_or_404(Referral, pk=pk)
    return render(request, 'referral_system/referral_detail.html', {'referral': referral})

@login_required
def referral_create(request):
    if request.method == 'POST':
        form = ReferralForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('referral_list')
    else:
        form = ReferralForm()
    return render(request, 'referral_system/referral_form.html', {'form': form})

@login_required
def referral_update(request, pk):
    referral = get_object_or_404(Referral, pk=pk)
    form = ReferralForm(request.POST or None, instance=referral)
    if form.is_valid():
        form.save()
        return redirect('referral_detail', pk=pk)
    return render(request, 'referral_system/referral_form.html', {'form': form})

@login_required
def referral_delete(request, pk):
    referral = get_object_or_404(Referral, pk=pk)
    if request.method == 'POST':
        referral.delete()
        return redirect('referral_list')
    return render(request, 'referral_system/referral_confirm_delete.html', {'referral': referral})
