from django.db import models
from django.utils import timezone
from organisations.models import Organisation, OrganisationBranch
from ledgers.models import OrganisationSubAccount,SystemTransactions
from users.models import User
from customers.models import Customer
from ledgers.models import SystemTransactions

# SMS Banking Models

class SMSTypes(models.Model):
    CHARGE_OPTIONS = (
        ('Institution', 'Institution'),
        ('QDF', 'QDF')
    )
    
    sms_type_name =  models.CharField(max_length=255)
    sms_type_key  =  models.CharField(max_length=50)
    status        =  models.CharField(max_length=50, default='pending')
    charged_to    =  models.CharField(max_length=50, default='institution', choices=CHARGE_OPTIONS)
    base_fee      =  models.FloatField()
    date_added    = models.DateTimeField(default = timezone.now)
    added_by      = models.BigIntegerField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"sms_types'
    
    def __str__(self):
        return self.sms_type_name
    

class SMSRequest(models.Model):
    PAYMENT_OPTIONS = (
        ('e-wallet', 'E Payment'),
        ('bank', 'Bank'),
        ('cash', 'Cash'),
    )
    
    SMS_STATUSES = (
        ('pending', 'Pending'),
        ('approved', 'Approved'),
        ('canceled', 'Canceled'),
    )
    
    organisation     = models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='organisation', blank=False, null=False)
    requested_amount = models.FloatField()
    approved_amount  = models.FloatField(default=0)
    sms_cost         = models.BigIntegerField(default=0)
    selected_account = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='selected_chart', null=True, blank=True)
    status           = models.CharField(max_length=50, choices=SMS_STATUSES, default='pending')
    payment_method   = models.CharField(max_length=255, choices=PAYMENT_OPTIONS, default='e-wallet')
    requested_by     = models.ForeignKey(User, on_delete=models.CASCADE, related_name='requester', blank=False, null=False)
    approved_by      = models.ForeignKey(User, on_delete=models.CASCADE, related_name='approver', blank=True, null=True)
    date_added       = models.DateTimeField(default = timezone.now)
    last_added       = models.DateTimeField(default = timezone.now)
    comment          = models.CharField(max_length=255, blank=True, null=True)
    class Meta:
        db_table     = 'public\".\"sms_request'

class OrganisationSmsSubscription(models.Model):
    CHARGE_TYPES = (
    ('sacco', 'Sacco'),
    ('member', 'Member'),
    )

    sms_type         = models.ForeignKey(SMSTypes, on_delete=models.CASCADE, related_name='smsy_type', blank=False, null=False)
    charge           = models.FloatField(null=False, blank=False)
    charged_to       = models.CharField(max_length=255, choices=CHARGE_TYPES, default = 'sacco')
    organisation     = models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='org_sms_sub', blank=False, null=False)
    is_subscribed    = models.BooleanField(null=False, blank=False, default=False)
    added_by         = models.ForeignKey(User, on_delete=models.CASCADE, related_name='org_sms_sub_added_by', blank=False, null=False)
    last_updated_by  = models.ForeignKey(User, on_delete=models.CASCADE, related_name='org_sms_sub_last_updated_by', blank=False, null=False)
    date_added       = models.DateTimeField(default=timezone.now)
    last_updated     = models.DateTimeField(default=timezone.now)
    
    class Meta:
        db_table     = 'public\".\"organisation_sms_subscription'

class MemberSmsSubscription(models.Model):
    org_subscription = models.ForeignKey(OrganisationSmsSubscription, on_delete=models.CASCADE, related_name='mem_org_subscription', blank=False, null=False)
    is_subscribed    = models.BooleanField(null=False, blank=False, default=False)
    customer         = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='mem_sms_customer', blank=False, null=False)
    sub_added_by     = models.ForeignKey(User, on_delete=models.CASCADE, related_name='mem_sms_sub_added_by', blank=False, null=False)
    sub_last_updated_by  = models.ForeignKey(User, on_delete=models.CASCADE, related_name='mem_sms_sub_last_updated_by', blank=False, null=False)
    date_added       = models.DateTimeField(default=timezone.now)
    last_updated     = models.DateTimeField(default=timezone.now)
    class Meta:
        db_table     = 'public\".\"member_sms_subscription'

class OrganisationFreeSmsAward(models.Model):
    organisation = models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='free_sms_organisation', blank=False, null=False)
    heading      = models.TextField(null=False, blank=False, default=False)
    amount       = models.FloatField()
    added_by     = models.ForeignKey(User, on_delete=models.CASCADE, related_name='org_free_sms_added_by', blank=False, null=False)
    updated_by  = models.ForeignKey(User, on_delete=models.CASCADE, related_name='org_free_sms_last_updated_by', blank=False, null=False)
    date_added   = models.DateTimeField(default=timezone.now)
    last_updated = models.DateTimeField(default=timezone.now)
    
    class Meta:
        db_table     = 'public\".\"organisation_free_sms_award'

class CustomerFreeSmsAward(models.Model):
    customer  = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='free_sms_customer', blank=False, null=False)
    sms_count = models.IntegerField(null=False, blank=False, default=0)
    date_added   = models.DateTimeField(default=timezone.now)
    last_updated = models.DateTimeField(default=timezone.now)
    
    class Meta:
        db_table     = 'public\".\"customer_free_sms_award' 

class SmsPurchaseTransactions(models.Model):
    request      = models.ForeignKey(SMSRequest, on_delete=models.CASCADE, related_name='sms_request', blank=False, null=False)
    transaction  = models.ForeignKey(SystemTransactions, on_delete=models.CASCADE, related_name='sms_purchase_transactions', blank=False, null=False)
    date_added   = models.DateTimeField(default=timezone.now)
    last_updated = models.DateTimeField(default=timezone.now)
    class Meta:
        db_table     ='public\".\"sms_purchase_transactions'
              
class UserSms(models.Model):
    message          =  models.CharField(max_length=1000)
    is_sent          = models.BooleanField(default=False)
    sms_cost         =  models.FloatField()
    base_cost        =  models.FloatField(default=50)
    telephone        =  models.CharField(max_length=50)
    reciever_name    = models.CharField(max_length=1000,null=True, blank=True, default='')
    recieved_by      = models.BigIntegerField(null=False, blank=False,default=0)
    recieved_by_type = models.CharField(max_length=50,null=False, blank=False)
    is_free          = models.BooleanField(null=False, blank=False)
    sms_unique_key   =  models.CharField(max_length=255,default='',null=True, blank=True)
    sms_type         =  models.ForeignKey(SMSTypes, on_delete=models.CASCADE, related_name='sms_type', blank=False, null=False)
    branch           = models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='sms_branch', blank=False, null=False)
    date_added       = models.DateTimeField(default = timezone.now)
    class Meta:
        db_table     = 'public\".\"user_sms'

class UserSmsTransactions(models.Model):
    user_sms         = models.ForeignKey(UserSms, on_delete=models.CASCADE, related_name='user_sms', blank=False, null=False)
    transaction      = models.ForeignKey(SystemTransactions, on_delete=models.CASCADE, related_name='sms_transaction', blank=False, null=False)
    date_added       = models.DateTimeField(default = timezone.now)
    added_by         = models.BigIntegerField(null=True, blank=True)
    class Meta:
        db_table     = 'public\".\"user_sms_transactions'


