from django.shortcuts import render,get_object_or_404,redirect
from .models import *
from django.http import JsonResponse,Http404
import random

#mail alma işlemi
from django.conf import settings
from django.core.mail import send_mail
from django.contrib import messages
from django.urls import reverse
from django.http import HttpResponseRedirect

#sayfalama için
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage

def index(request):

    # categories = Category.objects.filter(is_active=True)
    sliders = Slider.objects.get()
    featured_products = Product.objects.filter(is_active=True, is_mainpage=True).order_by('-created_date')[:8]
    latest_blogs = Blog.objects.order_by('-created_date')[:3] 
    kampanyasliders = KampanyaSliders.objects.all()
    kampanyasiders1 = kampanyasliders[:2]
    kampanyasiders2 = kampanyasliders[2:4]

    

    context = {
    #     "categories":categories,
         "sliders":sliders,
         'featured_products': featured_products,
         'latest_blogs': latest_blogs,
         'kampanyasiders1':kampanyasiders1,
         'kampanyasiders2':kampanyasiders2
     }

    return render(request, 'index.html', context)


#hakkımızda Kısmı
def about(request):

    about = About.objects.get()
   
    context= {
        "about":about
    }

    return render(request, 'about.html', context)



def kategori_urunleri(request, slug):
    try:
        
        kategori = Category.objects.get(slug=slug, is_active=True)
        
        
        # Ürün sorgusunu optimize ediyoruz
        products = Product.objects.filter(
            category=kategori,
            is_active=True
        ).order_by('-created_date')
        
        
        
        # Sayfalama
        paginator = Paginator(products, 12)
        page_number = request.GET.get('page')
        page_obj = paginator.get_page(page_number)
        
        context = {
            'page_obj': page_obj,
            'current_category': kategori,
            'categories': Category.objects.filter(is_active=True),
            'all_products': Product.objects.filter(is_active=True)[:100]  # Performans için sınırladık
        }
        return render(request, 'urunlerimiz.html', context)
    
    except Category.DoesNotExist:
        print(f"HATA: {slug} slug'ına sahip kategori bulunamadı!")
        raise Http404("Kategori bulunamadı")


#anasayfa kampanyalara tıklanınca gösterilen html views.
def kampanya_kategori_goster(request, slug):
    kategori = get_object_or_404(Category, slug=slug)
    # products = Product.objects.filter(category=kategori, is_active=True)
    products = Product.objects.filter(
            category=kategori,
            is_active=True
        ).order_by('-created_date')
    categories = Category.objects.filter(is_active=True)  # sol filtre için
    all_products = Product.objects.filter(is_active=True)

     # Sayfalama
    paginator = Paginator(products, 12)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {
        'page_obj': page_obj,
        'categories': categories,
        'current_category': kategori,
        'all_products': all_products,  
    }
    return render(request, 'urunlerimiz.html', context)


#üRÜNLERİMİZ Kısmı

def products(request):

    
    products = Product.objects.filter(is_active=True).order_by('-created_date')
    categories = Category.objects.filter(is_active=True)
    all_products = Product.objects.filter(is_active=True) 

    paginator = Paginator(products, 12)

    page_number = request.GET.get("page")
    page_obj = paginator.get_page(page_number)

    context = {
        "products":products,
        "categories":categories,
        'all_products': all_products, 
        'page_obj':page_obj,
        "current_category": {"name": "Seçkin Kategorilerimiz"}  # sabit başlık için dict
    }

    return render(request, 'urunlerimiz.html', context)



#yeni ekledik
def category_products(request, category_id):
    # Kategoriyi bul veya 404 hatası döndür
    category = get_object_or_404(Category, id=category_id)
    
    # Kategoriye ait aktif ürünleri getir
    products = Product.objects.filter(category=category, is_active=True)
    
    # Ürünleri JSON formatına çevir
    product_list = [
        {
            "id": product.id,
            "name": product.name,
            "price": product.price,
            # image varsa URL'yi, yoksa None döndürüyoruz
            "image": product.image.url if product.image else None,
            # image_url varsa, yoksa None döndürüyoruz
            "image_url": product.image_url if product.image_url else None,
            "slug": product.slug,
            "shopier_url" :product.shopier_url,
            "rating":product.rating,
             "is_sale":product.is_sale
        }
        for product in products
    ]

    # JSON yanıtı döndür
    return JsonResponse(product_list, safe=False)




def filter_products(request):
    product_ids = request.GET.getlist('product_ids')
    price_min = request.GET.get('price_min')
    price_max = request.GET.get('price_max')

    # Kullanıcı ',' ile yazarsa düzelt
    price_min = price_min.replace(",", ".") if price_min else ""
    price_max = price_max.replace(",", ".") if price_max else ""

    try:
        price_min = float(price_min) if price_min else 0
    except ValueError:
        price_min = 0

    try:
        price_max = float(price_max) if price_max else 1000000
    except ValueError:
        price_max = 1000000

    products = Product.objects.filter(is_active=True)

    if product_ids:
        products = products.filter(id__in=product_ids)

    # products = products.filter(price__gte=price_min, price__lte=price_max)

    products = products.annotate(
        final_price=models.Case(
            models.When(is_sale__gt=0, then=models.F('is_sale')),
            default=models.F('price'),
            output_field=models.DecimalField(),
        )
    ).filter(
        final_price__gte=price_min,
        final_price__lte=price_max,
    ).order_by('final_price') 

    # JSON'a dönüştür
    product_list = [
        {
            "id": product.id,
            "name": product.name,
            "price": product.price,
            "image_url": product.image_url if product.image_url else None,
            "image": product.image.url if product.image else None,
            "slug": product.slug,
            "shopier_url" :product.shopier_url,
            "rating":product.rating,
            "is_sale":product.is_sale
           
        }
        for product in products
    ]

    return JsonResponse(product_list, safe=False)




#ürün detay fonksiyonu
def product_detail(request, slug):
    product = get_object_or_404(Product, slug=slug, is_active=True)

     # Aynı kategoriden, kendisi hariç ürünleri getir
    similar_products = list(
        Product.objects.filter(category=product.category, is_active=True)
        .exclude(slug=product.slug)
    )

    # Listeyi karıştır, ilk 3'ünü al
    random.shuffle(similar_products)
    similar_products = similar_products[:4]

    

    context = {
        'product': product,
        'similar_products':similar_products
    }
    return render(request, 'single-product.html', context)



#indirimdeki ürünler

def discounted_products(request):
    # 1. Temel sorgu - is_sale değeri olan ve 0 olmayan ürünler
    discounted_items = Product.objects.filter(is_sale__isnull=False).exclude(is_sale=0)
    
    # 2. Sıralama parametresi
    sort_order = request.GET.get('sort', 'low')
    if sort_order == 'high':
        discounted_items = discounted_items.order_by('-is_sale')  # Yüksekten düşüğe
    else:
        discounted_items = discounted_items.order_by('is_sale')   # Düşükten yükseğe
    
    # 3. Sayfalama - DÜZELTME: products yerine discounted_items kullanılmalı
    paginator = Paginator(discounted_items, 12)  # Sayfa başına 12 ürün
    page_number = request.GET.get("page")
    page_obj = paginator.get_page(page_number)
    
    context = {
        'discounted_products': page_obj,  # Sayfalanmış nesneyi gönderiyoruz
        'page_obj': page_obj,            # Şablonda kullanım kolaylığı için
        'sort_order': sort_order         # Sıralama durumunu şablona iletmek için
    }
    return render(request, 'discounted_products.html', context)


#blog kısmı
def blog_list(request):
    blogs = Blog.objects.all().order_by('-created_date')


    paginator = Paginator(blogs, 6)

    page_number = request.GET.get("page")
    page_obj = paginator.get_page(page_number)
    
    context = {
        'blogs': blogs,
        'page_obj':page_obj
    }
    return render(request, 'blog.html', context)


#blog_detay kısmı
from random import sample
def blog_detail(request, slug):
    blog = get_object_or_404(Blog, slug=slug)
    related_blogs = Blog.objects.exclude(id=blog.id).order_by('?')[:2]

    
    context = {

       'blog': blog,
       'related_blogs':related_blogs
    }

    return render(request, 'single-blog.html', context)


#iletişim kısmı

def contact(request):

    if request.method == 'POST':
        name = request.POST.get('name')
        email = request.POST.get('email')
        tel = request.POST.get('tel')
        message = request.POST.get('message')

        subject = f"Gms Butik Mağaza Formundan Gelen"
        message_body = f"Mesajın geldiği kişinin adı: {name} telefonu:-{tel}- maili:{email}: \n\n mesajı:{message}"
        recipient_list = [settings.EMAIL_HOST_USER]

        try:
            send_mail(subject, message_body, email, recipient_list)
        except Exception:
            messages.error(request, "Mesajınız gönderilemedi. Diğer iletişim kanallarını deneyiniz.")
        else:
            messages.success(request, "Mesajınız için teşekkürler.")

        return HttpResponseRedirect(reverse('iletisim') )
    
  
    return render(request, 'contact.html')




def kvkk_view(request):

    kvkk_metni = KvkkAydinlatma.objects.get()

    context= {
        "kvkk_metni": kvkk_metni
    }


    return render(request, 'kvkk.html', context)

def kullanim_kosullari(request):

    kullanim_kosullari_metni=KullanimKosullari.objects.get()

   
    context= {
        "kullanim_kosullari_metni": kullanim_kosullari_metni
    }

    return render(request, 'kullanim_kosullari.html', context)

def gizlilik_politikasi(request):

    gizlilik_politika_metni=GizlilikPolitikasi.objects.get()

    context= {
        "gizlilik_metni":  gizlilik_politika_metni
    }
 
    return render(request, 'gizlilik_politikalari.html', context)


def iadevedegisim(request):

    iade_degisim_politikasi=IadeveDegisiklikPolitikasi.objects.get()

   

    context= {
        "iade_degisim_politikasi":iade_degisim_politikasi
    }
 
    return render(request, 'iade_degisim_politikasi.html', context)

from django.views.decorators.http import require_POST

@require_POST
def bulten_abone(request):
    email = request.POST.get("email")
    
    if BultenAbonelik.objects.filter(email=email).exists():
        return JsonResponse({"status": "warning", "message": "Bu e-posta zaten kayıtlı."})
    else:
        BultenAbonelik.objects.create(email=email)
        return JsonResponse({"status": "success", "message": "Başarıyla abone oldunuz!"})
    



# def arama(request):
#     query = request.GET.get('q', '')
#     products = Product.objects.filter(name__icontains=query, is_active=True) if query else []

#     result = []
#     for product in products:
#         result.append({
#             'name': product.name,
#             'slug': product.slug,
#              "price": product.price,
#              "is_sale":product.is_sale,
#             "image_url": product.image_url if product.image_url else None,
#             "image": product.image.url if product.image else None,
#         })

#     return JsonResponse(result, safe=False)


def arama(request):
    query = request.GET.get('q', '')
    products = Product.objects.filter(name__icontains=query, is_active=True) if query else []

    # Sonuçları sınırlama
    products = products[:10]  # İlk 20 sonucu al

    result = []
    for product in products:
        result.append({
            'name': product.name,
            'slug': product.slug,
            'price': product.price,
            'is_sale': product.is_sale,
            'image_url': product.image_url if product.image_url else None,
            'image': product.image.url if product.image else None,
        })

    return JsonResponse(result, safe=False)

def custom_404(request, exception):
    return render(request, 'notFound.html', status=404)