from email.policy import default
from django.db import models
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

from wagtail.models import Page
from wagtail.fields import StreamField, RichTextField
from wagtail.images.blocks import ImageChooserBlock
from wagtail.admin.panels import FieldPanel
from wagtail import blocks
from wagtail.blocks import RichTextBlock, TextBlock, StructBlock, CharBlock


class CodeBlock(StructBlock):
    language = CharBlock(required=True, help_text='Programming language', default='python')
    code = TextBlock(required=True, help_text='Code snippet')
    
    class Meta:
        template = 'blocks/code_block.html'
        icon = 'code'
        label = 'Code'


class ProjectIndexPage(Page):
    intro = models.TextField(blank=True)
    projects_per_page = 6  # Number of projects to display per page

    content_panels = Page.content_panels + [
        FieldPanel('intro'),
    ]
    
    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        
        # Get all projects ordered by most recent first
        all_projects = self.get_children().specific().order_by('-first_published_at')
        
        # Pagination
        page = request.GET.get('page', 1)
        paginator = Paginator(all_projects, self.projects_per_page)
        
        try:
            projects = paginator.page(page)
        except PageNotAnInteger:
            projects = paginator.page(1)
        except EmptyPage:
            projects = paginator.page(paginator.num_pages)
            
        context['projects'] = projects
        return context

class ProjectPage(Page):
    name = models.CharField(max_length=200)
    tech_stack = models.CharField(max_length=200)
    code_url = models.URLField(blank=True, help_text="URL to the project's source code (e.g., GitHub)")
    demo_url = models.URLField(blank=True, help_text="URL to the live demo of the project")
    thumbnail = models.ForeignKey(
        'wagtailimages.Image',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='project_thumbnails',
    )
    screenshots = StreamField([
        ("screenshot", ImageChooserBlock()),
    ], use_json_field=True, blank=True)
    description = StreamField([
        ("paragraph", blocks.RichTextBlock()),
        ("image", ImageChooserBlock()),
        ("code", CodeBlock()),
    ], use_json_field=True)
    views_count = models.PositiveIntegerField(default=0)

    content_panels = Page.content_panels + [
        FieldPanel('name'),
        FieldPanel('tech_stack'),
        FieldPanel('code_url'),
        FieldPanel('demo_url'),
        FieldPanel('thumbnail'),
        FieldPanel('screenshots'),
        FieldPanel('description'),
    ]
    
    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        
        try:
            # Increment view count
            self.views_count += 1
            self.save()
        except Exception as e:
            # Log the error but don't break the page
            import logging
            logger = logging.getLogger(__name__)
            logger.error(f'Error in ProjectPage.get_context: {str(e)}')
            
        return context
