"""
JSON-LD Schema markup API endpoints for SEO.
Provides structured data for jobs, blogs, and organization.
"""
from rest_framework.response import Response
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from django.conf import settings
from job.models import Job
from blogs.models import Blog
from datetime import datetime


@api_view(['GET'])
@permission_classes([AllowAny])
def blog_schema(request, slug):
    """
    Returns JSON-LD Article schema for a blog post.
    Used by frontend for meta tags and SEO.
    
    Returns:
        {
            "@context": "https://schema.org",
            "@type": "BlogPosting",
            "headline": "Blog title",
            "description": "Meta description",
            "image": "image URL",
            "datePublished": "2024-05-03",
            "dateModified": "2024-05-03",
            "author": {...},
            ...
        }
    """
    try:
        blog = Blog.objects.get(slug=slug, is_published=True)
    except Blog.DoesNotExist:
        return Response({"error": "Blog not found"}, status=404)
    
    frontend_base_url = settings.FRONTEND_BASE_URL
    
    schema = {
        "@context": "https://schema.org",
        "@type": "BlogPosting",
        "headline": blog.meta_title or blog.title,
        "description": blog.meta_description or blog.excerpt,
        "image": {
            "@type": "ImageObject",
            "url": f"{frontend_base_url}{blog.featured_image.url}" if blog.featured_image else None,
            "width": 1200,
            "height": 630,
            "name": blog.featured_image_alt or blog.title
        },
        "datePublished": blog.published_at.isoformat() if blog.published_at else blog.created_at.isoformat(),
        "dateModified": blog.updated_at.isoformat(),
        "author": {
            "@type": "Person",
            "name": blog.author.get_full_name() or blog.author.username if blog.author else "Anonymous"
        },
        "mainEntity": {
            "@type": "Article",
            "wordCount": blog.word_count,
            "timeRequired": f"PT{blog.reading_time}M"
        }
    }
    
    # Add keywords if tags exist
    if blog.tags:
        schema["keywords"] = blog.tags
    
    # Add Open Graph data if available
    if blog.og_image:
        schema["image"]["url"] = f"{frontend_base_url}{blog.og_image.url}"
        schema["image"]["name"] = blog.og_image_alt or blog.title
    
    return Response(schema)


@api_view(['GET'])
@permission_classes([AllowAny])
def job_schema(request, slug):
    """
    Returns JSON-LD JobPosting schema for a job listing.
    Used by frontend for meta tags and SEO.
    
    Args:
        slug: Job slug (e.g., 'python-job-usa-123')
    
    Returns:
        {
            "@context": "https://schema.org",
            "@type": "JobPosting",
            "title": "Job title",
            "description": "Job description",
            "hiringOrganization": {...},
            "baseSalary": {...},
            ...
        }
    """
    try:
        job = Job.objects.get(slug=slug, status=True)
    except Job.DoesNotExist:
        return Response({"error": "Job not found"}, status=404)
    
    frontend_base_url = settings.FRONTEND_BASE_URL
    
    # Parse salary from monthlyBudget if possible
    salary_text = job.monthlyBudget.replace('$', '').replace(',', '').strip()
    try:
        salary_value = float(''.join(filter(str.isdigit, salary_text)) or 0)
    except:
        salary_value = None
    
    schema = {
        "@context": "https://schema.org",
        "@type": "JobPosting",
        "title": job.meta_title or job.title,
        "description": job.meta_description or job.requirements[:160],
        "hiringOrganization": {
            "@type": "Organization",
            "name": job.CompanyName,
            "contactPoint": {
                "@type": "ContactPoint",
                "contactType": "Recruiting",
                "email": job.workEmail
            }
        },
        "jobLocation": {
            "@type": "Place",
            "address": {
                "@type": "PostalAddress",
                "addressCountry": job.CompanyCountry
            }
        },
        "jobLocationType": "TELECOMMUTE",
        "employmentType": "FULL_TIME",
        "datePosted": job.created_at.isoformat(),
        "validThrough": job.startDate if job.startDate else None
    }
    
    # Add salary if available
    if salary_value and salary_value > 0:
        schema["baseSalary"] = {
            "@type": "PriceSpecification",
            "priceCurrency": "USD",
            "price": str(int(salary_value))
        }
    
    # Add OG image if available
    if job.og_image:
        schema["image"] = {
            "@type": "ImageObject",
            "url": f"{frontend_base_url}{job.og_image.url}",
            "name": job.og_image_alt or job.title
        }
    
    # Parse and add skills/requirements
    if job.Tags:
        schema["applicantLocationRequirements"] = {
            "@type": "Country",
            "name": job.CompanyCountry
        }
        schema["skills"] = job.Tags if isinstance(job.Tags, list) else [job.Tags]
    
    return Response(schema)


@api_view(['GET'])
@permission_classes([AllowAny])
def organization_schema(request):
    """
    Returns JSON-LD Organization schema for the company.
    Used by frontend for meta tags and SEO.
    
    Returns:
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "name": "Stafflyn",
            "url": "https://stafflyn.com",
            "logo": "...",
            "sameAs": [...],
            ...
        }
    """
    frontend_base_url = settings.FRONTEND_BASE_URL
    
    schema = {
        "@context": "https://schema.org",
        "@type": "Organization",
        "name": "Stafflyn",
        "url": frontend_base_url,
        "description": "A platform connecting employers with talented professionals",
        "logo": f"{frontend_base_url}/logo.png",
        "sameAs": [
            # Add your social media URLs here
            # "https://www.facebook.com/stafflyn",
            # "https://twitter.com/stafflyn",
            # "https://www.linkedin.com/company/stafflyn",
        ],
        "contactPoint": {
            "@type": "ContactPoint",
            "contactType": "Customer Service",
            "email": settings.EMAIL_HOST_USER
        }
    }
    
    return Response(schema)


@api_view(['GET'])
@permission_classes([AllowAny])
def breadcrumb_schema(request):
    """
    Returns JSON-LD BreadcrumbList schema.
    Frontend can customize based on current page.
    
    Example for /blogs/my-blog-post:
    {
        "@context": "https://schema.org",
        "@type": "BreadcrumbList",
        "itemListElement": [
            {"@type": "ListItem", "position": 1, "name": "Home", "item": "https://stafflyn.com"},
            {"@type": "ListItem", "position": 2, "name": "Blogs", "item": "https://stafflyn.com/blogs"},
            {"@type": "ListItem", "position": 3, "name": "Article Title"}
        ]
    }
    """
    # Frontend should customize this based on current URL path
    breadcrumb_path = request.GET.get('path', '/')
    frontend_base_url = settings.FRONTEND_BASE_URL
    
    breadcrumbs = [
        {
            "@type": "ListItem",
            "position": 1,
            "name": "Home",
            "item": frontend_base_url
        }
    ]
    
    # Example paths - frontend should send actual path
    if 'blogs' in breadcrumb_path:
        breadcrumbs.append({
            "@type": "ListItem",
            "position": 2,
            "name": "Blogs",
            "item": f"{frontend_base_url}/blogs"
        })
    elif 'jobs' in breadcrumb_path:
        breadcrumbs.append({
            "@type": "ListItem",
            "position": 2,
            "name": "Jobs",
            "item": f"{frontend_base_url}/jobs"
        })
    
    schema = {
        "@context": "https://schema.org",
        "@type": "BreadcrumbList",
        "itemListElement": breadcrumbs
    }
    
    return Response(schema)
