# *coding: utf-8*

from django.contrib import admin
from imagekit.admin import AdminThumbnail
import datetime
import csv
from django.http import HttpResponse
from .models import *
from django.contrib.gis.admin import OSMGeoAdmin
from django.forms import ModelForm
from suit.widgets import SuitDateWidget, SuitTimeWidget, SuitSplitDateTimeWidget
from tinymce.widgets import TinyMCE
from django import forms
from mapwidgets.widgets import GooglePointFieldInlineWidget
from django.contrib.gis.db.models import PointField

class ArticlePageForm(forms.ModelForm):
    texte = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 4}))

    class Meta:
        model = Article
        fields ='__all__'

"""
    texte = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 4}))

"""


################ ACTIONS ##################################
def export_to_csv(modeladmin, request, queryset):
    opts = modeladmin.model._meta
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; \
        filename={}.csv'.format(opts.verbose_name)
    writer = csv.writer(response)
    fields = [field for field in opts.get_fields() if not field.many_to_many and not field.one_to_many]
    # Write a first row with header information
    writer.writerow([field.verbose_name for field in fields])
    # Write data rows
    for obj in queryset:
        data_row = []
        for field in fields:
            value = getattr(obj, field.name)
            if isinstance(value, datetime.datetime):
                value = value.strftime('%d/%m/%Y')
            data_row.append(value)
        writer.writerow(data_row)
    return response

export_to_csv.short_description = 'Export to CSV'

def make_validated(modeladmin, request, queryset):
    queryset.update(valid=True,waitingValidation=False)
make_validated.short_description = "Mark selected items as valid"

def make_notvalid(modeladmin, request, queryset):
    queryset.update(valid=False,waitingValidation=False)
make_notvalid.short_description = "Mark selected items as not valid"


######################################################################


class PlaceAdmin(admin.ModelAdmin):
    formfield_overrides = {
        PointField: {"widget": GooglePointFieldInlineWidget}
    }
    list_display = ('name','refCategory','street','zipCode','refTown','thumbnail','location','valid','highlighted','googlePlaceId')
    list_filter = ('valid','highlighted','refTown','refCategory',)
    search_fields = ('name',)
    date_hierarchy = 'updatedAt'
    ordering = ['-updatedAt']
    raw_id_fields = ('refCategory',)
    fieldsets = (
        # Fieldset 1 : meta-info
        ('Infos', {
            'fields': ('name',  'refCategory', 'mainPhoto', 'description','email','phone','webSite','facebookId','tagInstagram','openingTime','freeAccess','noteAverage','nbVote','valid','highlighted','googlePlaceId','googlePlaceJson')
        }),
        # Fieldset 2 : adresse
        ('Adresse', {
            'description': 'Vous pouvez utiliser la carte pour geolocaliser le lieu',
            'fields': ('street','zipCode','refTown','location',)
        }),
    )

class PlacesCommentsAdmin(admin.ModelAdmin):
    list_display = ('refPlace','refUser','note','comment','valid','waitingValidation')
    list_filter = ('valid','waitingValidation',)
    search_fields = ('comment',)
    date_hierarchy = 'updatedAt'
    ordering = ['-updatedAt']
    actions = [make_validated,make_notvalid]


class PhotoUserInline(admin.TabularInline):
    model = PhotoProfile
    raw_id_fields = ['refUser']
    max_num = 4

class UserAdmin(OSMGeoAdmin):
    list_display = ('email','photo_thumbnail','street','zipcode','refTown','location','valid')
    list_filter = ('valid','refTown','online','android',)
    search_fields = ('email',)
    ordering = ['valid']
    inlines = [PhotoUserInline]
    fieldsets = (
        # Fieldset 1 : meta-info
        ('Infos', {
            'fields': ('email','username','mainPhoto','online','birthday','first_name', 'last_name','bio','facebookId',
                       'android','ios','twitterId','instagram','pushToken','nbPost','nbLike','nbFollowing','is_active','valid','removeAd',
                       'last_login','acceptCommunity','acceptCGU','acceptPush')
        }),
        # Fieldset 2 : adresse
        ('Adresse', {
            'classes': ['collapse', ],
            'description': 'Vous pouvez utiliser la carte pour geolocaliser',
            'fields': ('street','zipcode','refTown','location',)
        }),
    )
    photo_thumbnail = AdminThumbnail(image_field='mainPhoto')
    photo_thumbnail.short_description = 'Photo principale'

class PhotoEventsInline(admin.TabularInline):
    model = PhotoEvents
    raw_id_fields = ['refEvent']
    max_num = 4


class EventChangeForm(ModelForm):
    class Meta:
        model = Event
        fields = '__all__'
        widgets = {
            'dateEvent': SuitSplitDateTimeWidget,
        }

class TownAdmin(OSMGeoAdmin):
    fieldsets = [
        (None, {'fields': ['name', 'city', 'country', 'valid','location']}),
    ]
    list_display = ('name','location','city', 'country', 'valid',)

class EventAdmin(admin.ModelAdmin):
    formfield_overrides = {
        PointField: {"widget": GooglePointFieldInlineWidget}
    }
    form = EventChangeForm
    list_display = ('name','placeName','thumbnail','dateEvent','startDateEvent','endDateEvent','refPlace','onIndexPage','refEventCategory','street','zipCode','refTown','location','valid','requireAttention','automaticDelete')
    list_filter = ('valid','requireAttention','refTown','isWeekly','isDaily','refEventCategory','onIndexPage',)
    search_fields = ('name','placeName',)
    date_hierarchy = 'updatedAt'
    ordering = ['-createdAt']
    raw_id_fields = ('refPlace',)
    inlines = [PhotoEventsInline]
    fieldsets = (
        # Fieldset 1 : meta-info
        ('Infos', {
            'fields': ('name', 'placeName', 'dateEvent','startDateEvent','endDateEvent','jsonDate','refPlace','refEventCategory','onIndexPage', 'picture', 'description','email','phone','pageFacebook','ticketUrl','tagInstagram','facebookId','openingTime','isWeekly','isDaily','valid','requireAttention','automaticDelete')
        }),
        # Fieldset 2 : adresse
        ('Adresse', {
            'description': 'Vous pouvez utiliser la carte pour geolocaliser',
            'fields': ('street','zipCode','refTown','location',)
        }),
    )
class EventCommentsAdmin(admin.ModelAdmin):
    list_display = ('refEvent','refUser','comment','valid','waitingValidation')
    list_filter = ('valid','waitingValidation',)
    search_fields = ('comment',)
    date_hierarchy = 'updatedAt'
    ordering = ['-updatedAt']
    actions = [make_validated,make_notvalid]

class PostAdmin(admin.ModelAdmin):
    list_display = ('refTown','refUser','message','post_thumbnail','valid','waitingValidation')
    list_filter = ('valid','waitingValidation',)
    search_fields = ('message',)
    date_hierarchy = 'updatedAt'
    ordering = ['-updatedAt']
    actions = [make_validated,make_notvalid]
    post_thumbnail = AdminThumbnail(image_field='mediaUrl')
    post_thumbnail.short_description = 'Photo post'

class PostCommentsAdmin(admin.ModelAdmin):
    list_display = ('refPost','refUser','userDisplayName','isMediaMessage','mediaType','mediaValue','comment','valid','waitingValidation')
    list_filter = ('refUser','valid','waitingValidation',)
    search_fields = ('comment',)
    date_hierarchy = 'updatedAt'
    ordering = ['-updatedAt']
    actions = [make_validated,make_notvalid]

class UserLikeAdmin(admin.ModelAdmin):
    list_display = ('refPost','refUser')
    list_filter = ('refUser','refPost',)
    ordering = ['-updatedAt']

class FollowAdmin(admin.ModelAdmin):
    list_display = ('following','follower')
    list_filter = ('following','follower',)
    ordering = ['-follow_time']

class ChatAdmin(admin.ModelAdmin):
    list_display = (
    'refUserOne', 'refUserTwo')
    list_filter = ('refUserOne', 'refUserTwo', )
    search_fields = ('refUserOne__username','refUserTwo__username',)
    date_hierarchy = 'updatedAt'
    ordering = ['-updatedAt']

class ChatMediaAdmin(admin.ModelAdmin):
    list_display = (
        'refChat', 'media_thumb')
    ordering = ['-updatedAt']
    media_thumb = AdminThumbnail(image_field='media')
    media_thumb.short_description="Image"

class ArticleAdmin(admin.ModelAdmin):
    forms = ArticlePageForm
    fieldsets = [
        (None, {'fields': ['refTown', 'titre','chapeau','texte','image','lienWeb','valid']}),
    ]
    list_display = (
        'refTown', 'titre','media_thumb')
    ordering = ['-updatedAt']
    media_thumb = AdminThumbnail(image_field='image')
    media_thumb.short_description = "Image"


class NotificationToSendAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['toUserId','message','notifyType','status']}),
    ]
    list_display = ('toUserId','message','notifyType','status','createdAt',)
    ordering = ('-updatedAt',)
    search_fields = ('toUserId__email','toUserId__pseudo',)
    raw_id_fields = ('toUserId',)
    list_select_related = ('toUserId',)

admin.site.register(Category)
admin.site.register(Town,TownAdmin)
admin.site.register(Place,PlaceAdmin)
admin.site.register(PlacesComments,PlacesCommentsAdmin)
admin.site.register(PlacesUsers)
admin.site.register(EventCategory)
admin.site.register(Event,EventAdmin)
admin.site.register(EventComments,EventCommentsAdmin)
admin.site.register(EventUsers)
admin.site.register(Post,PostAdmin)
admin.site.register(PostComments,PostCommentsAdmin)
admin.site.register(UserLike,UserLikeAdmin)
admin.site.register(Follow,FollowAdmin)
admin.site.register(User,UserAdmin)
admin.site.register(Subscription)
admin.site.register(Photo)
admin.site.register(Chat,ChatAdmin)
admin.site.register(ChatMessage)
admin.site.register(ChatMedia,ChatMediaAdmin)
admin.site.register(NotificationToSend,NotificationToSendAdmin)
admin.site.register(PlacesVote)
admin.site.register(Article,ArticleAdmin)


