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


class VslaMembership(models.Model):
    ROLES = (
        ('Member', 'Member'),
        ('Chair Person', 'Chair Person'),
        ('Secretary', 'Secretary'),
        ('Treasurer', 'Treasurer')
    )

    name          = models.CharField(max_length = 555)
    member_number = models.CharField(max_length = 555)
    telephone     = models.CharField(max_length = 555)
    gender        = models.CharField(max_length = 555,null=True)
    group         = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='vsla_membership_group')
    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='vsla_membership_added_by', null=True, blank=True)
   
    class Meta:
        db_table = 'public\".\"vsla_membership' 




class VslaSavings(models.Model):

    TRANSACTION_TYPE = (
        ('dr', 'dr'),
        ('cr', 'cr')
    )

    heading          = models.CharField(max_length = 555)
    amount           = models.FloatField()
    membership       = models.ForeignKey(VslaMembership, on_delete=models.CASCADE, related_name='vsla_savings')
    group            = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='vsla_customer_group')
    transaction_type = models.TextField(choices=TRANSACTION_TYPE)
    record_date      = models.DateTimeField(default = timezone.now)
    date_added       = models.DateTimeField(default = timezone.now)
    added_by         = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='vsla_savings_added_by', null=True, blank=True)
   
    class Meta:
        db_table = 'public\".\"vsla_savingsship' 


class VslaMemberShares(models.Model):

    TRANSACTION_TYPE = (
        ('dr', 'dr'),
        ('cr', 'cr')
    )

    shares           = models.FloatField()
    amount           = models.FloatField()
    membership       = models.ForeignKey(VslaMembership, on_delete=models.CASCADE, related_name='vsla_shares')
    group            = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='vsla_shares_customer_group')
    transaction_type = models.TextField(choices=TRANSACTION_TYPE)
    record_date      = models.DateTimeField(default = timezone.now)
    date_added       = models.DateTimeField(default = timezone.now)
    added_by         = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='vsla_shares_added_by', null=True, blank=True)
   
    class Meta:
        db_table = 'public\".\"vsla_member_shares' 


class VslaShareSettings(models.Model):

    min_shares    = models.FloatField()
    share_value   = models.FloatField()
    max_shares    = models.FloatField()
    share_cap     = models.FloatField()
    group         = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='vsla_share_settings_group')
    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='vsla_share_settings_added_by', null=True, blank=True)
   
    class Meta:
        db_table = 'public\".\"vsla_shares_settings' 

class VslaLoanSettings(models.Model):
    
    aid           = models.FloatField(null=True, blank=True)
    name          = models.CharField(max_length = 555)
    int_rate      = models.FloatField()
    loan_period   = models.FloatField()
    min_amount    = models.FloatField()
    max_amount    = models.FloatField()
    int_method    = models.CharField(max_length = 555)
    period_type   =  models.CharField(max_length = 555)
    group         = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='vsla_loan_settings_group')
    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='vsla_loan_settings_added_by', null=True, blank=True)
   
    class Meta:
        db_table = 'public\".\"vsla_loan_settings' 


class VslaLoans(models.Model):

    status = (
        ('pending', 'pending'),
        ('approved', 'approved'),
        ('disbursed', 'disbursed')
        )
    aid            = models.FloatField(null=True, blank=True)
    loan_product   = models.FloatField()
    amount         = models.FloatField()
    int_rate       = models.FloatField(null=True, blank=True)
    int_method     = models.CharField(max_length = 555)
    membership     = models.ForeignKey(VslaMembership, on_delete=models.CASCADE, related_name='vsla_loans')
    record_date    = models.DateTimeField(default = timezone.now)
    reason         = models.CharField(max_length = 555)
    loan_status    =models.CharField(max_length = 555,null=True, blank=True)
    group          = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='vsla_loans_settings_group')
    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='vsla_loans_settings_added_by', null=True, blank=True)
   
    class Meta:
        db_table = 'public\".\"vsla_loans' 

class VslaLoanPayments(models.Model):
    TRANSACTION_STATUS = (('cr', 'Cr'),
                        ('dr', 'Dr')
    )
    loan_application = models.CharField(max_length = 555,null=True, blank=True)
    loan_payments_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='vsla_loan_payments_added_by', null=True, blank=True)
    int_paid = models.FloatField(default=0.0)
    princ_paid = models.FloatField(default=0.0)
    penalty_paid = models.FloatField(default=0.0)
    heading=models.CharField(max_length = 555)
    payment_date = models.DateTimeField(default = timezone.now)
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    transaction_type = models.CharField(max_length=50, choices=TRANSACTION_STATUS, default='cr')

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



class VslaAgentSavings(models.Model):

    TRANSACTION_TYPE = (
        ('dr', 'dr'),
        ('cr', 'cr')
    )
    trans_status = (
        ('pending', 'pending'),
        ('cr', 'cr'),
        ('reverse', 'reverse'),
        )
    

    heading          = models.CharField(max_length = 555)
    amount           = models.FloatField()
    account_id       = models.CharField(max_length = 555)
    status             = models.TextField(choices=trans_status,default='pending')
    transfer_user_type =models.CharField(max_length = 555,null=True, blank=True)
    officer_id         =models.CharField(max_length = 555,null=True, blank=True)
    member_id          =models.CharField(max_length = 555,null=True, blank=True)
    group            = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='vsla_agent_savings_group')
    transaction_type = models.TextField(choices=TRANSACTION_TYPE)
    record_date      = models.DateTimeField(default = timezone.now)
    date_added       = models.DateTimeField(default = timezone.now)
    added_by         = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='vsla_agent_savings_added_by', null=True, blank=True)

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


class MobileCustomerOtpState(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='mobile_otp_states')
    session_token_hash = models.CharField(max_length=64)
    otp_hash = models.CharField(max_length=128, null=True, blank=True)
    attempts = models.IntegerField(default=0)
    locked_until = models.DateTimeField(null=True, blank=True)
    last_request = models.DateTimeField(null=True, blank=True)
    otp_expires_at = models.DateTimeField(null=True, blank=True)
    date_added = models.DateTimeField(default=timezone.now)
    last_updated = models.DateTimeField(default=timezone.now)

    class Meta:
        db_table = 'public\".\"mobile_customer_otp_state'
        unique_together = ('customer', 'session_token_hash')

