from django.db import models
from django.contrib.auth.models import User
import uuid
from institutional.models import CorporateUser
import json

class ResetOTP(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    otp = models.CharField(max_length=10, blank=True,null = True,unique=True)
    uid = models.CharField(max_length=100, blank=True,null = True,unique=True)


    class Meta:
        ordering = ['-id']

    def __str__(self):
        return f"otp for {self.user}"



class ReferUser(models.Model):
    id = models.CharField(primary_key=True, default=uuid.uuid4, editable=False,max_length=36)
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    non_auth_user_email = models.CharField(max_length=100, blank=True, null=True)
    referId = models.CharField(max_length=100, blank=True)
    refferedBy = models.CharField(max_length=100, blank=True)
    totalRefferals = models.IntegerField(default=0)
    reffered_by = models.ForeignKey(
        User, on_delete=models.CASCADE, blank=True, null=True, related_name="ref_by"
    )

    # def __str__(self):
    #     return str(self.referId)

# class privilegedUser1(models.Model):
#     # id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
#     id = models.IntegerField(primary_key=True)
#     user = models.ForeignKey(User, on_delete=models.CASCADE,null=True)
#     rmuser = models.IntegerField(blank=True, null=True)
#     is_active = models.CharField(
#         max_length=100, blank=True, default="")  # yes/no
#     dateSubscribed = models.DateTimeField(auto_now=True)
#     transactionId = models.CharField(max_length=100, blank=True, default="")
#     chargeId = models.CharField(max_length=100, blank=True, default="")
#     razorpaySign = models.CharField(max_length=100, blank=True, default="")
#     # normal, yearly, Life Member
#     memberType = models.CharField(max_length=100, blank=True, default="")
#     months = models.IntegerField(default=0)
#     amount_captured = models.CharField(max_length=100, blank=True, default="")
#     amount_refunded = models.CharField(max_length=100, blank=True, default="")
#     application = models.CharField(max_length=100, blank=True, default="")
#     application_fee_amount = models.CharField(
#         max_length=100, blank=True, default="")
#     city = models.CharField(max_length=100, blank=True, default="")
#     country = models.CharField(max_length=100, blank=True, default="")
#     line1 = models.CharField(max_length=100, blank=True, default="")
#     line2 = models.CharField(max_length=100, blank=True, default="")
#     postal_code = models.CharField(max_length=100, blank=True, default="")
#     state = models.CharField(max_length=100, blank=True, default="")
#     email = models.CharField(max_length=100, blank=True, default="")
#     name = models.CharField(max_length=100, blank=True, default="")
#     phone = models.CharField(max_length=100, blank=True, default="")
#     currency = models.CharField(max_length=100, blank=True, default="")
#     created = models.CharField(max_length=100, blank=True, default="")
#     customer = models.CharField(max_length=100, blank=True, default="")
#     invoice = models.CharField(max_length=100, blank=True, default="")
#     paid = models.CharField(max_length=100, blank=True, default="")
#     card_brand = models.CharField(max_length=100, blank=True, default="")
#     card_country = models.CharField(max_length=100, blank=True, default="")
#     card_exp = models.CharField(max_length=100, blank=True, default="")
#     card_funding = models.CharField(max_length=100, blank=True, default="")
#     receipt_email = models.CharField(max_length=100, blank=True, default="")
#     receipt_url = models.CharField(max_length=100, blank=True, default="")
#     status = models.CharField(max_length=100, blank=True, default="")

class UserCredentialsForBlockchain(models.Model):
    blockChain_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    privateKey = models.CharField(max_length=1000, blank=True, null=True)
    publicKey = models.CharField(max_length=1000, blank=True, null=True)
    transaction_hash = models.CharField(max_length=1000, blank=True, null=True)



class Institutional_user(models.Model):
    id = models.IntegerField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    """
    name , email will be saved in User model which is inherited from Django structure
    """

    # normal , admin , student , corporate_admin
    user_role = models.CharField(default="normal", max_length=15)

    # Institute = models.ForeignKey(Institute, on_delete=models.CASCADE)

    is_admin = models.BooleanField(default=True)

    plans = models.CharField(max_length=30, blank=True, null=True)
    registered_date = models.DateTimeField(auto_now_add=True)
    # month and year will be registered, not date
    passing_date = models.DateField(null=True, blank=True)
    document1 = models.FileField(
        upload_to="kycdocument/", blank=True, null=True)  # front ID
    document2 = models.FileField(
        upload_to="kycdocument/", blank=True, null=True)  # back ID
    # verified/registred/active/banned/fraud
    status = models.CharField(max_length=20, null=True, blank=True)
    isactive = models.BooleanField(default=False)
    credits = models.IntegerField(default=0)
    activated_date = models.DateTimeField(auto_now_add=True)
    license_required = models.IntegerField(null=True, blank=True)
    list_users = models.TextField(default="", null=True, blank=True)
    phonenumber = models.CharField(max_length=100, blank=True, null=True)
    phonenumber2 = models.CharField(max_length=100, blank=True, null=True)
    email = models.CharField(max_length=100, blank=True, null=True)
    email2 = models.CharField(max_length=100, blank=True, null=True)
    billing_limit = models.IntegerField(null=True, blank=True)
    # custom domain set by Admin only after its verification for Student Verification.
    custom_domain = models.CharField(max_length=100, blank=True, null=True)

    def set_list_user(self, x):
        self.list_users = json.dumps(x)

    def get_list_user(self):
        return json.loads(self.list_users)



class Certificate(models.Model):
    user_name = models.CharField(max_length=100)
    id = models.IntegerField(primary_key=True)

class BlockchainUserInfo(models.Model):
    # user_id = models.IntegerField()
    blockchain_user_info_uuid = models.UUIDField(
        primary_key=True, default=uuid.uuid4, editable=False
    )
    coprate_user = models.ForeignKey(CorporateUser, on_delete=models.CASCADE,blank=True, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    user_name = models.CharField(max_length=100,blank=True, null=True)
    tx_hash = models.CharField(max_length=100,blank=True, null=True)
    service = models.CharField(max_length=100,blank=True, null=True)
    gas_fee = models.CharField(max_length=100,blank=True, null=True)
    script_name = models.CharField(max_length=100,blank=True, null=True)
    uploaded_by = models.CharField(max_length=100,blank=True, null=True)
    upload_date = models.DateField(auto_now_add=True)
    date_at = models.DateTimeField(auto_now_add=True)


class Wallet(models.Model): 
    id = models.IntegerField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    balance = models.FloatField(null=True, blank=True, default=0.0)
    mm_balance = models.FloatField(null=True, blank=True, default=0.0)
    lpp_balance = models.FloatField(null=True, blank=True, default=0.0)
    im_balance = models.FloatField(null=True, blank=True, default=0.0)
    active_list = models.TextField(default="[]", null=True, blank=True)

    available = models.IntegerField(default=0)
    mature_date = models.DateField(auto_now=True)

    def set_active_list(self, x):
        self.active_list = json.dumps(x)

    def get_active_list(self):
        return json.loads(self.active_list)

    def is_active(self):
        if(("MM" in self.active_list) or ("LPP" in self.active_list)):
            return True
        else:
            return False

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