import os
import uuid
import datetime
import shutil


from django.db.models import *
from django.core.validators import MinValueValidator, MaxValueValidator
from django.core.exceptions import PermissionDenied
from django.contrib.auth.models import User
from django.core.files.storage import FileSystemStorage
from django.shortcuts import get_object_or_404

from django.urls import reverse
from django.db import models
from django.dispatch import receiver
from django.db.models.signals import post_delete, post_save
from django.conf import settings

from multiselectfield import MultiSelectField

from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFill
from imagekit.processors import ResizeToCover
from imagekit.processors import Thumbnail
from imagekit.processors import ResizeToCover
from imagekit.models import ProcessedImageField

from django_countries.fields import CountryField
from post_office import mail
from constance import config

from marktplatz.widgets import *



class Contact(models.Model):
    user = OneToOneField(User, on_delete=models.CASCADE,blank=True)
    first_name = CharField(verbose_name="Vorname", max_length = 100)
    last_name = CharField(verbose_name="Nachname", max_length = 100)
    adress = CharField(verbose_name="Adresse", blank=True,max_length = 100)
    postcode = CharField(verbose_name="Postleitzahl", blank=True, max_length = 100)
    city = CharField(verbose_name="Stadt", blank=True,max_length = 100)
    country = CharField(verbose_name="Land", blank=True,max_length = 100)
    email = EmailField(verbose_name="E-Mail-Addresse", unique=True)
    phonenumber = CharField(verbose_name="1. Telefonnummer", blank=True,max_length = 100)
    alternate_phonenumber = CharField(verbose_name="2. Telefonnummer", blank = True,max_length = 100)
    skype_name = CharField(verbose_name="Video-Konferenzen (Zoom, teams, google)", blank=True,max_length = 300)
    website = URLField(verbose_name="Website", blank=True)

    def user_can_manage(self, user):
        return user.contact.id == self.id

    def __str__(self):
        return self.first_name + ' ' + self.last_name

    def __iter__(self):
        for field in self._meta.fields:
            yield (field.verbose_name, field.value_to_string(self))



class Category(models.Model):
    name = CharField(max_length=100)
    short_name = CharField(max_length=10)

    def __str__(self):
        return self.name



class Product(models.Model):

    def __init__(self, *args, **kwargs):

        super(Product, self).__init__(*args, **kwargs)

    # def save(self, update_fields=None,  *args, **kwargs):
        #https://stackoverflow.com/questions/1355150/when-saving-how-can-you-check-if-a-field-has-changed
        # super().save( update_fields=update_fields, *args, **kwargs)  # Call the "real" save() method.


    STATUS = [
        ('ENT', 'Entwicklung'),
        ('BET', 'In Betrieb'),
        ('ABG', 'Abgeschlossen'),
    ]

    FREI = [
        ('JAJA', 'Platz frei'),
        ('WART', 'Projekt mit Warteliste'),
        ('NEIN', 'Projekt ohne Warteliste'),
    ]

    RECHTSFORM = [
        ('GmbH', 'GmbH'),
        ('Verein', 'Verein'),
        ('Genossenschaft', 'Genossenschaft'),
        ('GbR', 'GbR'),
        ('Sonstiges', 'Sonstiges'),
    ]

    ORT = [
        ('1010', 'Wien 1'),
        ('1020', 'Wien 2'),
        ('1030', 'Wien 3'),
        ('1040', 'Wien 4'),
        ('1050', 'Wien 5'),
        ('1060', 'Wien 6'),
        ('1070', 'Wien 7'),
        ('1080', 'Wien 8'),
        ('1090', 'Wien 9'),
        ('1100', 'Wien 10'),
        ('1110', 'Wien 11'),
        ('1120', 'Wien 12'),
        ('1130', 'Wien 13'),
        ('1140', 'Wien 14'),
        ('1150', 'Wien 15'),
        ('1160', 'Wien 16'),
        ('1170', 'Wien 17'),
        ('1180', 'Wien 18'),
        ('1190', 'Wien 19'),
        ('1200', 'Wien 20'),
        ('1210', 'Wien 21'),
        ('1220', 'Wien 22'),
        ('1230', 'Wien 23'),
        ('GERM', 'Deutschland'),
        ('SCHW', 'Schweiz'),
        ('VORA', 'Vorarlberg'),
        ('TIRO', 'Tirol'),
        ('SALZ', 'Salzburg'),
        ('KAER', 'Kärnten'),
        ('STEI', 'Steiermark'),
        ('OBER', 'Oberösterreich'),
        ('NIER', 'Niederösterreich'),
        ('BURG', 'Burgenland'),
        ('WELT', 'Welt'),
    ]

    ORGANIZATION = [
        ('Soziokratie', 'Soziokratie'),
        ('Sonstiges', 'Sonstiges'),
    ]

    TYPE = [
        ('BASE', 'Platz frei'),
        ('WOHN', 'Wohnprojekt'),
        ('MOBI', 'Mobilitätsprojekt'),
        ('ERNA', 'Ernährunsprojekt'),
        ('ENER', 'Energieprojekt'),
    ]

    @property
    def kind_of_product(self):
            return "Basis Projekt"


    @property
    def viewURL(self):
        return reverse ( 'product-detail-type', kwargs= {'pk': self.pk, 'type': self.type} )





    name            = CharField   ( 'Name', max_length = 128, help_text="Name des Projekts. Beispiel: Seestern", null = True, blank=True )
    claim           = CharField   ( 'Claim / Untertitel', max_length = 256, help_text="Beispiel: Wohnprojekt Seestern Aspern", null = True, blank=True )
    beschreibung    = TextField   ( 'Projektbeschreibung', max_length = 2048, help_text="Beispiel: Das Wohnprojekt Seestern Aspern wurde als eines von fünf Baugruppenprojekten in der Seestadt aspern auf dem Baufeld D13 realisiert. Der Seestern ist ein Projekt für Menschen jeden Alters, die Initiative übernehmen und mit anderen einen gemeinsamen Mehrwert in einem eigenen Wohnhaus schaffen wollen. Gut erreichbar mit der U2 und in der Nähe der Lobau. Ein Wohnprojekt, das von Anfang an von den zukünftigen BewohnerInnen mitgestaltet wurde und mit den Menschen wächst. In der gemeinsam formulierten Vision steht die lebendige Architektur, die Gemeinschaft und Privatsphäre im Vordergrund.", null = True, blank=True )
    learning        = TextField   ( 'Learning', max_length = 2048, help_text="Was können andere von euch lernen? Beispiel: Nach dem Bezug des Gebäudes haben wir uns von einer Baugruppe in eine Wohngruppe verwandelt.", null = True, blank=True )
    gruendungsjahr  = IntegerField( 'Gründungsjahr', help_text="Wann wurde das Projekt gegründet?", default='2020', validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
    betriebgenommen = IntegerField( 'in Betrieb genommen im Jahr', default='2020', help_text="Wann wurde das Haus bezogen?", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
    status          = CharField   ( 'Status',    max_length = 3,    choices=STATUS, default='ENT', help_text='Wähle aus der Liste aus! ("In Betrieb" bedeutet in diesem Fall "das Haus ist bezogen". "Abgeschlossen" würde bedeuten dass es das Projekt gar nicht mehr gibt.' , null = True, blank=True )
    adresse         = CharField   ( 'Adresse',   max_length = 256,  help_text="Beispiel: Gisela-Legath-Gasse 5", null = True, blank=True )
    plz             = CharField   ( 'Postleitzahl',   max_length = 64,  help_text="PLZ des Projektes", null = True, blank=True )
    adresse_zusatz  = CharField   ( 'Adresse Zusatz',   max_length = 128,  help_text="Adresse Zusatz", null = True, blank=True )
    ort             = CharField   ( 'Ort',        max_length = 4, choices=ORT, default='WELT', help_text="Beispiel: Wien, 22", null = True, blank=True )
    type            = CharField   ( 'Type',        max_length = 4, choices=TYPE, default='BASE', help_text="", null = True, blank=False )
    website         = URLField    ( 'Website',   max_length = 2048, help_text="Beispiel: https://seestern-aspern.at/", null = True, blank=True )
    email           = EmailField  ( 'Email',   max_length = 2048, help_text="Email des Projektes", null = True, blank=True )
    frei            = CharField   ( 'Platz frei', max_length = 4,    choices=FREI, default='NEIN', help_text="Gibt es freie Wohnungen? Wähle aus der Liste aus!", null = True, blank=False )
    kfrei           = CharField   ( 'Inseratstext - Platzfrei',   max_length = 2048,  help_text="Beschreibung des Angebots an Wohnungen bzw. freien Plätzen . Beispiel: Ab 1.5. wird eine schöne, südseitige 2 Zimmerwohnung mit 59 qm frei. Perfekt für Alleinerziehende! Melde Dich bei uns wenn du interessiert bist, dann schicken wir dir Detailinformationen zu!", null = True, blank=True )
    rechtsform      = CharField   ( 'Rechtsform', max_length = 256, help_text="Rechtsform des Projektes. Beispiel: Verein oder Gmbh oder Genossenchaft", null = True, blank=True )
    orga            = CharField   ( 'Organisationsform',  max_length = 256, help_text="Wie ist die Bewohnergemeinschaft organisiert? Beispiel: Soziokratie", null = True, blank=True )
    realitylab      = BooleanField( 'Begleitet von realitylab', default=False, help_text="Wurde/ Wird das Projekt von realitylab begleitet?", blank=False )
    terms           = BooleanField(help_text="", null=True)
    edit            = BooleanField( default=True, help_text="", blank=False )
    public          = BooleanField( default=False, help_text="", blank=False )
    contact         = ForeignKey(Contact, null = True,on_delete=models.SET_NULL, help_text="")


    sumbitted       = CharField(null = True,max_length = 10, blank=True, help_text="")
    date_submitted  = DateField(auto_now_add=True, help_text="")



    # @property
    # def stringToSearch(self):
    #     stringToSearch = self.name +   self.claim +      self.beschreibung + self.learning
    #     return stringToSearch


    def user_can_manage(self, user):
        return user.contact.id == self.contact.id


    def __str__(self):
        return str(self.name)

    def __iter__(self):
        for field in self._meta.fields:
            yield (field.verbose_name, field.value_to_string(self))

    def get_field_verbose_name(self, fieldName):
        return self._meta.get_field(fieldName).verbose_name

    def meta(self):
        return self._meta


# @receiver(post_delete, sender=Product)
# def auto_delete_reverse_keys(sender, instance, **kwargs):
    # if instance.credits:
    #     instance.credits.delete()
    # if instance.description:
    #     instance.description.delete()
    # if instance.interaction:
    #     instance.interaction.delete()




class MobilitaetsProjekt(Product):

    @property
    def kind_of_product(self):
            return "Mobilitätsprojekt"



class ErnaehrungsProjekt(Product):

    @property
    def kind_of_product(self):
            return "Ernährungsprojekt"



class EnergyProjekt(Product):

    @property
    def kind_of_product(self):
            return "Energyprojekt"




class Wohnprojekt(Product):

    EIGENTUM = [
        ('GEMIET', 'Generalmiete'),
        ('WOHNHM', 'Wohnheim'),
        ('EIGENT', 'Eigentum'),
        ('GTMIET', 'Getrennte Mietvertäge (Verein mietet GR)'),
    ]

    WOHNBAUFOERDERUNG = [
        ('Gefördert', 'Gefördert'),
        ('Nicht Gefördert', 'Nicht Gefördert'),
    ]
    ALTNEU = [
        ('ALTB', 'Altbau'),
        ('NEUB', 'Neubau'),
    ]

    ARTMODELL =[
        ('Die Wohnungen werden individiuell von einem Bauträger angemietet / Gemeinschaftsräume werden gemeinsam angemietetet', 'Die Wohnungen werden individiuell von einem Bauträger angemietet / Gemeinschaftsräume werden gemeinsam angemietetet'),
        ('Die Gemeinschaft mietet das ganze Haus oder Teile davon vom Bauträger (z.b. in Form eines Generalmietvetrages). Die Gemeinschaft schließt indiviudelle Nutzungsverträge mit den NutzerInnen ab. (Wird oft so bei Wohnheimen gemacht)', 'Die Gemeinschaft mietet das ganze Haus oder Teile davon vom Bauträger (z.b. in Form eines Generalmietvetrages). Die Gemeinschaft schließt indiviudelle Nutzungsverträge mit den NutzerInnen ab. (Wird oft so bei Wohnheimen gemacht)'),
        ('Der Bau erfolgt durch einen Bauträger. Die Gemeinschaft erwirbt das Gebäude und das Grundstück im Eigentum und schließt individuelle Nutzungsverträge mit den NutzerInenn ab.', 'Der Bau erfolgt durch einen Bauträger. Die Gemeinschaft erwirbt das Gebäude und das Grundstück im Eigentum und schließt individuelle Nutzungsverträge mit den NutzerInenn ab.'),
        ('Der Bau erfolgt ohne Bauträger. Die Gemeinschaft erwirbt das Grundstück im Eigentum und baut auf eigene Rechnung und Risiko. Die Gemeinschaft schließt individuelle  Nutzungsverträge mit den NutzerInenn ab.', 'Der Bau erfolgt ohne Bauträger. Die Gemeinschaft erwirbt das Grundstück im Eigentum und baut auf eigene Rechnung und Risiko. Die Gemeinschaft schließt individuelle  Nutzungsverträge mit den NutzerInenn ab.'),
        ('Es gibt ein individuelles Eigentum an den jeweiligen Wohnungen. Die Eigentümergemeinschaft nutzt und erhält Gemeinschaftsräume.', 'Es gibt ein individuelles Eigentum an den jeweiligen Wohnungen. Die Eigentümergemeinschaft nutzt und erhält Gemeinschaftsräume.'),
        ('Modell Habitat', 'Modell Habitat'),
        ('Anderes Modell', 'Anderes Modell'),
     ]

    BAUTRAEGER = [
        ('Altmannsdorf - Hetzendorf Gemn. Siedlungsgen.m.b.H', 'Altmannsdorf - Hetzendorf Gemn. Siedlungsgen.m.b.H'),
        ('EBG Gemn. Ein und Mehrfam. Häuser Baugen.reg..Gen.mbH', 'EBG Gemn. Ein und Mehrfam. Häuser Baugen.reg..Gen.mbH'),
        ('EGW Erste gemeinnützige Wohnungsgesellschaft mbH', 'EGW Erste gemeinnützige Wohnungsgesellschaft mbH'),
        ('FAMILIENWOHNBAU gemeinnützige Bau- und Siedlungsges. m.b.H.', 'FAMILIENWOHNBAU gemeinnützige Bau- und Siedlungsges. m.b.H.'),
        ('GARTENHEIM Gemeinn. Familienhäuser Bau- u. Wohnungen regGenmbH', 'GARTENHEIM Gemeinn. Familienhäuser Bau- u. Wohnungen regGenmbH'),
        ('Migra Gemn. Bau und SiedlungsgesmbH', 'Migra Gemn. Bau und SiedlungsgesmbH'),
        ('ÖVW Österr. Volkswohnungswerk Gemeinn. Ges mbH', 'ÖVW Österr. Volkswohnungswerk Gemeinn. Ges mbH'),
        ('SCHWARZATAL Gemeinnützige Wohnungs- u. Siedlungsanlagen GmbH', 'SCHWARZATAL Gemeinnützige Wohnungs- u. Siedlungsanlagen GmbH'),
        ('WBV-GPA Wohnbauvereinigung für Privatangestellte Gemn. Ges.m.b.H', 'WBV-GPA Wohnbauvereinigung für Privatangestellte Gemn. Ges.m.b.H'),
        ('WOGEN - Wohnprojekte-Genossenschaft e. Gen.', 'WOGEN - Wohnprojekte-Genossenschaft e. Gen.'),
        ('Sonstiges', 'Sonstiges'),
    ]

    GEMEINSCHAFTR = [
        ('Gemeinschaftsküche', 'Gemeinschaftsküche'),
        ('Kinderspielraum', 'Kinderspielraum'),
        ('Sauna / Wellness', 'Sauna / Wellness'),
        ('Fitnessraum', 'Fitnessraum'),
        ('Werkstatt', 'Werkstatt'),
        ('Waschküche', 'Waschküche'),
        ('Multifunktionsraum', 'Multifunktionsraum'),
        ('Musikraum', 'Musikraum'),
        ('Gästewohnung', 'Gästewohnung'),
        ('Raum für Home-Office', 'Raum für Home-Office'),
        ('Fahrradabstellplätze', 'Fahrradabstellplätze'),
        ('Kinderwagenabstellräume', 'Kinderwagenabstellräume'),
        ('PKW-Abstellplätze', 'PKW-Abstellplätze'),
        ('Sonstiges', 'Sonstiges'),
    ]

    RAUMANGEBOT = [
        ('co_working', 'Co-Working'),
        ('geschaeftslokale', 'Geschäftslokal(e)'),
        ('bueros', 'Büros'),
        ('veranstaltungsraum', 'Veranstaltungsraum'),
        ('gemeinschaftskueche', 'Gemeinschaftsküche'),
        ('kinderspielraum', 'Kinderspielraum'),
        ('sauna_wellness', 'Sauna / Wellness'),
        ('fitnessraum', 'Fitnessraum'),
        ('werkstatt', 'Werkstatt'),
        ('waschkueche', 'Waschküche'),
        ('musikraum', 'Musikraum'),
        ('gaestewohnung', 'Gästewohnung'),
    ]

    BAUWEISE = [
        ('Holz', 'Holz'),
        ('Beton', 'Beton'),
        ('Ziegel', 'Ziegel'),
        ('Mischbauweise', 'Mischbauweise'),
        ('Sonstiges', 'Sonstiges'),
    ]

    ZIELGRUPPEN = [
        ('Seniorinnen', 'Seniorinnen'),
        ('Alleinerziehende', 'Alleinerziehende'),
        ('Geflüchtete', 'Geflüchtete'),
        ('Sonstige', 'Sonstige'),
    ]

    GPROJEKTE = [
        ('Foodcoop', 'Foodcoop'),
        ('Carsharing', 'Carsharing'),
        ('Urban Gardening', 'Urban Gardening'),
        ('Sonstiges', 'Sonstiges'),
    ]

    FREIANGEBOT = [
        ('Dachterrasse', 'Dachterrasse'),
        ('Beete', 'Beete'),
        ('Hochbeete', 'Hochbeete'),
        ('Landwirtschaft', 'Landwirtschaft'),
        ('Kinderspielplatz', 'Kinderspielplatz'),
    ]

    GEWERBE = [
        ('Kultur', 'Kultur'),
        ('Gastronomie', 'Gastronomie'),
        ('Verkauf', 'Verkauf'),
        ('Dienstleistung', 'Dienstleistung'),
        ('Gesundheit', 'Gesundheit'),
        ('NGO', 'NGO'),
        ('Kinderbetreuung', 'Kinderbetreuung'),
        ('Pension', 'Pension'),
    ]

    @property
    def kind_of_product(self):
            return "Wohnprojekt"


    eigentum          = CharField    ( 'Rechtliche Konstruktion', max_length = 6,    choices=EIGENTUM, help_text="Wähle aus der Liste aus!", null = True, blank=True )
    altneu            = CharField    ( 'Altbau/Neubau',  max_length = 4, choices=ALTNEU, help_text="Wähle aus der Liste aus!", null = True, blank=False )
    schwerpunkt       = CharField    ( 'Inhaltlicher Schwerpunkt',   max_length = 1024,  help_text="Beispiel: Wir sind nicht nur eine Baugruppe sondern ein Kulturverein mit über 80 Veranstaltungen im Jahr. Darüberhinaus befindet sich bei uns eine Wohngemeinschaft für unbegleitete, minderjährige Geflüchtete.", null = True, blank=True )
    wohnbaufoerderung = CharField    ( 'Wohnbauförderung',    max_length = 256,   choices=WOHNBAUFOERDERUNG, help_text="Wähle aus der Liste aus!", null = True, blank=True )
    artmodell         = TextField    ( 'Art des Modells',    max_length = 2048,   help_text="Klicke ins Feld, wähle aus der Liste aus, was am ehesten zutrifft und bearbeite den Text!", null = True, blank=True )
    bautraeger        = TextField    ( 'Bauträger',    max_length = 1024, help_text="Klicke ins Feld, wähle aus der Liste aus!", null = True, blank=True )
    architektur       = CharField    ( 'Architektur',    max_length = 1024, help_text="z.B. Entwurf, Planung, Ausführung", null = True, blank=True )
    aerwachsene       = IntegerField ( 'Anzahl an Erwachsenen', help_text="Wenn du keine genauen Zahlen hast, gib eine Schätzung ab.", validators=[MinValueValidator(0), MaxValueValidator(9999)], default = 0, null = True, blank=False )
    akinder           = IntegerField ( 'Anzahl an Kinder', help_text="Wenn du keine genauen Zahlen hast, gib eine Schätzung ab.", validators=[MinValueValidator(0), MaxValueValidator(9999)], default = 0,  null = True, blank=False )
    @property
    def amitglieder(self):
            return self.aerwachsene + self.akinder
    awohnungen        = IntegerField( 'Anzahl an Wohnungen', help_text="Wenn du keine genauen Zahlen hast, gib eine Schätzung ab.", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
    wohnflaeche            = IntegerField( 'Wohnfläche', help_text="in Quadratmetern; wenn du keine Zahlen hast, dann lass das Feld frei.", validators=[MinValueValidator(0)], default = 0, null = True,  )
    gewerbeflaechen        = IntegerField( 'Gewerbeflächen', help_text="in Quadratmetern; wenn du keine Zahlen hast, dann lass das Feld frei.", validators=[MinValueValidator(0)], default = 0, null = True,  )
    gemeinschaftsflaeche   = IntegerField( 'Gemeinschaftsflächen', help_text="in Quadratmetern; wenn du keine Zahlen hast, dann lass das Feld frei.", validators=[MinValueValidator(0)], default = 0, null = True,  )
    sonstige_flaechen      = IntegerField( 'Sonstige Flächen', help_text="in Quadratmetern; wenn du keine Zahlen hast, dann lass das Feld frei.", validators=[MinValueValidator(0)], default = 0, null = True,  )
    flaeche                = IntegerField( 'Gesamte Nutzfläche', help_text="in Quadratmetern; wenn du keine Zahlen hast, dann lass das Feld frei.", validators=[MinValueValidator(0)], default = 0, null = True,  )
    # @property
    # def flaeche(self):
    #         return self.wohnflaeche + self.gewerbeflaechen + self.gemeinschaftsflaeche + self.sonstige_flaechen
    kflaechen          = CharField         ( 'Weitere Flächen', max_length = 2048, help_text="Hier kannst du weitere Angaben mache; z.B zum Gewerbe im Haus: Kultur, Gastronomie, Verkauf, Dienstleistung, Gesundheit, NGO, Kinderbetreuung, Pension", null = True, blank=True )
    gemeinschaftr      = MultiSelectField  ( 'Gemeinschaftsräume',    max_length = 1024,   choices=GEMEINSCHAFTR, help_text="Mehrfachnennungen sind möglich.", null = True, blank=True )
    kgemeinschaftr     = CharField         ( 'Gemeinschaftsräume - Sonstiges', max_length = 2048, help_text="Gibt es noch andere/weitere Gemeinschaftsräume, die nicht in der Liste stehen?", null = True, blank=True )
    raumangebot        = MultiSelectField  ( 'Raumangebot nach Außen',    max_length = 1024,   choices=RAUMANGEBOT, help_text="Mehrfachnennungen sind möglich.", null = True, blank=True )
    kraumangebot       = CharField         ( 'Raumangebot nach Außen - Sonstiges',    max_length = 512,  help_text="Welche Raumangebote bietet ihr nach Außen an?", null = True, blank=True )
    gewerbe            = MultiSelectField  ( 'Gewerbe',  max_length = 96, choices=GEWERBE, help_text="Was gibt es für Gewerbe?", null = True, blank=True )
    inseratstext       = TextField         ( 'Raumangebote',   max_length = 1024,  help_text="Möchtet ihr euer Raumangebot inserieren? Dann habt ihr hier die Möglichkeit einen Inserattext mit dem Angebot zu verfassen. Beispiel: Ihr könnt für Veranstaltungen unseren Multifunktionsraum mieten. Außerdem haben wir laufen Plätze in unserem Coworkingspace frei. Kontaktiert uns per Email!", null = True, blank=True )
    sonderwohnformen   = CharField         ( 'Sonderwohnformen',   max_length = 512,  help_text='Welche Sonderwohnformen hat das Projekt? (z.B. Wohncluster, WGs, Sonstiges) Beispiel: Wir bieten sogenannte "Flexwohnungen" an, die auf drei Jahre befristet vermietet werden. Mit Flexwohnungen können wir auf familiäre Veränderungen reagieren. z.b. bei Nachwuchs können wir die Flexwohnungen einer wachsenden Familie zuschlagen.', null = True, blank=True )
    parbeiten          = IntegerField      ( 'Wie viele Personen arbeiten im Haus', help_text="Damit sind Personen gemeint die in Gewerbräumen, in einer Praxis, einem Coworking usf. arbeiten.", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
    karbeiten          = CharField         ( 'Wie viele Personen arbeiten im Haus - Kommentar',   max_length = 1024,  help_text="Sag uns die Personen so machen! Beispiel: Die meisten arbeiten im Coworking, aber wir haben auch ein Tonstudio und einen Masseur im Haus.", null = True, blank=True )
    bauweise           = CharField         ( 'Bauweise',  max_length = 64, help_text="Klicke ins Feld, wähle aus der Liste aus oder mach einen passenden Eintrag!", null = True, blank=True )
    zielgruppen        = CharField         ( 'Besondere Zielgruppen',  max_length = 64, help_text="Gibt es eine Bewohnergruppe die bewusst gesucht wurde und die überdurchschnittlich vertreten ist? Beispiel: SeniorInnen und StudentInnen", null = True, blank=True )
    gprojekte          = CharField         ( 'Gemeinschaftliche Projekte',  max_length = 128, help_text="Welche gemeinschaftlichen Projekte sind entstanden/geplant? Beispiel: Foodcoop, Carsharing und Leihladen. Du kannst mehrere nennen.", null = True, blank=True )
    oekologie          = CharField         ( 'Ökologie',  max_length = 512, help_text="Hat das Projekt ökologisch nachhaltige Besonderheiten? Beispiel: Wir bewohnen ein Niedrigenergiehaus. Das hilft uns Kosten zu sparen und unseren CO2 Verbrauch zu reduzieren. Auf dem Dach befindet sich eine gemeinschaftliche PV-Anlage.", null = True, blank=True )
    freiraumangebote   = CharField         ( 'Freiraumangebote',  max_length = 64, choices=FREIANGEBOT, help_text="Beispiel: Gemeinschaftsterrasse, Innenhof, Dachterrassen, Hochbeete. Du kannst mehrere nennen.", null = True, blank=True )
    gaestwohnungen     = IntegerField      ( 'Anzahl an Gästewohnungen', help_text="Anzahl an Gästewohnungen", validators=[MinValueValidator(0)], default = 0 )
    urbanem            = BooleanField      ( 'Urbane Mischung', default=False, help_text="Gibt es im Haus neben dem Wohnen auch anderen urbane Funktionen wie Arbeiten, Gewerbe, Kultur, Bildung usf. (Und ist der Anteil dieser Flächen nennenswert?) Wenn ja dann kreuze dieses Feld an!", blank=False )



class SearchAgent(models.Model):

    def hash_gen():
        return uuid.uuid1().hex

    email           = EmailField         ( 'Email',   max_length = 2048, help_text="Email des Projektes", null = False, blank=False )
    ort             = MultiSelectField   ( 'Ort', max_length = 4096 ,    choices=Product.ORT, default='', help_text="Ort des Projektes", null = True, blank=False )
    hash            = CharField          ( max_length=255, default=hash_gen )


class Trigger(models.Model):

    ort             = MultiSelectField   ( 'Ort', max_length = 4096 ,    choices=Product.ORT, default='', help_text="Ort des Projektes", null = True, blank=False )
    instancepk      = IntegerField       ( 'Id of original instance', help_text="Id of the product instance", default = 0, null = False,  )
    sent            = BooleanField       ( 'Sent', default=False, help_text="Wurde es berreits gesendet?", blank=False )
    sentdate        = DateTimeField      (  auto_now=False, auto_now_add=False, help_text="Wann wurde es gesendet?", blank=True, null = True, )


class Link(models.Model):
    product = ForeignKey(Product, on_delete=models.CASCADE)
    link_description = CharField(null=True, blank=True, max_length = 2048)
    link = URLField(null=True, blank=True, max_length = 2048)

def product_path(instance, filename):
    return 'marktplatz/media/{0}/{1}'.format(instance.product.id, filename)


class Media(models.Model):
    fs = FileSystemStorage(location=settings.MEDIA_ROOT)

    product = ForeignKey(Product, on_delete=models.CASCADE)
    name_for = CharField(blank = True,max_length = 256)

    filename = CharField(max_length = 100)
    copyright = CharField(blank=True, max_length = 100)
    image = ImageField(upload_to=product_path,storage=fs)
    image_small = ProcessedImageField(upload_to=product_path,
                                      processors=[ResizeToCover(640, 360)],
                                      format='JPEG',
                                      options={'quality': 90})
    image_medium= ProcessedImageField(upload_to=product_path,
                                     processors=[ResizeToCover(960, 540)],
                                     format='JPEG',
                                     options={'quality': 90})
    image_big = ProcessedImageField(upload_to=product_path,
                                     processors=[ResizeToCover(1920, 1080)],
                                     format='JPEG',
                                     options={'quality': 90})
    image_norm = ProcessedImageField(upload_to=product_path,
                                     processors=[Thumbnail(640, 360)],
                                     format='JPEG',
                                     options={'quality': 90},
                                     blank = True,
                                     null = True)

    def filename(self):
        return os.path.basename(self.image.name).split('.')[0]


    # These two auto-delete files from filesystem when they are unneeded:
    #
@receiver(models.signals.post_delete, sender=Media)
def auto_delete_file_on_delete(sender, instance, **kwargs):
   """
   Deletes file from filesystem
   when corresponding `MediaFile` object is deleted.
   """

   if instance.image:
       if os.path.isfile(instance.image.path):
           os.remove(instance.image.path)
#
   if instance.image_small:
       if os.path.isfile(instance.image_small.path):
           os.remove(instance.image_small.path)
#
   if instance.image_medium:
       if os.path.isfile(instance.image_medium.path):
           os.remove(instance.image_medium.path)
#
   if instance.image_big:
       if os.path.isfile(instance.image_big.path):
           os.remove(instance.image_big.path)
#
   if instance.image_norm:
       if os.path.isfile(instance.image_norm.path):
           os.remove(instance.image_norm.path)
#
   #os.remove(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}_big'.format(instance.Product.id, instance.filename))
   #os.remove(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}.jpg'.format(instance.Product.id, instance.image.name))


class Video(models.Model):
    product = ForeignKey(Product, on_delete=models.CASCADE)
    name_for = CharField(blank=True, max_length=256)

    filename = CharField(max_length=100)
    copyright = CharField(blank=True, max_length=100)
    image = FileField(upload_to=product_path)

@receiver(models.signals.post_delete, sender=Video)
def auto_delete_video_on_delete(sender, instance, **kwargs):
    """
    Deletes file from filesystem
    when corresponding `MediaFile` object is deleted.
    """
    if instance.image:
        if os.path.isfile(instance.image.path):
            os.remove(instance.image.path)



class Credit(models.Model):
    owner = CharField(verbose_name='Building or Product owner',blank=True,max_length = 300)
    architecture = CharField(verbose_name='Architecture',blank=True,max_length = 300)
    concept = CharField(verbose_name='Product artist/ concept/ design/ planning',blank=True,max_length = 300)
    structural_engeneering = CharField(verbose_name='Structural engineering',blank=True,max_length = 300)
    facade_design = CharField(verbose_name='Facade design',blank=True,max_length = 300)
    face_construction = CharField(verbose_name='Facade construction',blank=True,max_length = 300)
    kinetic_design = CharField(verbose_name='Kinetic engineering',blank = True,max_length = 300)
    light_design = CharField(verbose_name='Light design',blank = True,max_length = 300)
    tecnical_layout = CharField(verbose_name='Technical layout light',blank = True,max_length = 300)
    display_content = CharField(verbose_name='Display content/ visuals/ showreel',blank = True,max_length = 300)
    light_hardware = CharField(verbose_name='Light hardware (LED hardware)',blank = True,max_length = 300)
    lightning_software = CharField(verbose_name='Lighting control software',blank = True,max_length = 300)
    product_coordination = CharField(verbose_name='Product co-ordination',blank = True,max_length = 300)
    membrane_skin = CharField(verbose_name='Membrane skin',blank = True,max_length = 300)
    interaction_design = CharField(verbose_name='Interaction design/ programming',blank = True,max_length = 300)
    sponsor = CharField(verbose_name='Product sponsor/ support',blank = True,max_length = 500)
    module_elems = CharField(verbose_name='Pixel or other basic module/ elements',blank = True,max_length = 300)

    def __iter__(self):
        for field in self._meta.fields:
            if field.value_to_string(self) != '-' and field.value_to_string(self) != 'N/A':
                yield (field.verbose_name, field.value_to_string(self))
