from django.db import models
from django.contrib.postgres.fields import ArrayField
from django.db.models import JSONField
from django.db import models
from django.utils import timezone
from django.conf import settings
from organisations.models import *
from users.models import Staff

class CustomerType(models.Model):
    customer_type =  models.CharField(max_length=100)
    date_added = models.DateTimeField(default = timezone.now)
    customer_type_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='customer_type_added_by', null=True, blank=True)
    organisation =  models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='organisation_customer_type')
    has_members = models.BooleanField(default=False)
    source_client_type =  models.IntegerField(null=True, blank=True)

    class Meta:
        unique_together = ('customer_type','organisation')
        db_table = 'public\".\"customer_type'

    # def __str__(self):
    #     return self.customer_type

class GroupCategory(models.Model):
    category_name = models.CharField(max_length=100)
    date_added = models.DateTimeField(default=timezone.now)
    group_category_added_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='group_category_added_by',
        null=True,
        blank=True,
    )
    organisation = models.ForeignKey(
        Organisation,
        on_delete=models.CASCADE,
        related_name='organisation_group_category',
    )

    class Meta:
        unique_together = ('category_name', 'organisation')
        db_table = 'public\".\"group_category'

    def __str__(self):
        return self.category_name

class CustomerRegField(models.Model):
    FIELDS_TYPE = (('date', 'Date'),
        ('file', 'File'),
        ('text', 'Text'),
        ('number', 'Number'),
        ('checkbox', 'Checkbox'),
        ('radio', 'Radio'),
        ('textarea', 'Text Area'),
        ('select', 'Select')
        )
    field_label =  models.CharField(max_length=100)
    field_type = models.CharField(max_length = 25, choices=FIELDS_TYPE)
    field_abbreviation =  models.CharField(max_length=50,null=True, blank=True)
    date_added = models.DateTimeField(default = timezone.now)
    is_active = models.BooleanField(default=True)
    customer_reg_field_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='customer_reg_field_added_by', null=True, blank=True)

    class Meta:
        db_table = 'public\".\"customer_reg_field'

    def __str__(self):
        return self.field_label

class CustomerRegFieldOption(models.Model):
    field_option_label =  models.CharField(max_length=100)
    field_option_value =  models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    date_added = models.DateTimeField(default = timezone.now)
    customer_reg_field_option = models.ForeignKey(CustomerRegField, on_delete=models.CASCADE, related_name='customer_reg_field_option')
    customer_reg_field_option_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='customer_reg_field_option_added_by', null=True, blank=True)

    class Meta:
        unique_together = ('field_option_label', 'customer_reg_field_option','field_option_value')
        db_table = 'public\".\"customer_reg_field_option'

class CustomerTypeField(models.Model):
    org_field_label =  models.CharField(max_length=100)
    org_field_abbreviation =  models.CharField(max_length=50,null=True, blank=True)
    customer_type_field =  models.ForeignKey(CustomerType, on_delete=models.CASCADE, related_name='customer_type_field')
    customer_reg_field  =  models.ForeignKey(CustomerRegField, on_delete=models.CASCADE, related_name='customer_reg_field')
    date_added = models.DateTimeField(default = timezone.now)
    customer_type_field_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='customer_type_field_added_by', null=True, blank=True)
    required = models.BooleanField(default=False)
    order    = models.IntegerField(default=0)
    section  = models.CharField(max_length = 200, null=False, blank=True)
    date_added  = models.DateTimeField(default = timezone.now)
    organisation =  models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='org_customer_type_field')
    is_active = models.BooleanField(default=True)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_customer_type_fields')
    deleted_at = models.DateTimeField(null=True, blank=True)
    
    class Meta:
        ordering = ('id',)
        unique_together = ('organisation', 'customer_reg_field','customer_type_field')
        db_table = 'public\".\"customer_type_field'

class Customer(models.Model):
    GENDER = (('M', 'Male'),
    ('F', 'Female'),
    ('O', 'Other')
    )
    name = models.CharField(max_length = 255, null=False, blank=False)
    member_number = models.CharField(max_length = 255, null=False, blank=False)
    old_member_number = models.CharField(max_length = 255, null=True, blank=True)
    telephone = models.CharField(max_length = 55, null=True, blank=True)
    email = models.EmailField(max_length=255, null=True, blank=True)
    nin = models.CharField(
        max_length=50, 
        null=True, 
        blank=False, 
        unique=True
    )
    gender = models.CharField(max_length = 55, null=True, blank=True, choices=GENDER)
    nationality = models.CharField(max_length = 255, default="Ugandan", null=True,)
    age = models.IntegerField(null=True, blank=True)
    disability = models.BooleanField(null=True, blank=True)
    district = models.CharField(max_length=255, null=True, blank=True)
    customer_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='customer_added_by', null=True, blank=True)
    status =  models.CharField(max_length=25, null=True, blank=True)
    customer_branch =  models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='customer_branch')
    branch_customer_type =  models.ForeignKey(CustomerType, on_delete=models.CASCADE, related_name='branch_customer_type')
    group_category = models.ForeignKey(GroupCategory, on_delete=models.SET_NULL, related_name='customers', null=True, blank=True)
    is_deleted = models.BooleanField(default=False)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_customers')
    deleted_at = models.DateTimeField(null=True, blank=True)
    customer_officer = models.ForeignKey(Staff, on_delete=models.CASCADE, related_name='customer_officer', null=True, blank=True)
    date_added = models.DateTimeField(default = timezone.now)
    is_biometric = models.BooleanField(default=False)
    card_id = models.CharField(max_length = 555, null=True, blank=True)
    is_trained = models.BooleanField(default=False)
    training_date = models.DateField(null=True, blank=True)
    def __str__(self):
        return self.name

    class Meta:
        db_table = 'public\".\"customer'
        ordering = ['date_added'] 

class CustomerFiles(models.Model):
    customer   =  models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='customer_file')
    url = models.URLField(max_length = 555)
    file_type = models.CharField(max_length = 55, default='profile_pic') #signature_pic
    date_added = models.DateTimeField(default = timezone.now)
    added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='customer_file_added_by')
    is_current = models.BooleanField(default=True)
   
    class Meta:
        unique_together = ('url', 'customer')
        db_table = 'public\".\"customer_files'

class CustomerFieldMeta(models.Model):
    value    =  models.TextField()
    customer_field   =  models.ForeignKey(CustomerTypeField, on_delete=models.CASCADE, related_name='customer_field')
    customer   =  models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='customer')
    customer_field_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='customer_field_added_by', null=True, blank=True)
   
    class Meta:
        unique_together = ('customer', 'customer_field')
        db_table = 'public\".\"customer_field_meta'

class Crop(models.Model):
    name = models.CharField(max_length=255)
    organisation = models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='organisation_crops')
    added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='crop_added_by', null=True, blank=True)
    date_added = models.DateTimeField(default=timezone.now)
    is_active = models.BooleanField(default=True)

    class Meta:
        unique_together = ('name', 'organisation')
        db_table = 'public\".\"crop'

    def __str__(self):
        return self.name


class CropVariety(models.Model):
    name = models.CharField(max_length=255)
    crop = models.ForeignKey(Crop, on_delete=models.CASCADE, related_name='varieties')
    added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='variety_added_by', null=True, blank=True)
    date_added = models.DateTimeField(default=timezone.now)
    is_active = models.BooleanField(default=True)

    class Meta:
        unique_together = ('name', 'crop')
        db_table = 'public\".\"crop_variety'

    def __str__(self):
        return self.name


class FarmingHistory(models.Model):
    SEASON_CHOICES = (
        ('A', 'Season A (Jan - Jun)'),
        ('B', 'Season B (Aug - Dec)'),
    )
    ACTIVITY_CHOICES = (
        ('production', 'Production'),
        ('marketing', 'Marketing'),
        ('processing', 'Processing'),
        ('animal_husbandry', 'Animal Husbandry'),
    )
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='farming_history')
    year = models.IntegerField()
    season = models.CharField(max_length=1, choices=SEASON_CHOICES)
    activity_type = models.CharField(max_length=50, choices=ACTIVITY_CHOICES)
    activity_data = JSONField(default=dict, blank=True)
    total_sales = models.DecimalField(max_digits=15, decimal_places=2, default=0)
    total_investment = models.DecimalField(max_digits=15, decimal_places=2, default=0)
    profit = models.DecimalField(max_digits=15, decimal_places=2, default=0)
    roi = models.DecimalField(max_digits=8, decimal_places=2, default=0)
    added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='farming_history_added_by', null=True, blank=True)
    date_added = models.DateTimeField(default=timezone.now)

    class Meta:
        db_table = 'public\".\"farming_history'
        ordering = ['-year', 'season']

    def __str__(self):
        return f"{self.customer.name} - {self.year} Season {self.season} - {self.activity_type}"


class GroupMembership(models.Model):
    ROLES = (
        ('Member', 'Member'),
        ('Chair Person', 'Chair Person'),
        ('Secretary', 'Secretary'),
        ('Treasurer', 'Treasurer')
    )
    member   =  models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='member_group')
    group = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='group_member')
    role    =  models.TextField(choices=ROLES, default='Member')
    active = models.BooleanField(default=True)
    date_added = models.DateTimeField(default = timezone.now)
    added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='group_member_added_by', null=True, blank=True)
   
    class Meta:
        unique_together = ('member', 'group')
        db_table = 'public\".\"group_membership'
        ordering = ['date_added'] 

