from django.shortcuts import render
from django.http import HttpResponse
from .utils import upload_to_ftp
from .models import *
from django.views.generic import ListView,DetailView,TemplateView
from django.http import JsonResponse
import os
import uuid
from django.conf import settings
from meta.views import MetadataMixin



class CategoryListView(MetadataMixin,ListView):
    model = CeremonyCategory
    template_name = 'archive/list_category.html'
    context_object_name = 'categories'

    def get_queryset(self):
        parent_id = self.kwargs.get('parent_id')

        if parent_id:
            self.parent = CeremonyCategory.objects.get(id=parent_id)
            return self.parent.children.all()
        else:
            self.parent = None
            return CeremonyCategory.objects.filter(parent__isnull=True)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        categories = context['categories']
        
        if self.parent:
            context['flag'] = not categories.exists()
        else:
            context['flag'] = False

        context['parent'] = self.parent
        return context
    
    
    
    def get_meta_title(self, context=None):
        if self.parent:
            return f"{self.parent.name} نوا و نما | امین قدیم"
        return "نوا و نما | امین قدیم"

    def get_meta_description(self, context=None):
        if self.parent:
            return (
                f"مشاهده زیرمجموعه‌های {self.parent.name} در آرشیو نوا و نمای امین قدیم؛ "
                f"دسترسی به مداحی، روضه و مراسم‌های دسته‌بندی‌شده بر اساس مناسبت و سبک."
            )
        return (
            "آرشیو کامل دسته‌بندی‌های نوا و نما در سایت امین قدیم؛ مرور و دسترسی آسان به "
            "مداحی‌ها، روضه‌خوانی‌ها و مراسم‌های مذهبی بر اساس موضوع و مناسبت."
        )
    


class CeremonyDetailView(MetadataMixin, DetailView):
    model = Ceremony
    template_name = 'archive/ceremony_detail.html'
    context_object_name = 'ceremony'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        ceremony = self.object  

        files_by_type = {
            'ویدیو': ceremony.files.filter(file_type='video'),
            'صوت': ceremony.files.filter(file_type='audio'),
            'تصاویر': ceremony.files.filter(file_type='image'),
            'متن': ceremony.files.filter(file_type='text'),
        }

        context['files_by_type'] = files_by_type
        return context
    
    def get_meta_title(self, context=None):
        return f"{self.object.title} | امین قدیم"

    def get_meta_description(self, context=None):
        parts = []

        if hasattr(self.object, 'occasion') and self.object.occasion:
            parts.append(f"مناسبت: {self.object.occasion.title}")

        if hasattr(self.object, 'category') and self.object.category:
            parts.append(f"دسته: {self.object.category.name}")

        extra = f" {' | '.join(parts)}." if parts else ""

        return (
            f"دانلود و مشاهده کامل مراسم {self.object.title} شامل صوت، ویدئو و تصاویر "
            f"در آرشیو امین قدیم.{extra} مشاهده آنلاین و دانلود مستقیم با کیفیت بالا."
        )
        
    def get_meta_image(self, context=None):
        if self.object.poster:
            return self.object.poster
        return "https://aminghadim.com/static/images/thumb_e3fad2abfcb549f2a1e3b31a460591a7.jpg"
    
    def get_meta_url(self, context=None):
        return self.object.get_absolute_url()



class CeremonyListView(MetadataMixin,ListView):
    model = Ceremony
    template_name = "archive/ceremony_list.html"  
    context_object_name = "ceremonies"
    ordering = ['-date']
    paginate_by = 8

    def get_paginate_by(self, queryset):
        try:
            return int(self.request.GET.get('page_size', self.paginate_by))
        except (TypeError, ValueError):
            return self.paginate_by

    def get_meta_title(self, context=None):
        return "مراسمات | امین قدیم"

    def get_meta_description(self, context=None):
        return (
            "آرشیو کامل مراسم‌های مذهبی برگزارشده توسط کربلایی امین قدیم؛ شامل جلسات "
            "هفتگی، مناسبت‌های مذهبی و مراسم‌های ویژه با امکان دسترسی به صوت، ویدئو و تصاویر هر مراسم."
        )
         
    def get_meta_url(self, context=None):
        return reverse("ceremony_list")

        
 
from django.db.models import Max


class AudiosList(MetadataMixin, ListView):
    model = CeremonyFile
    template_name = "archive/audio_list.html"
    context_object_name = 'audios'

    paginate_by = 50

    def get_paginate_by(self, queryset):
        try:
            return int(self.request.GET.get('page_size', self.paginate_by))
        except (TypeError, ValueError):
            return self.paginate_by
    def get_queryset(self):
        qs = CeremonyFile.objects.filter(file_type='audio')

        # ---- فیلتر تاریخ ----
        order = self.request.GET.get('order')
        if order == 'oldest':
            qs = qs.order_by('uploaded_at')
        else:
            qs = qs.order_by('-uploaded_at')  # پیش‌فرض: جدیدترین

        # ---- فیلتر سبک (فرض: فیلد style داری) ----
        file_style = self.request.GET.get('style')
        if file_style:
            qs = qs.filter(file_style=file_style)
            
        occasion = self.request.GET.get('occasion')    
        if occasion :
            qs = qs.filter(occasion=occasion)

        return qs
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # 👇 آخرین آپدیت واقعی کل داده‌ها
        last_update = CeremonyFile.objects.filter(
            file_type='audio'
        ).aggregate(last=Max('uploaded_at'))['last']

        occasions = Occasion.objects.all()
        context['occasions'] = occasions

        context['last_update'] = last_update
        return context
    
    
    def get_meta_title(self, context=None):
        return "صوت‌ها | امین قدیم"

    def get_meta_description(self, context=None):
        return (
            "آرشیو کامل فایل‌های صوتی مداحی و روضه‌خوانی کربلایی امین قدیم؛ دانلود مستقیم "
            "با کیفیت بالا و دسته‌بندی بر اساس مناسبت و سبک اجرا."
        )     
     
    def get_meta_url(self, context=None):
        return reverse("audios_list")
 
        
        
 
    
class AudioDetail(MetadataMixin,DetailView):
    model = CeremonyFile
    template_name = "archive/audio_detail.html"  
    context_object_name = 'audio'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        audio = self.get_object()
        ceremony = audio.ceremony
 
        category_chain = ceremony.category.get_parents() if ceremony.category else []
      
        prev_audio = CeremonyFile.objects.filter(
            file_type='audio',
            id__lt=audio.id
        ).order_by('-id').first()

        next_audio = CeremonyFile.objects.filter(
            file_type='audio',
            id__gt=audio.id
        ).order_by('id').first()
 
        context["breadcrumb"] = {
            "ceremony":ceremony,
            "occasion": ceremony.occasion.title if ceremony.occasion else "",
            "categories": category_chain,
        }
        context['videos'] = CeremonyFile.objects.filter(file_type='video',is_pin=True).order_by('-uploaded_at')[:10]
        context['audios'] = CeremonyFile.objects.filter(file_type='audio',is_pin=True).order_by('-uploaded_at')[:10]
        context["prev_audio"] = prev_audio
        context["next_audio"] = next_audio

        return context
    
 
    def get_meta_title(self, context=None):
        return f"{self.object.title} | امین قدیم"

    def get_meta_description(self, context=None):
        parts = []

        if self.object.occasion:
            parts.append(f"مناسبت: {self.object.occasion.title}")

        if self.object.file_style:
            parts.append(f"سبک: {self.object.get_file_style_display()}")

        extra = " | ".join(parts)

        return (
            f"دانلود فایل صوتی {self.object.title} از مراسم {self.object.ceremony.title}.  "
            f"{extra} | آرشیو صوتی امین قدیم"
        )

    def get_meta_image(self, context=None):
        if self.object.poster:
            return self.object.poster
 

        return "https://aminghadim.com/static/images/default-og.jpg"

    def get_meta_url(self, context=None):
        return reverse("audio_detail", kwargs={"pk": self.object.id})

    
    
class VideosList(MetadataMixin,ListView):
    model = CeremonyFile
    template_name = "archive/video_list.html"  
    context_object_name = 'videos'
    paginate_by = 50

    def get_paginate_by(self, queryset):
        try:
            return int(self.request.GET.get('page_size', self.paginate_by))
        except (TypeError, ValueError):
            return self.paginate_by

    def get_queryset(self):
        qs = CeremonyFile.objects.filter(file_type='video').order_by('-uploaded_at')

        order = self.request.GET.get('order')
        if order == 'oldest':
            qs = qs.order_by('uploaded_at')
        else:
            qs = qs.order_by('-uploaded_at')  

        file_style = self.request.GET.get('style')
        if file_style:
            qs = qs.filter(file_style=file_style)
            
        occasion = self.request.GET.get('occasion')    
        if occasion :
            qs = qs.filter(occasion=occasion)
        

        return qs
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # 👇 آخرین آپدیت واقعی کل داده‌ها
        last_update = CeremonyFile.objects.filter(
            file_type='video'
        ).aggregate(last=Max('uploaded_at'))['last']

        context['last_update'] = last_update
        occasions = Occasion.objects.all()
        context['occasions'] = occasions

        return context
    
    def get_meta_title(self, context=None):
        return "ویدئو ها | امین قدیم"

    def get_meta_description(self, context=None):
        return (
            "آرشیو کامل ویدئوهای مداحی، روضه‌خوانی و نماهنگ‌های مذهبی کربلایی امین قدیم؛ "
            "مشاهده آنلاین و دانلود مستقیم با کیفیت بالا از جدیدترین مراسم‌ها."
        )     
    def get_meta_url(self, context=None):
        return reverse("videos_list")

    
class VideoDeatail(MetadataMixin,DetailView):
    model = CeremonyFile
    template_name = "archive/video_detail.html"
    context_object_name = 'video'

    def get_queryset(self):
        return CeremonyFile.objects.filter(file_type='video')
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        video = self.get_object()
        ceremony = video.ceremony
 
        category_chain = ceremony.category.get_parents() if ceremony.category else []

 
        context["breadcrumb"] = {
            "ceremony":ceremony,
            "occasion": ceremony.occasion.title if ceremony.occasion else "",
            "categories": category_chain,
        }
        context['videos'] = CeremonyFile.objects.filter(file_type='video',is_pin=True).order_by('-uploaded_at')[:10]
        context['audios'] = CeremonyFile.objects.filter(file_type='audio',is_pin=True).order_by('-uploaded_at')[:10]


        return context
    

    def get_meta_title(self, context=None):
        return f"{self.object.title} |  امین قدیم"

    def get_meta_description(self, context=None):
        parts = []

        if self.object.occasion:
            parts.append(f"مناسبت: {self.object.occasion.title}")

        if self.object.file_style:
            parts.append(f"سبک: {self.object.get_file_style_display()}")

        extra = " | ".join(parts)

        return (
            f"دانلود و مشاهده ویدئوی {self.object.title} از مراسم {self.object.ceremony.title} در آرشیو ویدئویی امین قدیم. "
            f"{extra}"
        )

    def get_meta_image(self, context=None):
        if self.object.poster:
            return self.object.poster

        if self.object.thumbnail:
            return self.object.thumbnail

        if self.object.ceremony.poster:
            return self.object.ceremony.poster

        return "https://aminghadim.com/static/images/default-og.jpg"

    def get_meta_url(self, context=None):
        return reverse("video_detail", kwargs={"pk": self.object.id})
    
    

    
class RingbackToneList(MetadataMixin,ListView):
    model = RingbackTone
    template_name = "archive/ring_back_tone_list.html"  
    context_object_name = 'ring_back_tones'
    def get_meta_title(self, context=None):
        return "پیشواز ها | امین قدیم"

    def get_meta_description(self, context=None):
        return (
            "دانلود پیشواز همراه با صدای مداحی و مناجات کربلایی امین قدیم؛ مجموعه‌ای از "
            "آهنگ‌های پیشواز مذهبی برای تلفن همراه با کیفیت بالا و دانلود مستقیم."
        )
     
    def get_meta_url(self, context=None):
        return reverse("ring_back_tone_list")
    

import os
import uuid
from io import BytesIO
from django.http import JsonResponse
from django.core.files.uploadedfile import InMemoryUploadedFile
from PIL import Image
from django.conf import settings
import os
import uuid
from io import BytesIO
from PIL import Image
from django.http import JsonResponse
from django.conf import settings


from django.core.files.uploadedfile import InMemoryUploadedFile
from io import BytesIO
from PIL import Image
import os, uuid


def make_thumbnail(file, size=(300, 300), quality=60):
    file.seek(0)  # 👈 مهم

    img = Image.open(file)

    if img.mode in ("RGBA", "P"):
        img = img.convert("RGB")

    img.thumbnail(size)

    buffer = BytesIO()
    img.save(buffer, format="JPEG", quality=quality, optimize=True)
    buffer.seek(0)

    return buffer


def upload_file_view(request):
    if request.method == "POST":

        uploaded_file = request.FILES.get("file")

        if not uploaded_file:
            return JsonResponse({"error": "No file"}, status=400)

        upload_type = request.POST.get("type")

        ext = os.path.splitext(uploaded_file.name)[1]
        filename = f"{uuid.uuid4().hex}{ext}"

        # =========================
        # 🎯 COVER
        # =========================
        if upload_type == "cover":

            # 🔥 مهم: reset pointer
            uploaded_file.seek(0)

            # 1. آپلود فایل اصلی
            main_remote = upload_to_ftp(uploaded_file.file, filename)
            main_url = f"{settings.FTP_URL}{main_remote}"

            # 2. دوباره seek برای thumbnail
            uploaded_file.seek(0)

            thumb_io = make_thumbnail(uploaded_file)

            thumb_name = f"thumb_{uuid.uuid4().hex}.jpg"
            thumb_remote = upload_to_ftp(thumb_io, thumb_name)
            thumb_url = f"{settings.FTP_URL}{thumb_remote}"

            return JsonResponse({
                "poster": main_url,
                "thumbnail": thumb_url
            })

        # =========================
        # NORMAL FILE
        # =========================
        uploaded_file.seek(0)

        remote_path = upload_to_ftp(uploaded_file.file, filename)

        return JsonResponse({
            "path": f"{settings.FTP_URL}{remote_path}"
        })

    return JsonResponse({"error": "Invalid request"}, status=400)


def tag_search(request):
    q = request.GET.get("q", "")
    tags = Tag.objects.filter(name__icontains=q)[:20]

    return JsonResponse({
        "results": [
            {"id": t.id, "text": t.name}
            for t in tags
        ]
    })
    
    
    
