from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView, TemplateView
from django.core.mail import send_mail
from django.conf import settings
from django.http import JsonResponse
from django.db.models import Q
from .models import SiteSetting, Service, Article, FAQ, Testimonial, GalleryImage
from .forms import ContactForm
import json


class SEOMixin:
    """Mixin to add SEO context to all views"""
    meta_title = None
    meta_description = None
    meta_keywords = None
    meta_image = None
    canonical_url = None

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        setting = SiteSetting.objects.filter(is_active=True).first()

        base_url = setting.site_url if setting else settings.SITE_URL
        path = self.request.path

        context['meta_title'] = self.meta_title or (setting.site_title if setting else '')
        context['meta_description'] = self.meta_description or (setting.site_description if setting else '')
        context['meta_keywords'] = self.meta_keywords or (setting.site_keywords if setting else '')
        context['meta_image'] = self.meta_image or f"{base_url}/static/images/og-image.jpg"
        context['canonical_url'] = self.canonical_url or f"{base_url}{path}"
        context['og_type'] = 'website'
        context['og_locale'] = 'fa_IR'

        return context


class HomeView(SEOMixin, TemplateView):
    template_name = 'core/home.html'
    meta_title = 'دکتر علی جعفری | متخصص مغز و اعصاب | جراح مغز و ستون فقرات'
    meta_description = 'دکتر علی جعفری، فوق تخصص جراحی مغز و اعصاب با بیش از ۱۵ سال تجربه در درمان بیماری‌های مغز، اعصاب و ستون فقرات. نوبت دهی و مشاوره آنلاین.'
    meta_keywords = 'دکتر علی جعفری, متخصص مغز و اعصاب, جراح مغز, جراح ستون فقرات, دیسک کمر, تومور مغزی, سردرد, تشنج'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['services'] = Service.objects.filter(is_active=True)[:6]
        context['articles'] = Article.objects.filter(is_published=True, is_featured=True)[:4]
        context['testimonials'] = Testimonial.objects.filter(is_active=True)[:6]
        context['faqs'] = FAQ.objects.filter(is_active=True)[:5]
        context['og_type'] = 'website'

        # Structured Data - LocalBusiness
        setting = SiteSetting.objects.filter(is_active=True).first()
        if setting:
            context['local_business_schema'] = {
                "@context": "https://schema.org",
                "@type": "Physician",
                "name": setting.doctor_name,
                "image": f"{setting.site_url}{setting.doctor_image.url}" if setting.doctor_image else "",
                "url": setting.site_url,
                "telephone": setting.phone,
                "address": {
                    "@type": "PostalAddress",
                    "streetAddress": setting.address,
                    "addressLocality": "تهران",
                    "addressRegion": "تهران",
                    "addressCountry": "IR"
                },
                "medicalSpecialty": ["Neurosurgery", "Neurology"],
                "priceRange": "$$$",
                "openingHours": setting.work_hours,
            }

        return context


class AboutView(SEOMixin, TemplateView):
    template_name = 'core/about.html'
    meta_title = 'درباره دکتر علی جعفری | بیوگرافی و سوابق پزشکی'
    meta_description = 'آشنایی با سوابق علمی و پزشکی دکتر علی جعفری، فوق تخصص جراحی مغز و اعصاب. عضو انجمن جراحان مغز و اعصاب ایران.'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['og_type'] = 'profile'
        return context


class ServicesView(SEOMixin, ListView):
    model = Service
    template_name = 'core/services.html'
    context_object_name = 'services'
    meta_title = 'خدمات درمانی | دکتر علی جعفری'
    meta_description = 'لیست کامل خدمات درمانی دکتر علی جعفری شامل جراحی مغز، ستون فقرات، دیسک کمر و گردن، تومورهای مغزی و بیماری‌های اعصاب'

    def get_queryset(self):
        return Service.objects.filter(is_active=True)


class ServiceDetailView(SEOMixin, DetailView):
    model = Service
    template_name = 'core/service_detail.html'
    context_object_name = 'service'
    slug_url_kwarg = 'slug'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        service = self.get_object()
        context['meta_title'] = service.meta_title or service.title
        context['meta_description'] = service.meta_description or service.short_description[:160]
        context['meta_keywords'] = service.meta_keywords
        context['og_type'] = 'article'

        # FAQ Schema for this service
        context['faq_schema'] = {
            "@context": "https://schema.org",
            "@type": "FAQPage",
            "mainEntity": [
                {
                    "@type": "Question",
                    "name": f"{service.title} چیست؟",
                    "acceptedAnswer": {
                        "@type": "Answer",
                        "text": service.short_description
                    }
                }
            ]
        }
        return context


class ArticlesView(SEOMixin, ListView):
    model = Article
    template_name = 'core/articles.html'
    context_object_name = 'articles'
    paginate_by = 9
    meta_title = 'مقالات پزشکی | دکتر علی جعفری'
    meta_description = 'مقالات تخصصی در زمینه بیماری‌های مغز و اعصاب، ستون فقرات، سردرد، تشنج و سلامت اعصاب'

    def get_queryset(self):
        queryset = Article.objects.filter(is_published=True)
        category = self.request.GET.get('category')
        search = self.request.GET.get('q')

        if category:
            queryset = queryset.filter(category=category)
        if search:
            queryset = queryset.filter(
                Q(title__icontains=search) | Q(summary__icontains=search) | Q(content__icontains=search)
            )
        return queryset

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['categories'] = Article.objects.filter(is_published=True).values_list('category', flat=True).distinct()
        context['og_type'] = 'website'
        return context


class ArticleDetailView(SEOMixin, DetailView):
    model = Article
    template_name = 'core/article_detail.html'
    context_object_name = 'article'
    slug_url_kwarg = 'slug'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        article = self.get_object()
        context['meta_title'] = article.meta_title or article.title
        context['meta_description'] = article.meta_description or article.summary[:160]
        context['meta_keywords'] = article.meta_keywords
        context['meta_image'] = article.image.url if article.image else None
        context['og_type'] = 'article'
        context['canonical_url'] = article.canonical_url or self.request.build_absolute_uri()

        # Related articles
        context['related_articles'] = Article.objects.filter(
            category=article.category, is_published=True
        ).exclude(id=article.id)[:3]

        # FAQ Schema
        if article.faq_schema:
            context['faq_schema'] = article.faq_schema

        # Article Schema
        context['article_schema'] = {
            "@context": "https://schema.org",
            "@type": "MedicalWebPage",
            "headline": article.title,
            "description": article.summary,
            "image": article.image.url if article.image else "",
            "datePublished": article.published_at.isoformat() if article.published_at else "",
            "dateModified": article.updated.isoformat(),
            "author": {
                "@type": "Person",
                "name": "دکتر علی جعفری"
            },
            "publisher": {
                "@type": "MedicalOrganization",
                "name": "کلینیک دکتر علی جعفری",
                "logo": {
                    "@type": "ImageObject",
                    "url": f"{settings.SITE_URL}/static/images/logo.png"
                }
            }
        }

        return context

    def get(self, request, *args, **kwargs):
        response = super().get(request, *args, **kwargs)
        # Increment view count
        article = self.get_object()
        article.views += 1
        article.save(update_fields=['views'])
        return response


class ContactView(SEOMixin, TemplateView):
    template_name = 'core/contact.html'
    meta_title = 'تماس با ما | دکتر علی جعفری'
    meta_description = 'آدرس، تلفن و ساعات کاری کلینیک دکتر علی جعفری. تماس برای نوبت دهی و مشاوره.'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['form'] = ContactForm()
        context['og_type'] = 'website'

        # Contact Page Schema
        setting = SiteSetting.objects.filter(is_active=True).first()
        if setting:
            context['contact_schema'] = {
                "@context": "https://schema.org",
                "@type": "MedicalClinic",
                "name": f"کلینیک {setting.doctor_name}",
                "telephone": setting.phone,
                "email": setting.email,
                "address": {
                    "@type": "PostalAddress",
                    "streetAddress": setting.address,
                    "addressLocality": "تهران",
                    "addressCountry": "IR"
                },
                "openingHours": setting.work_hours,
                "geo": {
                    "@type": "GeoCoordinates",
                    "latitude": "35.6892",
                    "longitude": "51.3890"
                }
            }
        return context

    def post(self, request, *args, **kwargs):
        form = ContactForm(request.POST)
        if form.is_valid():
            message = form.save(commit=False)
            message.ip_address = self.get_client_ip(request)
            message.user_agent = request.META.get('HTTP_USER_AGENT', '')[:500]
            message.save()

            # Send email notification
            try:
                send_mail(
                    subject=f'پیام جدید از سایت: {message.subject}',
                    message=f'نام: {message.name}\nتلفن: {message.phone}\n\n{message.message}',
                    from_email=settings.DEFAULT_FROM_EMAIL,
                    recipient_list=[settings.CONTACT_EMAIL],
                    fail_silently=True,
                )
            except:
                pass

            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return JsonResponse({'success': True, 'message': 'پیام شما با موفقیت ارسال شد.'})

            return render(request, self.template_name, {
                **self.get_context_data(),
                'form': ContactForm(),
                'success': True
            })

        if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
            return JsonResponse({'success': False, 'errors': form.errors}, status=400)

        return render(request, self.template_name, {
            **self.get_context_data(),
            'form': form
        })

    def get_client_ip(self, request):
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            return x_forwarded_for.split(',')[0].strip()
        return request.META.get('REMOTE_ADDR')


class GalleryView(SEOMixin, TemplateView):
    template_name = 'core/gallery.html'
    meta_title = 'گالری تصاویر | کلینیک دکتر علی جعفری'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['images'] = GalleryImage.objects.filter(is_active=True)
        return context


def custom_404(request, exception):
    return render(request, 'core/404.html', status=404)


def custom_500(request):
    return render(request, 'core/500.html', status=500)
