from django.shortcuts import render
import subprocess          
from sqlalchemy import create_engine, inspect, text
import io
from django.db import models
import calendar
import datetime
import re
import os
import math, random 
import json,jwt
import sys
from django.http import HttpResponse
from django.http import HttpResponseNotFound
import hashlib
import string
import secrets
import environ
import requests
import traceback
from rest_framework import status
from django.conf import settings  
from rest_framework.decorators import api_view, permission_classes, renderer_classes,authentication_classes
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated,AllowAny

from django.contrib.auth.hashers import make_password, check_password
from django.core.mail import send_mail
from django.core.files.storage import FileSystemStorage
from django.template.loader import get_template
from django.core.mail import EmailMultiAlternatives
from django.contrib.auth import authenticate
# from django.core.mail import send_mail
# from django.core.mail import EmailMessage

from sqlalchemy.exc import SQLAlchemyError

from datetime import date, timedelta
from django.utils import timezone

from Idpwoa_Backend import dbsession
from Idpwoa_Backend.JSONDateSerializer import JSONDateEncoder
from Idpwoa_Backend.settings import ALLOWED_HOSTS
from idpwoa.models import *
from Idpwoa_Backend.SQLAlchemyAuthenticationBackend import SQLAlchemyUserBackend
from Idpwoa_Backend.userrestframeworkTokenAuthenticaion import TokenAuthentication

env = environ.Env()
environ.Env.read_env()



new_limit = 5000



# idpwoa 

def get_current_time():
    current_time = datetime.datetime.now().strftime('%H:%M:%S')
    return current_time

def get_current_date():
    return datetime.datetime.now().strftime('%d-%m-%Y')

current_date = get_current_date()
# current_time = datetime.datetime.now().strftime('%H:%M:%S') 

current_time = get_current_time()

# Functions

def landingpage(request):
    # send_notification("New notification message")
    return render(request, 'landing page/index.html')
    # return render(request,'index.html',)


def checkIdNoExist(id,district):
	try:
		session = dbsession.Session()
		uid_length = session.query(UserRegistrationTbl).filter(UserRegistrationTbl.idno==id).all()
		if(len(uid_length) == 0):
			return 0
		else:
			# user_id = generateIdNo(district)
			# checkUserIdisExist(user_id)
			return 1
	except SQLAlchemyError as e:
		session.rollback()
		session.close()
		return False

def generateIdNo(district):
        print('aaa'+district)
        session = dbsession.Session()
        if district == 'Trivandrum' :
            #print('TVM')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/TVM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/TVM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kollam' :
            #print('KLM')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KLM/"+id
               
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KLM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Pathanamthitta' :
           #print('PTA')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/PTA/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/PTA/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Alappuzha' :
            #print('ALP')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/ALP/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/ALP/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kottayam' :
            #print('KTM')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KTM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KTM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Idukki' :
            #print('IDK')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/IDK/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/IDK/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Ernakulam' :
            #print('EKM')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/EKM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/EKM/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Thrissur' :
            #print('TSR')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/TSR/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/TSR/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Palakkad' :
            #print('PKD')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/PKD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/PKD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Malappuram' :
            #print('MLP')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/MLP/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/MLP/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kozhikode' :
            print('KKD')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KKD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KKD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Wayanad' :
            #print('WYD')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/WYD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/WYD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kannur' :
            #print('KNR')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KNR/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KNR/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1
        elif district == 'Kasargod' :
            #print('KGD')
            idObj = session.query(userIdTbl).filter(userIdTbl.district==district).first()
            if idObj :
               id="{:03d}".format(int(idObj.idno) + 1)
               idNo = "IDPWOA/KGD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    sql = session.query(userIdTbl).filter_by(district=district).update({'idno':id})
                    session.commit()
                    if sql >0:
                        return idNo
                    else :
                        return 1
            else :
               id="{:03d}".format(int(000) + 1)
               idNo = "IDPWOA/KGD/"+id
               userId = checkIdNoExist(idNo,district)
               if userId == 0 :
                    userObj = userIdTbl()
                    userObj.district = district
                    userObj.idno = id
                    userObj.createddate = datetime.datetime.now()
                    session.add(userObj)
                    session.commit()
                    session.refresh(userObj)
                    if userObj.id >0:
                        return idNo
                    else :
                        return 1

def checkEmailExist(email):
	try:
		session = dbsession.Session()
		email_length = session.query(loginTbl).filter(loginTbl.email==email).all()
		if(len(email_length) == 0):
			return 0
		else:
			# user_id = generateIdNo(district)
			# checkUserIdisExist(user_id)
			return 1
	except SQLAlchemyError as e:
		session.rollback()
		session.close()
		return False

# OTP
def generateRandomOTP():
	digits = "0123456789"
	OTP = ""
	for i in range(6) : 
		OTP += digits[math.floor(random.random() * 10)] 
	return OTP

def generate_key_from_name(name):
    # Hash the name using SHA-256
    # sha256 = hashlib.sha256()
    # sha256.update(name.encode('utf-8'))
    # hash_value = sha256.hexdigest()
    # key_part = hash_value[:7]
    # special_character = random.choice(string.punctuation)
    
    # return key_part + special_character
    random_key = secrets.token_hex(6 // 2)
    return random_key

def sendOTP(params):
    try :
        print('inside')
        ctx = {
            'OTP':params['otp_val'],
            'name':params['name']
                }
        plaintext = get_template('email/email.txt')
        htmly     = get_template('email/email.html')
        subject, from_email, to = 'Welcome to IDPWOA', 'idpwoakeralawebsite@gmail.com', params['email']
        text_content = plaintext.render(ctx)
        html_content = htmly.render(ctx)
        msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
        msg.attach_alternative(html_content, "text/html")
        msg.send()
        if msg:
            return True
        else:
            return False
        return False
    except Exception as e:
        print(e)
        return False

def forgotSendOTP(params):
	ctx = {
        'OTP':params['otp_val'],
            }
	plaintext = get_template('email/forgotemail.txt')
	htmly     = get_template('email/forgotemail.html')
	subject, from_email, to = 'Welcome to IDPWOA', 'idpwoakeralawebsite@gmail.com', params['email']
	text_content = plaintext.render(ctx)
	html_content = htmly.render(ctx)
	msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
	msg.attach_alternative(html_content, "text/html")
	msg.send()
	if msg:
		return True
	else:
		return False
	return False
 
def welcomeMail(params):
    try :
        ctx = {
            'name':params['name']
                }
        plaintext = get_template('email/welcome.txt')
        htmly     = get_template('email/welcome.html')
        subject, from_email, to = 'Welcome to IDPWOA', 'idpwoakeralawebsite@gmail.com', params['email']
        text_content = plaintext.render(ctx)
        html_content = htmly.render(ctx)
        msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
        msg.attach_alternative(html_content, "text/html")
        msg.send()
        if msg:
            return True
        else:
            return False
        return False
    except Exception as e:
        return False
    


# API
@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def user_registration(request):
    session = dbsession.Session()
    try :
        district = request.data['district']
        email = request.data['email']
        name = request.data['fname']+' '+request.data['lname']
        emailExist = checkEmailExist(email)
        print(district)
        idNo = generateIdNo(district)
        print(idNo)
        if emailExist == 0:
            if idNo !=1:
                userObj = UserRegistrationTbl()
                userObj.fname = request.data['fname']
                userObj.lname = request.data['lname']
                userObj.idno = idNo
                userObj.useraddress = request.data['useraddress']
                userObj.shopaddress = request.data['shopaddress']
                userObj.contactno = request.data['contactno']
                userObj.whatsappno = request.data['whatsappno']
                userObj.shoptype = request.data['shoptype']
                userObj.bloodgroup = request.data['bloodgroup']
                userObj.email = request.data['email']
                userObj.gender = request.data['gender']
                if request.data.getlist('userimage')!=['undefined']:
                    for f in request.data.getlist('userimage'):
                        fs = FileSystemStorage()
                        filename = fs.save(f.name,f)
                        uploaded_file_url = fs.url(filename)
                        userObj.userimageurl = uploaded_file_url
                
                if request.data.getlist('shopimage')!=['undefined']:
                    for f in request.data.getlist('shopimage'):
                        fs = FileSystemStorage()
                        filename = fs.save(f.name,f)
                        uploaded_file_url = fs.url(filename)
                        userObj.shopimageurl = uploaded_file_url
                userObj.district = request.data['district']
                userObj.constituency = request.data['constituency']
                userObj.panchayath = request.data['panchayath']
                userObj.status = 'Active'
                userObj.paymenttype = 'Online'
                userObj.receipturl = ''
                userObj.createddate = datetime.datetime.now()
                session.add(userObj)
                session.commit()
                if userObj.id >0:
                    
                    PackagesDtl= PaymentDtl()
                    PackagesDtl.paymentid = ''
                    PackagesDtl.orderid = request.data['orderid']
                    PackagesDtl.signature = ''
                    PackagesDtl.packageid = ''
                    PackagesDtl.amount = request.data['amount']
                    PackagesDtl.uid = userObj.id
                    PackagesDtl.profileid = idNo
                    PackagesDtl.status = 'Recieved'
                    PackagesDtl.type = 'Registration'
                    PackagesDtl.paymenttype = 'Online'
                    PackagesDtl.dateofpurchase = get_current_date()
                    PackagesDtl.duration = '365'
                    PackagesDtl.createddate = datetime.datetime.now()
                    session.add(PackagesDtl)
                    session.commit()
                    session.refresh(PackagesDtl)
                    
                    loginObj = loginTbl()
                    loginObj.login_id = idNo
                    loginObj.userid = userObj.id
                    loginObj.username = request.data['email']
                    loginObj.password = make_password(request.data['password'])
                    loginObj.type = 'User'
                    loginObj.status = 'Inactive'
                    loginObj.email = request.data['email']
                    loginObj.createddate = datetime.datetime.now()
                    loginObj.purchasedate = get_current_date()
                    loginObj.accountstatus = 'Active'
                    loginObj.duration = '365'
                    session.add(loginObj)
                    session.commit()
                    session.refresh(loginObj)
                if loginObj.id>0:
                    Params = {
			                "email":request.data['email'],
                            "name":name,
		                }
                        # send welcome mail
                    welcome = welcomeMail(Params)
                    session.close()
                    return Response({'response':'Success','message':'Account created successfully'})
                else :
                    return Response({'response':'Error','message':"Can't register now...! please try again later"})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't register now...! please try again later"})
        else :
            session.close()
            return Response({'response':'Error','message':"An account with this email already exist"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})


@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def user_OfflineRegistration(request):
    session = dbsession.Session()
    try :
        receipturl =''
        district = request.data['district']
        email = request.data['email']
        name = request.data['fname']+' '+request.data['lname']
        emailExist = checkEmailExist(email)
        print(district)
        idNo = generateIdNo(district)
        print(idNo)
        if emailExist == 0:
            if idNo !=1:
                userObj = UserRegistrationTbl()
                userObj.fname = request.data['fname']
                userObj.lname = request.data['lname']
                userObj.idno = idNo
                userObj.useraddress = request.data['useraddress']
                userObj.shopaddress = request.data['shopaddress']
                userObj.contactno = request.data['contactno']
                userObj.whatsappno = request.data['whatsappno']
                userObj.shoptype = request.data['shoptype']
                userObj.bloodgroup = request.data['bloodgroup']
                userObj.email = request.data['email']
                userObj.gender = request.data['gender']
                if request.data.getlist('userimage')!=['undefined']:
                    for f in request.data.getlist('userimage'):
                        fs = FileSystemStorage()
                        filename = fs.save(f.name,f)
                        uploaded_file_url = fs.url(filename)
                        userObj.userimageurl = uploaded_file_url
                
                if request.data.getlist('shopimage')!=['undefined']:
                    for f in request.data.getlist('shopimage'):
                        fs = FileSystemStorage()
                        filename = fs.save(f.name,f)
                        uploaded_file_url = fs.url(filename)
                        userObj.shopimageurl = uploaded_file_url
                if request.data.getlist('receiptimage')!=['undefined']:
                        for f in request.data.getlist('receiptimage'):
                            fs = FileSystemStorage()
                            filename = fs.save(f.name,f)
                            uploaded_file_url = fs.url(filename)
                            receipturl = uploaded_file_url
                userObj.receipturl = receipturl
                userObj.district = request.data['district']
                userObj.constituency = request.data['constituency']
                userObj.panchayath = request.data['panchayath']
                userObj.status = 'Active'
                userObj.paymenttype = 'Offline'
                userObj.createddate = datetime.datetime.now()
                session.add(userObj)
                session.commit()
                if userObj.id >0:
                    
                    PackagesDtl= PaymentDtl()
                    PackagesDtl.paymentid = ''
                    PackagesDtl.orderid = request.data['orderid']
                    PackagesDtl.signature = ''
                    PackagesDtl.packageid = ''
                    PackagesDtl.amount = request.data['amount']
                    PackagesDtl.uid = userObj.id
                    PackagesDtl.profileid = idNo
                    PackagesDtl.status = 'Recieved'
                    PackagesDtl.type = 'Registration'
                    PackagesDtl.paymenttype = 'Offline'
                    
                    
                    PackagesDtl.receipturl = receipturl
                    PackagesDtl.receiptno = request.data['receiptno']
                    PackagesDtl.receiptdate = request.data['receiptdate']
                    
                    PackagesDtl.dateofpurchase = request.data['receiptdate']
                    PackagesDtl.duration = '365'
                    PackagesDtl.createddate = datetime.datetime.now()
                    session.add(PackagesDtl)
                    session.commit()
                    session.refresh(PackagesDtl)
                    
                    loginObj = loginTbl()
                    loginObj.login_id = idNo
                    loginObj.userid = userObj.id
                    loginObj.username = request.data['email']
                    loginObj.password = make_password(request.data['password'])
                    loginObj.type = 'User'
                    loginObj.status = 'Inactive'
                    loginObj.email = request.data['email']
                    loginObj.createddate = datetime.datetime.now()
                    loginObj.purchasedate = get_current_date()
                    loginObj.accountstatus = 'Active'
                    loginObj.duration = '365'
                    session.add(loginObj)
                    session.commit()
                    session.refresh(loginObj)
                if loginObj.id>0:
                    Params = {
			                "email":request.data['email'],
                            "name":name,
		                }
                        # send welcome mail
                    welcome = welcomeMail(Params)
                    session.close()
                    return Response({'response':'Success','message':'Account created successfully'})
                else :
                    return Response({'response':'Error','message':"Can't register now...! please try again later"})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't register now...! please try again later"})
        else :
            session.close()
            return Response({'response':'Error','message':"An account with this email already exist"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})


# @api_view(['GET','POST'])
# @permission_classes([AllowAny, ])
# def userAuthenticate(request):
#     try :
#         print('inside login')
#         session = dbsession.Session()
#         user_name = request.data['username']
#         password = request.data['password']
#         c_date = get_current_date()
#         loginArr = []
#         user = session.query(loginTbl).filter(loginTbl.username == user_name).one()
#         if user.id>0:
#             user_name = user.email
#             print(user_name)
#             if user.check_password(password):
#                 if user.id>0 :
#                     if user.id:
#                         if user.status=='Active' and user.type=='User':
#                             logList = {
#                                 "userid":user.userid,
#                                 "idno" : user.login_id,
#                                 "type" : user.type,
#                                 "status" : user.status,
#                             }
#                             loginArr.append(logList)
#                             sql = session.query(loginTbl).filter_by(id=user.id).update({'last_logineddate':c_date})
#                             session.commit()
#                             session.close()
#                             return Response({'response':'Success','logindetails':loginArr})
#                         elif user.status=='Active' and user.type=='Admin':
#                             logList = {
#                                 "userid":user.userid,
#                                 "idno" : user.login_id,
#                                 "type" : user.type,
#                                 "status" : user.status,
#                             }
#                             loginArr.append(logList)
#                             sql = session.query(loginTbl).filter_by(id=user.id).update({'last_logineddate':c_date})
#                             session.commit()
#                             session.close()
#                             return Response({'response':'Success','logindetails':loginArr})
#                         else :
#                             return Response({'response':'Error','message':'User account is not active please contact admin'})
#                     else :
#                         return Response({'response':'Error','message':'Invalid username or password'})
#                 else:
#                     return Response({'response':'Error','message':'Invalid username or password'})
#             else :
#                 return Response({'response':'Error','message':'Invalid username or password'})
#         else :
#             return Response({'response':'Error','message':'Invalid username or password'})

#     except SQLAlchemyError as e:
#         print(e)
#         session.rollback()
#         session.close()
#         return Response({'response':'Error','message':"Something went wrong...! please try again later"})

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def adminAuthentication(request):
    session = dbsession.Session()
    try :
        username = request.data['username']
        password = request.data['password']
       
        current_date = datetime.datetime.now().replace(microsecond=0)
        session.flush()
        user = authenticate(user_name=username, password=password)
        if user :
            if user.id:
                if user.status=='Active' and user.type=='User':
                    if user.purchasedate :
                        print(user.purchasedate)
                        date1 = datetime.datetime.strptime(user.purchasedate, "%d-%m-%Y")
                        date2 = datetime.datetime.strptime(datetime.datetime.now().strftime('%d-%m-%Y'), "%d-%m-%Y")

                        days_difference = (date2 - date1).days
                        # durationDiff = int(durations)-int(days_difference)
                        print(days_difference)

                        if days_difference>365:
                            print('hiiii')
                            try :
                                DateEncoder = JSONDateEncoder()
                                payload = {
                                'user_id': user.userid,
                                'expiry' : DateEncoder.default(datetime.date.today() + datetime.timedelta(days=30))
                                }
                                
                                token = jwt.encode(payload, env('SECRET_KEY'))
                                session.query(loginTbl).filter(loginTbl.userid==user.userid).update({'last_logineddate':current_date})
                                session.query(AuthToken).filter_by(user_id=user.userid).delete()
                                auth_token = AuthToken()
                                auth_token.key = token
                                auth_token.created = datetime.datetime.now()
                                auth_token.user_id = user.userid
                                session.add(auth_token)
                                session.commit()
                                
                                admin_details = {}
                                admin_details['token'] = ''  #token
                                admin_details['username']  = user.username
                                admin_details['userid'] = payload['user_id']
                                admin_details['login_id'] = user.login_id
                                admin_details['type'] = user.type
                                admin_details['status'] = user.status
                                admin_details['token_expiry'] = '' #payload['expiry']
                                admin_details['expiry_time'] = datetime.datetime.now()+datetime.timedelta(minutes = 43200)
                                session.close()
                                return Response({'response':'Success','logindetails':admin_details,'Expired':'True'})
                            except Exception as e:
                                print(e)
                                session.rollback()
                                session.close()
                                return Response ({'response':'Error','message':'Cant login now. Please try again later...!'})
                        else :                        
                            print('inside active')
                            # if user.last_logineddate != current_date:
                            #     print(days_difference)
                            #     duration = int(user.duration)-int(days_difference)
                            #     print(duration)
                            #     session.query(loginTbl).filter_by(userid=user.userid).update({'duration':duration})
                            #     session.commit()
                            try :
                                DateEncoder = JSONDateEncoder()
                                payload = {
                                'user_id': user.userid,
                                'expiry' : DateEncoder.default(datetime.date.today() + datetime.timedelta(days=30))
                                }
                                
                                token = jwt.encode(payload, env('SECRET_KEY'))
                                session.query(loginTbl).filter(loginTbl.userid==user.userid).update({'last_logineddate':current_date})
                                session.query(AuthToken).filter_by(user_id=user.userid).delete()
                                auth_token = AuthToken()
                                auth_token.key = token
                                auth_token.created = datetime.datetime.now()
                                auth_token.user_id = user.userid
                                session.add(auth_token)
                                session.commit()
                                
                                admin_details = {}
                                admin_details['token'] = token
                                admin_details['username']  = user.username
                                admin_details['userid'] = payload['user_id']
                                admin_details['login_id'] = user.login_id
                                admin_details['type'] = user.type
                                admin_details['status'] = user.status
                                admin_details['token_expiry'] = payload['expiry']
                                admin_details['expiry_time'] = datetime.datetime.now()+datetime.timedelta(minutes = 43200)
                                session.close()
                                return Response({'response':'Success','logindetails':admin_details,'Expired':'False'})
                            except Exception as e:
                                print(e)
                                session.rollback()
                                session.close()
                                return Response ({'response':'Error','message':'Cant login now. Please try again later...!'})
                    else :
                        try :
                            DateEncoder = JSONDateEncoder()
                            payload = {
                            'user_id': user.userid,
                            'expiry' : DateEncoder.default(datetime.date.today() + datetime.timedelta(days=30))
                            }
                            
                            token = jwt.encode(payload, env('SECRET_KEY'))
                            session.query(loginTbl).filter(loginTbl.userid==user.userid).update({'last_logineddate':current_date})
                            session.query(AuthToken).filter_by(user_id=user.userid).delete()
                            auth_token = AuthToken()
                            auth_token.key = token
                            auth_token.created = datetime.datetime.now()
                            auth_token.user_id = user.userid
                            session.add(auth_token)
                            session.commit()
                            
                            admin_details = {}
                            admin_details['token'] = token
                            admin_details['username']  = user.username
                            admin_details['userid'] = payload['user_id']
                            admin_details['login_id'] = user.login_id
                            admin_details['type'] = user.type
                            admin_details['status'] = user.status
                            admin_details['token_expiry'] = payload['expiry']
                            admin_details['expiry_time'] = datetime.datetime.now()+datetime.timedelta(minutes = 43200)
                            session.close()
                            return Response({'response':'Success','logindetails':admin_details,'Expired':'False'})
                        except Exception as e:
                            print(e)
                            session.rollback()
                            session.close()
                            return Response ({'response':'Error','message':'Cant login now. Please try again later...!'})
                        
                        
                elif user.status=='Active' and user.type=='Admin':
                        print('inside active')
                        try :
                            DateEncoder = JSONDateEncoder()
                            payload = {
                            'user_id': user.userid,
                            'expiry' : DateEncoder.default(datetime.date.today() + datetime.timedelta(days=30))
                            }
                            
                            token = jwt.encode(payload, env('SECRET_KEY'))
                            session.query(loginTbl).filter(loginTbl.userid==user.userid).update({'last_logineddate':current_date})
                            session.query(AuthToken).filter_by(user_id=user.userid).delete()
                            auth_token = AuthToken()
                            auth_token.key = token
                            auth_token.created = datetime.datetime.now()
                            auth_token.user_id = user.userid
                            session.add(auth_token)
                            session.commit()
                            
                            admin_details = {}
                            admin_details['token'] = token
                            admin_details['username']  = user.username
                            admin_details['userid'] = payload['user_id']
                            admin_details['type'] = user.type
                            admin_details['status'] = user.status
                            admin_details['token_expiry'] = payload['expiry']
                            admin_details['expiry_time'] = datetime.datetime.now()+datetime.timedelta(minutes = 43200)
                            session.close()
                            return Response({'response':'Success','logindetails':admin_details})
                        except Exception as e:
                            print(e)
                            session.rollback()
                            session.close()
                            return Response ({'response':'Error','message':'Cant login now. Please try again later...!'})         
                else :
                    session.close()
                    return Response({'response':'Error','message':'User account is not active please contact admin'})
        else :
            return Response({'status': 'Error','message':'Please check your credentails'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
        session.close()


class get_UserList(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            sql ='select idpwoalogin.userid,idpwoalogin.status as loginstatus,idpwoauserregistartion.* from idpwoalogin inner join idpwoauserregistartion on idpwoauserregistartion.id = idpwoalogin.userid  where idpwoalogin.status="Active" order by id desc'
            userObj = session.execute(text(sql)).fetchall()
            userObjs = [dict(row) for row in userObj]
            if len(userObjs)>0 :
                session.close()
                return Response({'response':'Success','userlist':userObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


class getUserByStatus(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            print('inside login')
            status = request.data['status']
            #sql = 'select * from idpwoauserregistartion order by id desc'
            sql ='select idpwoalogin.userid,idpwoalogin.status as loginstatus,idpwoauserregistartion.* from idpwoalogin inner join idpwoauserregistartion on idpwoauserregistartion.id = idpwoalogin.userid  where idpwoalogin.status="'+status+'" order by id desc'
            userObj = session.execute(text(sql)).fetchall()
            userObjs = [dict(row) for row in userObj]
            if len(userObjs)>0 :
                session.close()
                return Response({'response':'Success','userlist':userObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


class getUser_ByID(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            print('inside login')
            id = request.data['id']
            days_difference = ''
            status = ''
            sql = 'select * from idpwoauserregistartion where id ="'+id+'"'
            userObj = session.execute(text(sql)).fetchall()
            userObjs = [dict(row._mapping) for row in userObj] 
            paymentObj = session.query(PaymentDtl).filter(PaymentDtl.uid == id).order_by(PaymentDtl.createddate.desc()).first()

            #paymentObj = session.query(PaymentDtl).filter(PaymentDtl.uid == id).one_or_none()
            if paymentObj :
                print(paymentObj.dateofpurchase)
                dateofpurchase = paymentObj.dateofpurchase
                currentdate = get_current_date()
                date1 = datetime.datetime.strptime(dateofpurchase, "%d-%m-%Y") 
                date2 = datetime.datetime.strptime(datetime.datetime.now().strftime('%d-%m-%Y'), "%d-%m-%Y")

                days_difference = (date2 - date1).days
                # durationDiff = int(durations)-int(days_difference)
                print(days_difference)
                if days_difference > 365 :
                    status = 'Inactive'
                elif days_difference<= 365:
                    status = 'Active'
                for user in userObjs:
                    user["dateofpurchase"] = dateofpurchase
                    user["paymentdate"] = paymentObj.createddate
                    user["paymentid"] = paymentObj.id 
                    user['amount'] = paymentObj.amount 
                    
            if len(userObjs)>0 :
                session.close()
                return Response({'response':'Success','userlist':userObjs,'days':days_difference,'status':status})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


class editUserProfile(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['userid']
            idno = request.data['idno']
            userObj = session.query(UserRegistrationTbl).filter_by(id=id, idno=idno).one()
            userObj.fname = request.data['fname']
            userObj.lname = request.data['lname']
            userObj.useraddress = request.data['useraddress']
            userObj.shopaddress = request.data['shopaddress']
            userObj.contactno = request.data['contactno']
            userObj.whatsappno = request.data['whatsappno']
            userObj.shoptype = request.data['shoptype']
            userObj.bloodgroup = request.data['bloodgroup']
            userObj.gender = request.data['gender']
            if request.data.getlist('userimage')!=['undefined']:
                for f in request.data.getlist('userimage'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    userObj.userimageurl = uploaded_file_url
            
            if request.data.getlist('shopimage')!=['undefined']:
                for f in request.data.getlist('shopimage'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    userObj.shopimageurl = uploaded_file_url
            userObj.district = request.data['district']
            userObj.constituency = request.data['constituency']
            userObj.panchayath = request.data['panchayath']
            userObj.status = 'Active'
            userObj.createddate = datetime.datetime.now()
            session.add(userObj)
            session.commit()
            if userObj.id >0:
                session.close()
                return Response({'response':'Success','message':'Updated successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't update value"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


class get_UserByDistrict(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            print('inside login')
            did = request.data['district']
            #sql = 'select * from idpwoauserregistartion order by id desc'
            sql ='select idpwoalogin.userid,idpwoalogin.status as loginstatus,idpwoauserregistartion.* from idpwoalogin inner join idpwoauserregistartion on idpwoauserregistartion.id = idpwoalogin.userid  where idpwoauserregistartion.district="'+did+'" order by id desc'
            userObj = session.execute(text(sql)).fetchall()
            userObjs = [dict(row) for row in userObj]
            if len(userObjs)>0 :
                session.close()
                return Response({'response':'Success','userlist':userObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()



# Approve user

class getUser_Request(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            sql = 'select idpwoalogin.userid,idpwoalogin.status as loginstatus,idpwoauserregistartion.* from idpwoalogin inner join idpwoauserregistartion on idpwoauserregistartion.id = idpwoalogin.userid  where idpwoalogin.status="Inactive" order by id desc'
            userObj = session.execute(text(sql)).fetchall()
            userObjs = [dict(row) for row in userObj]
            if len(userObjs)>0 :
                session.close()
                return Response({'response':'Success','userlist':userObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


class approveUser(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            userid = request.data['userid']
            status = request.data['status']
            user = session.query(loginTbl).filter_by(userid=userid).first()
            if user:
                user.status = status
                session.commit()
                return Response({'response': 'Success', 'message': 'Updated successfully'})
            else :
                return Response({'response':'Warning','message':'Cant update value try again later'})  
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class activeOrInactiveUsers(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            status = request.data['status']
            session.query(loginTbl).filter(loginTbl.type != "Admin").update({"status": status})
            session.commit()
            return Response({'response': 'Success', 'message': 'Updated successfully'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()



# Registartion OTP
@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def sendUserOtp(request):
    session = dbsession.Session()
    try :
        email = request.data['email']
        name = request.data['name']
        phone = request.data['phone']
        emailExist = checkEmailExist(email)
        if emailExist == 1:
            session.close()
            return Response({'response':'Error','message':'An account with this email already exist'})
        else :
            # Setting email limit
            current_limit = sys.getrecursionlimit()
            sys.setrecursionlimit(new_limit)
            
            Otp = generateRandomOTP()
            otp_cre_time = datetime.datetime.now().replace(microsecond=0)
            otp_expire_time = otp_cre_time+datetime.timedelta(minutes = 5)
            Otp = generateRandomOTP()
            params = {"otp_val": Otp , "otp_created_time" : otp_cre_time, "otp_exp_time": otp_expire_time}
            otpParams = {
                "otp_val": Otp , 
                "otp_cre_time" : otp_cre_time, 
                "otp_expire_time": otp_expire_time,
                "email":request.data['email'],
                "name":name,
            }
            if Otp :
                result = sendOTP(otpParams)
                if result == True:
                    otpDtl = Otpdtl()
                    otpDtl.email = request.data['email']
                    otpDtl.otp = Otp
                    today = date.today()
                    otpDtl.createddate = datetime.datetime.now()
                    otpDtl.createdtime = current_time
                    key = generate_key_from_name(name)
                    otpDtl.key = key
                    otpDtl.type = 'Registration'
                    otpDtl.name = name
                    otpDtl.phone = phone
                    otpDtl.status = 'Pending'
                    session.add(otpDtl)
                    session.commit()
                    session.close()
                    return Response({'response':'Success','key':key})
                else :
                    session.close()
                    return Response({'response':'Error','message':'Cant send otp to the email you provided...!please check you email id'}) 
            else :
                session.close()
                return Response({'response':'Error','message':'Cant send otp now..! please try again later'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print('inside try')
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def verifyUserOtp(request):
    session = dbsession.Session()
    try :
        otp = request.data['otp']
        key = request.data['key']
        email = request.data['email']
        otpVal = session.query(Otpdtl).filter_by(email=email,key=key).one()
        # print(otpVal)
        # if otpVal.createdtime :
        #      print(otpVal.createdtime)
        #      print(current_time)
        if otpVal.status == 'Pending':
            expiration_time = timezone.timedelta(minutes=15)
            created_at = timezone.make_aware(otpVal.createddate)
            current_time = timezone.now()
            
            if current_time - created_at > expiration_time:
                session.close()
                return Response({'response' :'Error',"message": "OTP expired"}, status=400)
            else:
                if otpVal.otp == otp :
                    sql = session.query(Otpdtl).filter_by(key=key).update({'status':'Verified'})
                    session.commit()
                    session.close()
                    return Response({'response':'Success','message':'OTP Verified'})
                else :
                    session.close()
                    return Response({'response':'Error','message':'Incorrect OTP'})
        else :
            session.close()
            return Response({'response':'Warning','message':'Account already verified'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()

# Forgot password

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def fogetPasswordOtp(request):
    session = dbsession.Session()
    try :
        email = request.data['email']
        emailExist = checkEmailExist(email)
        if emailExist == 0:
                return Response({'response':'Error','message':'Account with this email not exist'})
        elif emailExist ==1:
            Otp = generateRandomOTP()
            otp_cre_time = datetime.datetime.now().replace(microsecond=0)
            otp_expire_time = otp_cre_time+datetime.timedelta(minutes = 5)
            Otp = generateRandomOTP()
            otpParams = {
			    "otp_val": Otp , 
			    "otp_cre_time" : otp_cre_time, 
			    "otp_expire_time": otp_expire_time,
                "email":request.data['email'],
		    }
        else :
            print('')
        if Otp :
            result = forgotSendOTP(otpParams)
            if result == True:
                loginDtl = session.query(loginTbl).filter_by(email = email).one()
                keyId = loginDtl.login_id
                otpDtl = Otpdtl()
                otpDtl.email = request.data['email']
                otpDtl.otp = Otp
                otpDtl.type = "Forgot password"
                otpDtl.status = "Pending"
                today = date.today()
                otpDtl.createddate = datetime.datetime.now()
                otpDtl.createdtime = get_current_time()
                key = generate_key_from_name('name')
                otpDtl.key = key
                session.add(otpDtl)
                session.commit()
                session.close()
                return Response({'response':'Success','key':key,'keyid':keyId})
            else :
                session.close()
                return Response({'response':'Error','message':'Cant Send OTP to your given email'}) 
        else :
            session.close()
            return Response({'response':'Error','message':'Something went wrong please try again after sometime'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def foget_PasswordChange(request):
    session = dbsession.Session()
    try :
        email = request.data['email']
        password = request.data['password']
        keyId = request.data['keyid']
        loginDtl = session.query(loginTbl).filter_by(email = email,login_id=keyId).one()
        loginDtl.password =  make_password(request.data['password'])
        session.add(loginDtl)
        session.commit()
        session.refresh(loginDtl)
        if loginDtl.id>0:
            session.close()
            return Response ({'response':'Success','message':'Password changed successfully'})
        else :
            session.close()
            return Response ({'response':'Error','message':"Can't change password"})

    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()

# Change password

class changePassword(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            oldPassword = request.data['oldpassword']
            newPassword = request.data['newpassword']
            userid = request.data['userid']
            idno = request.data['idno']

            user = session.query(loginTbl).filter(loginTbl.userid == userid).one()
            if user :
                if user.check_password(oldPassword):
                    password = make_password(newPassword)
                    sql = session.query(loginTbl).filter_by(userid=userid,login_id=idno).update({'password':password})
                    session.commit()
                    if sql>0:
                        session.close()
                        return Response({'response':'Success','message':'Password changed successfully'})
                    else :
                        session.close()
                        return Response({'response':'Error','message':"can't change password"})
                else :
                    session.close()
                    return Response({'response':'Error','message':'Old password is incorrect'})
            else :
                session.close()
                return Response({'response':'Success','message':"can't change password"})

        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()



# usefull links

class addUsefullLinks(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :

            linksObj = usefullLinksTbl()
            if request.data.getlist('image')!=['undefined']:
                for f in request.data.getlist('image'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    linksObj.imageurl = uploaded_file_url
            linksObj.description = request.data['description']
            linksObj.link = request.data['link']
            linksObj.status = 'Active'
            linksObj.createddate = datetime.datetime.now()
            session.add(linksObj)
            session.commit()
            session.refresh(linksObj)
            if linksObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Added successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't add now please tryagain later"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class getuseFullLinks(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            sql = 'select * from idpwoausefulllinks order by id desc'
            userObj = session.execute(text(sql)).fetchall()
            userObjs = [dict(row) for row in userObj]
            if len(userObjs)>0 :
                session.close()
                return Response({'response':'Success','usefulllinklist':userObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class get_useFullLinksById(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            session = dbsession.Session()
            id = request.data['id']
            sql = 'select * from idpwoausefulllinks where id = "'+id+'"'
            userObj = session.execute(text(sql)).fetchall()
            userObjs = [dict(row) for row in userObj]
            if len(userObjs)>0 :
                session.close()
                return Response({'response':'Success','usefulllinklist':userObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class editUsefullLinks(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['id']
            # if request.data.getlist('image')!=['undefined']:
            linksObj = session.query(usefullLinksTbl).filter_by(id=id).one()
            if request.data.getlist('image')!=['undefined']:
                for f in request.data.getlist('image'):
                # fs = FileSystemStorage(location=categoryFolder)
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    #categorydtl.iconurl = categoryFolder+filename
                    linksObj.imageurl = uploaded_file_url
            linksObj.description = request.data['description']
            linksObj.link = request.data['link']
            session.commit()
            session.refresh(linksObj)
        
            if linksObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Updated successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't update value"})
            # else :
            #     session.close()
            #     return Response({'response':'Error','message':"Can't update value"})

        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class deleteUsefullLinks(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['id']
            sql = session.query(usefullLinksTbl).filter_by(id=id).delete()
            session.commit()
            if sql>0 :
                session.close()
                return Response({'response':'Success','message':'Deleted successfully '})
            else :
                session.close()
                return Response({'response':'Error','message':"can't delete now"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

# Banner

class addbanner(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            bannerObj = bannerTbl()
            if request.data.getlist('image')!=['undefined']:
                for f in request.data.getlist('image'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    bannerObj.imageurl = uploaded_file_url
            bannerObj.linkurl = request.data['linkurl']
            bannerObj.status = 'Active'
            bannerObj.createddate = datetime.datetime.now()
            session.add(bannerObj)
            session.commit()
            session.refresh(bannerObj)
            if bannerObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Added successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't add now please tryagain later"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class getBannerList(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            sql = 'select * from idpwoabanner order by id desc'
            bannerObj = session.execute(text(sql)).fetchall()
            bannerObjs = [dict(row) for row in bannerObj]
            if len(bannerObjs)>0 :
                session.close()
                return Response({'response':'Success','bannerlist':bannerObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getUserBannerList(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoabanner where status ="Active" order by id desc'
        bannerObj = session.execute(text(sql)).fetchall()
        bannerObjs = [dict(row) for row in bannerObj]
        
        # Add count
        countObj = session.query(VisitorsDtl).first()
        if countObj:
            print('dhadj'+ countObj.count)
            countObj.count = int(countObj.count)+ 1
            session.add(countObj)
            session.commit()
        else :
            vistObj = VisitorsDtl()
            vistObj.count = "1"
            vistObj.createddate = datetime.datetime.now()
            session.add(vistObj)
            session.commit()
        if len(bannerObjs)>0 :
             session.close()
             return Response({'response':'Success','bannerlist':bannerObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

class deleteBanner(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['id']
            sql = session.query(bannerTbl).filter_by(id=id).delete()
            session.commit()
            if sql>0 :
                session.close()
                return Response({'response':'Success','message':'Deleted successfully '})
            else :
                session.close()
                return Response({'response':'Error','message':"can't delete now"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class updateBannerStatus(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['id']
            status = request.data['status']
            banner = session.query(bannerTbl).filter_by(id=id).first()
            if banner:
                banner.status = status
                session.commit()
                return Response({'response': 'Success', 'message': 'Updated successfully'})
            else :
                return Response({'response':'Warning','message':'Cant update value try again later'})  
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


# Marque

class addMarque(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            session = dbsession.Session()
            marqueObj = marqueTbl()
            marqueObj.marque = request.data['marque']
            marqueObj.status = 'Active'
            marqueObj.type = request.data['type']
            marqueObj.createddate = datetime.datetime.now()
            session.add(marqueObj)
            session.commit()
            session.refresh(marqueObj)
            if marqueObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Added successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't add now please tryagain later"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getMarqueList(request):
    try :
        session = dbsession.Session()
        type = request.data['type']
        if type == 'All':
            sql = 'select * from idpwoamarque order by id desc'
            marqueObj = session.execute(text(sql)).fetchall()
            marqueObjs = [dict(row) for row in marqueObj]
        else :
            sql = 'select * from idpwoamarque where type="'+type+'" order by id desc'
            marqueObj = session.execute(text(sql)).fetchall()
            marqueObjs = [dict(row) for row in marqueObj]
        if len(marqueObjs)>0 :
             session.close()
             return Response({'response':'Success','marquelist':marqueObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

class get_MarqueById(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['id']
            sql = 'select * from idpwoamarque where id = "'+id+'"'
            marqueObj = session.execute(text(sql)).fetchall()
            marqueObjs = [dict(row) for row in marqueObj]
            if len(marqueObjs)>0 :
                session.close()
                return Response({'response':'Success','marque':marqueObj})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class editMarque(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['id']
            marqueObj = session.query(marqueTbl).filter_by(id=id).one()
            marqueObj.marque = request.data['marque']
            marqueObj.type = request.data['type']
            session.commit()
            session.refresh(marqueObj)
            if marqueObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Updated successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't update value"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class deleteMarque(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            
            id = request.data['id']
            sql = session.query(marqueTbl).filter_by(id=id).delete()
            session.commit()
            if sql>0 :
                session.close()
                return Response({'response':'Success','message':'Deleted successfully '})
            else :
                session.close()
                return Response({'response':'Error','message':"can't delete now"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


# About us

class aboutUs(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request): 
        session = dbsession.Session()
        try :
            about = session.query(aboutUsTbl).all()
            if about :
                print('inside')
                print(about[0].id)
                aboutObj = session.query(aboutUsTbl).filter_by(id=about[0].id).one()
                aboutObj.about = request.data['about']
                aboutObj.status = 'Active'
                session.commit()
                session.refresh(aboutObj)
                if aboutObj.id>0 :
                    session.close()
                    return Response({'response':'Success','message':'Updated successfully'})
                else :
                    session.close()
                    return Response({'response':'Error','message':"Can't update value"})
            else :
                aboutObj = aboutUsTbl()
                aboutObj.about = request.data['about']
                aboutObj.status = 'Active'
                aboutObj.createddate = datetime.datetime.now()
                session.add(aboutObj)
                session.commit()
                session.refresh(aboutObj)
                if aboutObj.id>0 :
                    session.close()
                    return Response({'response':'Success','message':'Updated successfully'})
                else :
                    session.close()
                    return Response({'response':'Error','message':"Can't update value"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getAboutUs(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoaaboutus order by id desc'
        aboutObj = session.execute(text(sql)).fetchall()
        aboutObjs = [dict(row) for row in aboutObj]
        if len(aboutObjs)>0 :
             session.close()
             return Response({'response':'Success','aboutus':aboutObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

class deleteAboutUs(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['id']
            sql = session.query(aboutUsTbl).filter_by(id=id).delete()
            session.commit()
            if sql>0 :
                session.close()
                return Response({'response':'Success','message':'Deleted successfully '})
            else :
                session.close()
                return Response({'response':'Error','message':"can't delete now"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

# Contact form

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def addContactForm(request):
    try :
        session = dbsession.Session()
        contactObj = contactFormTbl()
        contactObj.fname = request.data['fname']
        contactObj.lname = request.data['lname']
        contactObj.district = request.data['district']
        contactObj.subject = request.data['subject']
        contactObj.status = 'Pending'
        contactObj.createddate = datetime.datetime.now()
        session.add(contactObj)
        session.commit()
        session.refresh(contactObj)
        if contactObj.id>0 :
             session.close()
             return Response({'response':'Success','message':'Added successfully'})
        else :
            session.close()
            return Response({'response':'Error','message':"Can't add now please tryagain later"})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

class getContactForm(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            
            sql = 'select * from idpwoacontactform order by id desc'
            contactObj = session.execute(text(sql)).fetchall()
            contactObjs = [dict(row) for row in contactObj]
            if len(contactObjs)>0 :
                session.close()
                return Response({'response':'Success','formlist':contactObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

# Gallery

class addGallery(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :

            galleryObj = galleryTbl()
            if request.data.getlist('image')!=['undefined']:
                for f in request.data.getlist('image'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    galleryObj.imageurl = uploaded_file_url
            galleryObj.status = 'Active'
            galleryObj.createddate = datetime.datetime.now()
            session.add(galleryObj)
            session.commit()
            session.refresh(galleryObj)
            if galleryObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Added successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't add now please tryagain later"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getgallery(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoagallery order by id desc'
        galleryObj = session.execute(text(sql)).fetchall()
        galleryObjs = [dict(row) for row in galleryObj]
        if len(galleryObjs)>0 :
             session.close()
             return Response({'response':'Success','gallerylist':galleryObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

class deleteGallery(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            session = dbsession.Session()
            id = request.data['id']
            sql = session.query(galleryTbl).filter_by(id=id).delete()
            session.commit()
            if sql>0 :
                session.close()
                return Response({'response':'Success','message':'Deleted successfully '})
            else :
                session.close()
                return Response({'response':'Error','message':"can't delete now"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


# Rate chart

class addRateChart(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            chartObj = rateChartTbl()
            if request.data.getlist('file')!=['undefined']:
                for f in request.data.getlist('file'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    chartObj.file = uploaded_file_url
            chartObj.district = request.data['district']
            chartObj.description = request.data['description']
            chartObj.status = 'Active'
            chartObj.createddate = datetime.datetime.now()
            session.add(chartObj)
            session.commit()
            session.refresh(chartObj)
            if chartObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Added successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't add now please tryagain later"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class getRateChart(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            session = dbsession.Session()
            sql = 'select * from idpwoaratechart order by id desc'
            chartObj = session.execute(text(sql)).fetchall()
            chartObjs = [dict(row) for row in chartObj]
            if len(chartObjs)>0 :
                session.close()
                return Response({'response':'Success','ratechartlist':chartObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class deleteRateChart(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            session = dbsession.Session()
            id = request.data['id']
            sql = session.query(rateChartTbl).filter_by(id=id).delete()
            session.commit()
            if sql>0 :
                session.close()
                return Response({'response':'Success','message':'Deleted successfully '})
            else :
                session.close()
                return Response({'response':'Error','message':"can't delete now"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

# upcomming events

class addEvents(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            
            eventObj = upcommingEvents()
            if request.data.getlist('image')!=['undefined']:
                for f in request.data.getlist('image'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    eventObj.imageurl = uploaded_file_url
            eventObj.eventname = request.data['eventname']
            eventObj.status = 'Active'
            eventObj.createddate = datetime.datetime.now()
            session.add(eventObj)
            session.commit()
            session.refresh(eventObj)
            if eventObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Added successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't add now please tryagain later"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def getEvents(request):
    try :
        session = dbsession.Session()
        sql = 'select * from idpwoaupcommingevents order by id desc'
        chartObj = session.execute(text(sql)).fetchall()
        chartObjs = [dict(row) for row in chartObj]
        if len(chartObjs)>0 :
             session.close()
             return Response({'response':'Success','ratechartlist':chartObjs})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

class deleteEvents(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            session = dbsession.Session()
            id = request.data['id']
            sql = session.query(upcommingEvents).filter_by(id=id).delete()
            session.commit()
            if sql>0 :
                session.close()
                return Response({'response':'Success','message':'Deleted successfully '})
            else :
                session.close()
                return Response({'response':'Error','message':"can't delete now"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


# Dashboard


class getDashboardCounts(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            sql = 'select count(id) from idpwoauserregistartion where status ="Active"'
            membersObj = session.execute(text(sql)).fetchall()
            membersObjs = membersObj[0][0]
            
            sql1 = 'select idpwoalogin.userid,idpwoalogin.status as loginstatus,idpwoauserregistartion.id,idpwoauserregistartion.fname,idpwoauserregistartion.lname from idpwoalogin inner join idpwoauserregistartion on idpwoauserregistartion.id = idpwoalogin.userid  where idpwoalogin.status="Inactive" order by id desc limit 5'
            requestObj = session.execute(text(sql1)).fetchall()
            requestObjs = [dict(row) for row in requestObj]
            
            sql1 = 'select * from idpwoaupcommingevents order by id desc limit 5'
            eventsObj = session.execute(text(sql1)).fetchall()
            eventsObjs = [dict(row) for row in eventsObj]
            
            if len(membersObj)>0 :
                session.close()
                return Response({'response':'Success','membesrscount':membersObjs,'openingbalance':0,'income':0,'expense':0,'userrequests':requestObjs,'events':eventsObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


# Accounts

class addAccounts(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    from datetime import datetime
    def post(self, request):
        session = dbsession.Session()
        try :
            date = request.data['collecteddate']
            date_object = datetime.datetime.strptime(date, "%d-%m-%Y")
            accountObj = accountsTbl()
            accountObj.amountrecieved = request.data['amountrecieved']
            accountObj.paidby = request.data['paidby']
            accountObj.description = request.data['description']
            accountObj.paymenttype = request.data['paymenttype']
            accountObj.collecteddate = request.data['collecteddate']
            accountObj.month = str(date_object.month)+'-'+str(date_object.year)
            accountObj.collectedby = request.data['collectedby']
            accountObj.position = request.data['position']
            if request.data.getlist('image')!=['undefined']:
                for f in request.data.getlist('image'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    accountObj.fileurl = uploaded_file_url 
            accountObj.type = request.data['type']
            accountObj.status = 'Active'
            accountObj.createddate = datetime.datetime.now()
            session.add(accountObj)
            session.commit()
            session.refresh(accountObj)
            if accountObj.id>0:
                session.close()
                return Response({'response':'Success','message': 'Added successfully..!'})
            else :
                session.close()
                return Response({'response':'Error','message': "can't add value now.! try again later"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


# Website counts
from django.db.models import Sum
# @api_view(['GET','POST'])
# @permission_classes([AllowAny, ])
# def getCounts(request):
#     session = dbsession.Session()
#     try :
        
#         vistorsCount = visitorstbl.objects.aggregate(vistorsCount=Sum('count'))['vistorsCount']
#         total_count_int = int(vistorsCount)
#         usersCount = userregistartion.objects.count()
#         eventsCount = upcommingevents.objects.count()
#         return Response({'response':'Success', 'userscount':usersCount,'vistorscount':total_count_int, 'eventscount':eventsCount})
#     except SQLAlchemyError as e:
#         print(e)
#         session.rollback()
#         session.close()
#         return Response({'response':'Error','message':"Something went wrong...! please try again later"})
        


class GetWebsiteCounts(APIView):
   
    permission_classes = (AllowAny,)

    def post(self, request):
        session = dbsession.Session()
        try:
            visitors_sql = 'SELECT SUM(count) AS vistorsCount FROM idpwoavisitorstbl'
            visitors_result = session.execute(text(visitors_sql)).fetchone()
            vistorsCount = visitors_result['vistorsCount'] if visitors_result['vistorsCount'] else 0

            users_sql = 'SELECT COUNT(*) AS usersCount FROM idpwoauserregistartion'
            users_result = session.execute(text(users_sql)).fetchone()
            usersCount = users_result['usersCount'] if users_result['usersCount'] else 0

            events_sql = 'SELECT COUNT(*) AS eventsCount FROM idpwoaupcommingevents'
            events_result = session.execute(text(events_sql)).fetchone()
            eventsCount = events_result['eventsCount'] if events_result['eventsCount'] else 0

            return Response(
                {
                    "response": "Success",
                    "userscount": usersCount,
                    "vistorscount": vistorsCount,
                    "eventscount": eventsCount
                },
                status=200
            )
        except SQLAlchemyError as e:
            print(f"SQLAlchemyError: {e}")
            session.rollback()
            return Response(
                {
                    'response': 'Error',
                    'message': 'Something went wrong. Please try again later.',
                    'error': str(e)
                },
                status=500
            )
        except Exception as e:
            print(f"Exception: {e}")
            session.rollback()
            return Response(
                {
                    'response': 'Error',
                    'message': 'Something went wrong. Please try again later.',
                    'error': str(e)
                },
                status=500
            )
        finally:
            session.close()
# Razor Pay

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def createOrder(request):
    session = dbsession.Session()
    try :
        type  = request.data['type']
        if type == 'Register':
            feeObj = session.query(RegistrationDtl).filter_by(status='Active', type='Register').first()
            #print(feeObj.id)
            
            if feeObj:
                key_id =  env('Test_Key_ID')
                key_secret = env('Test_Key_Secret')

                # Razorpay API endpoint
                url = "https://api.razorpay.com/v1/orders"

                # Request headers
                headers = {
                    "content-type": "application/json"
                }

                # Request payload
                amount =  int(feeObj.fee)*100
                payload = {
                    "amount": amount,
                    "currency": "INR",
                    "receipt": "qwsaq1",
                    "partial_payment": False,
                    
                }

                # Make the POST request
                response = requests.post(url, headers=headers, json=payload, auth=(key_id, key_secret))
                print(response.json())

                # Check if the request was successful
                if response.status_code == 200:
                    # Return the response JSON
                    # return JsonResponse(response.json())
                    session.close()
                    return Response({'response':'Success','message':'Order created successfully','orders':response.json(),'keyid':env('Test_Key_ID')})
                else:
                    # If request failed, return error message
                    # return JsonResponse({"error": "Failed to create order"}, status=500)
                    session.close()
                    return Response({'response':'Error','message':'Failed to create order..! Try again later'})
              
            else:
                session.close()
                return Response({'response':'Error','message':'Failed to create order..! Try again later'})
        if type == 'Renewel':
            feeObj = session.query(RegistrationDtl).filter_by(status='Active', type='Register').first()
            #print(feeObj.id)
            
            if feeObj:
                key_id =  env('Test_Key_ID')
                key_secret = env('Test_Key_Secret')

                # Razorpay API endpoint
                url = "https://api.razorpay.com/v1/orders"

                # Request headers
                headers = {
                    "content-type": "application/json"
                }

                # Request payload
                amount =  int(feeObj.fee)*100
                payload = {
                    "amount": amount,
                    "currency": "INR",
                    "receipt": "qwsaq1",
                    "partial_payment": False,
                    
                }

                # Make the POST request
                response = requests.post(url, headers=headers, json=payload, auth=(key_id, key_secret))
                print(response.json())

                # Check if the request was successful
                if response.status_code == 200:
                    # Return the response JSON
                    # return JsonResponse(response.json())
                    session.close()
                    return Response({'response':'Success','message':'Order created successfully','orders':response.json(),'keyid':env('Test_Key_ID')})
                else:
                    # If request failed, return error message
                    # return JsonResponse({"error": "Failed to create order"}, status=500)
                    session.close()
                    return Response({'response':'Error','message':'Failed to create order..! Try again later'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ]) 
def renewaldays(request):
    session = dbsession.Session()
    try :
        uid  = request.data['uid']
        paymentid = request.data['paymentid']
        
        purchase = session.query(PaymentDtl).filter_by(uid=uid, id=paymentid).one_or_none()
        if purchase is not None:
            createddate = purchase.createddate
        
            if isinstance(createddate, datetime.date) and not isinstance(createddate, datetime.datetime):
                createddate = datetime.datetime.combine(createddate, datetime.datetime.min.time()) 

            # Add 365 days to createddate
            future_date = createddate + timedelta(days=365)

            # Get the current date and time
            currentdate = datetime.datetime.now()  

            # Calculate the day difference
            day_difference = (future_date - currentdate).days
            return Response(
                {
                    "response": "Success",  
                    "day_difference": [day_difference],
                }
            )
        else:
            # If no payment details are found
            return Response(
                {"response": "Error", "message": "No purchase details found for the given UID and Payment ID."}) 
            
           
           
    except SQLAlchemyError as e:
        print(e)
        
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    except Exception as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
    finally:
            session.close()




# Payment history

class paymentHistory(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            session = dbsession.Session()
            
            sql = '''select payamenttbl.*,idpwoauserregistartion.fname,idpwoauserregistartion.lname,idpwoauserregistartion.district,
            idpwoauserregistartion.constituency,idpwoauserregistartion.panchayath,idpwoauserregistartion.userimageurl,
            idpwoauserregistartion.gender,idpwoauserregistartion.shoptype,idpwoauserregistartion.contactno,idpwoauserregistartion.bloodgroup,idpwoauserregistartion.status as userstatus
            from payamenttbl inner join 
            idpwoauserregistartion on idpwoauserregistartion.id = payamenttbl.uid order by id desc'''
            paymentObj = session.execute(text(sql)).fetchall()
            #paymentObjs = [dict(row) for row in paymentObj]
            paymentObjs = []
            for row in paymentObj:
                payment_dict = dict(row)  
               
                if payment_dict.get('type') == 'Renewal':
                    payment_dict['isrenewal'] = 'Yes'
                else:
                    payment_dict['isrenewal'] = 'No'
                
                # Add the processed row to the list
                paymentObjs.append(payment_dict) 
            if len(paymentObjs)>0 :
                session.close()
                return Response({'response':'Success','paymentlist':paymentObj})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class getPaymentHistoryByStatus(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            session = dbsession.Session()
            status = request.data['statusx']
            sql = 'select payamenttbl.*,idpwoauserregistartion.fname,idpwoauserregistartion.lname,idpwoauserregistartion.district,idpwoauserregistartion.constituency,idpwoauserregistartion.panchayath,idpwoauserregistartion.userimageurl,idpwoauserregistartion.gender,idpwoauserregistartion.shoptype,idpwoauserregistartion.contactno from payamenttbl inner join idpwoauserregistartion on idpwoauserregistartion.id = payamenttbl.uid order by id desc'
            paymentObj = session.execute(text(sql)).fetchall()
            paymentObjs = [dict(row) for row in paymentObj]
            if len(paymentObjs)>0 :
                session.close()
                return Response({'response':'Success','paymentlist':paymentObj})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class get_paymentHistoryFilter(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            session = dbsession.Session()
            
            district = request.data.get('district')
            renewal = request.data.get('renewal')

            conditions = []
            params = {}

            if district:
                conditions.append("idpwoauserregistartion.district = :district")
                params['district'] = district

            if renewal == "Yes":
                conditions.append("payamenttbl.type = :renewal")
                params['renewal'] = "Renewal"
            elif renewal == "No":
                conditions.append("payamenttbl.type != :renewal")
                params['renewal'] = "Renewal"

          
            query_conditions = " AND ".join(conditions)

            sql = f'''
                SELECT 
                    payamenttbl.*, 
                    idpwoauserregistartion.fname, 
                    idpwoauserregistartion.lname, 
                    idpwoauserregistartion.district, 
                    idpwoauserregistartion.constituency, 
                    idpwoauserregistartion.panchayath, 
                    idpwoauserregistartion.userimageurl, 
                    idpwoauserregistartion.gender, 
                    idpwoauserregistartion.shoptype, 
                    idpwoauserregistartion.contactno 
                FROM 
                    payamenttbl 
                INNER JOIN 
                    idpwoauserregistartion 
                ON 
                    idpwoauserregistartion.id = payamenttbl.uid 
                WHERE 
                    {query_conditions} 
                ORDER BY 
                    id DESC
            '''

            paymentObj = session.execute(text(sql), params).fetchall()
            paymentObjs = [dict(row._mapping) for row in paymentObj]

            
            if paymentObjs:
                return Response({'response': 'Success', 'paymentlist': paymentObjs})
            else:
                return Response({'response': 'Error', 'message': 'No data found'})

            
            
            # district = request.data['district']
            # renewal = request.data['renewal'] 
            # sql = '''select payamenttbl.*,idpwoauserregistartion.fname,idpwoauserregistartion.lname,idpwoauserregistartion.district,
            # idpwoauserregistartion.constituency,idpwoauserregistartion.panchayath,idpwoauserregistartion.userimageurl,
            # idpwoauserregistartion.gender,idpwoauserregistartion.shoptype,idpwoauserregistartion.contactno 
            # from payamenttbl inner join idpwoauserregistartion on idpwoauserregistartion.id = payamenttbl.uid 
            # where idpwoauserregistartion.district = "'+district+'" order by id desc'''
            # paymentObj = session.execute(text(sql)).fetchall()
            # paymentObjs = [dict(row._mapping) for row in paymentObj]
            # if len(paymentObjs)>0 :
            #     session.close()
            #     return Response({'response':'Success','paymentlist':paymentObjs})
            # else :
            #     session.close()
            #     return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()




@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def renewAccount(request):
    session = dbsession.Session()
    try :
        id = request.data['id']
        idno = request.data['idno']
                    
        PackagesDtl= PaymentDtl()
        PackagesDtl.paymentid = ''
        PackagesDtl.orderid = request.data['orderid']
        PackagesDtl.signature = ''
        PackagesDtl.packageid = ''
        PackagesDtl.amount = request.data['amount']
        PackagesDtl.uid = id
        PackagesDtl.profileid = idno
        PackagesDtl.status = 'Recieved'
        PackagesDtl.type = 'Renewal'
        PackagesDtl.paymenttype = request.data['paymenttype'] 
        PackagesDtl.dateofpurchase = get_current_date()
        PackagesDtl.duration = '365'
        PackagesDtl.createddate = datetime.datetime.now()
        session.add(PackagesDtl)
        session.commit()
        #session.refresh(PackagesDtl)       
        session.query(loginTbl).filter(loginTbl.userid==id).update({'purchasedate':get_current_date(),'accountstatus':'Active','duration':'365'})
        session.commit()
        if PackagesDtl.id>0:
            session.close()
            return Response({'response':'Success','message':'Account created successfully'})
        else :
            return Response({'response':'Error','message':"Can't register now...! please try again later"})
    except SQLAlchemyError as e:
        print(e)
        traceback.print_exc() 
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})




# Forms & Circulars

class addFormsandCirculars(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            formsObj = formsandcircularsTbl()
            if request.data.getlist('image')!=['undefined']:
                for f in request.data.getlist('image'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    formsObj.imageurl = uploaded_file_url
            formsObj.circularname = request.data['circularname']
            formsObj.status = 'Active'
            formsObj.createddate = datetime.datetime.now()
            session.add(formsObj)
            session.commit()
            session.refresh(formsObj)
            if formsObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Added successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't add now please tryagain later"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class getFormsCirculars(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            sql = 'select * from formsandcircularstbl order by id desc'
            formsObj = session.execute(text(sql)).fetchall()
            formsObjs = [dict(row) for row in formsObj]
            if len(formsObjs)>0 :
                session.close()
                return Response({'response':'Success','formslist':formsObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def get_userFormsCirculars(request):
    try :
        session = dbsession.Session()
        sql = 'select * from formsandcircularstbl where status ="Active" order by id desc'
        formsObj = session.execute(text(sql)).fetchall()
        formsObjs = [dict(row) for row in formsObj]
        if len(formsObjs)>0 :
             session.close()
             return Response({'response':'Success','formslist':formsObj})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

class deleteFormsCirculars(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['id']
            sql = session.query(formsandcircularsTbl).filter_by(id=id).delete()
            session.commit()
            if sql>0 :
                session.close()
                return Response({'response':'Success','message':'Deleted successfully '})
            else :
                session.close()
                return Response({'response':'Error','message':"can't delete now"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()


# Latest updates

class addLatestUpdates(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            latestObj = latestupdatesTbl()
            if request.data.getlist('image')!=['undefined']:
                for f in request.data.getlist('image'):
                    fs = FileSystemStorage()
                    filename = fs.save(f.name,f)
                    uploaded_file_url = fs.url(filename)
                    latestObj.imageurl = uploaded_file_url
            latestObj.linkurl = request.data['linkurl']
            latestObj.heading = request.data['heading']
            latestObj.content = request.data['content']
            latestObj.status = 'Active'
            latestObj.createddate = datetime.datetime.now()
            session.add(latestObj)
            session.commit()
            session.refresh(latestObj)
            if latestObj.id>0 :
                session.close()
                return Response({'response':'Success','message':'Added successfully'})
            else :
                session.close()
                return Response({'response':'Error','message':"Can't add now please tryagain later"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

class getLatestUpdates(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            sql = 'select * from latestupdatestbl order by id desc'
            latestObj = session.execute(text(sql)).fetchall()
            latestObjs = [dict(row) for row in latestObj]
            if len(latestObjs)>0 :
                session.close()
                return Response({'response':'Success','latestlist':latestObjs})
            else :
                session.close()
                return Response({'response':'Error','message':'No data found'})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

@api_view(['GET','POST'])
@permission_classes([AllowAny, ])
def get_UserLatestUpdates(request):
    try :
        session = dbsession.Session()
        sql = 'select * from latestupdatestbl where status ="Active" order by id desc'
        latestObj = session.execute(text(sql)).fetchall()
        latestObjs = [dict(row) for row in latestObj]
        if len(latestObjs)>0 :
             session.close()
             return Response({'response':'Success','latestlist':latestObj})
        else :
            session.close()
            return Response({'response':'Error','message':'No data found'})
    except SQLAlchemyError as e:
        print(e)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

class deleteLatestUpdates(APIView):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (TokenAuthentication, )
    def post(self, request):
        session = dbsession.Session()
        try :
            id = request.data['id']
            sql = session.query(latestupdatesTbl).filter_by(id=id).delete()
            session.commit()
            if sql>0 :
                session.close()
                return Response({'response':'Success','message':'Deleted successfully '})
            else :
                session.close()
                return Response({'response':'Error','message':"can't delete now"})
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()

# user status 



class UpdateUserStatus(APIView):
    permission_classes = (IsAuthenticated,)
    authentication_classes = (TokenAuthentication,)

    def post(self, request):
        session = dbsession.Session() 
        try:
            user_id = request.data['id']
            new_status = request.data['userstatus']

            userObj = session.query(UserRegistrationTbl).filter_by(id=user_id).one_or_none()

            if userObj:
                userObj.status = new_status
                session.commit()
                session.refresh(userObj)

                loginObj = session.query(loginTbl).filter_by(userid=userObj.id).one_or_none()
                if loginObj:
                    loginObj.status = new_status  
                    session.commit()
                    session.refresh(loginObj)

                session.close()
                return Response({
                    'response': 'Success',
                    'message': 'Updated Successfully'
                }, status=200)

            else:
                session.close()
                return Response({
                    'response': 'Error',
                    'message': "User not found, can't update status"
                }, status=400)

        except SQLAlchemyError as e:
            print(f"SQLAlchemyError: {e}")
            session.rollback()
            return Response({
                'response': 'Error',
                'message': 'Something went wrong. Please try again later.',
                'error': str(e)
            }, status=500)
        
        except Exception as e:
            print(f"Exception: {e}")
            session.rollback()
            return Response({
                'response': 'Error',
                'message': 'Something went wrong. Please try again later.',
                'error': str(e)
            }, status=500)
        
        finally:
            session.close()


# class BackupDatabaseView(APIView):
#     permission_classes = (IsAuthenticated,)
#     authentication_classes = (TokenAuthentication,)

#     def post(self, request):
#         try:
#             # Setup backup folder and file
#             backup_folder = os.path.join(settings.BASE_DIR, 'idpwoa', 'backups')
#             if not os.path.exists(backup_folder):
#                 os.makedirs(backup_folder)

#             timestamp = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
#             backup_file = f'u972251825_idpwoadb_{timestamp}_backup.sql'
#             backup_file_path = os.path.join(backup_folder, backup_file)

#             # Database connection
#             db_engine = create_engine(
#                 f"mysql+pymysql://{settings.DATABASES['default']['USER']}:{settings.DATABASES['default']['PASSWORD']}@"
#                 f"{settings.DATABASES['default']['HOST']}:{settings.DATABASES['default']['PORT']}/{settings.DATABASES['default']['NAME']}"
#             )
#             inspector = inspect(db_engine)

#             # Backup process
#             with open(backup_file_path, 'w', encoding='utf-8') as backup_file:
#                 for table_name in inspector.get_table_names():
#                     # Dump the table schema
#                     create_table_query = db_engine.execute(text(f"SHOW CREATE TABLE {table_name}")).fetchone()[1] 
#                     backup_file.write(f"-- Schema for table {table_name}\n")
#                     backup_file.write(create_table_query + ";\n\n")

#                     # Dump the table data
#                     backup_file.write(f"-- Data for table {table_name}\n")
#                     rows = db_engine.execute(text(f"SELECT * FROM {table_name}")).fetchall()
#                     if rows:
#                         columns = [col['name'] for col in inspector.get_columns(table_name)]
#                         for row in rows:
#                             values = ', '.join("'" + str(value).replace("'", "''") + "'" if value is not None else 'NULL' for value in row)
#                             backup_file.write(f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({values});\n")
#                     backup_file.write("\n")

#             # Prepare file for download 
#             with open(backup_file_path, 'rb') as file:
#                 response = HttpResponse(file.read(), content_type='application/octet-stream')
#                 response['Content-Disposition'] = f'attachment; filename="{backup_file}"'

#             return response

#         except Exception as e:
#             traceback.print_exc()    
#             return Response({'message': f'Error creating database backup: {str(e)}'},
#                             status=status.HTTP_500_INTERNAL_SERVER_ERROR)
from sqlalchemy.orm import sessionmaker
from idpwoa.models import dbbackupDtl
from os.path import basename
class BackupDatabaseView(APIView):
    permission_classes = (IsAuthenticated,)
    authentication_classes = (TokenAuthentication,)

    def post(self, request):
        try:
            # Setup backup folder and file
            backup_folder = os.path.join(settings.BASE_DIR, 'idpwoa', 'backups')
            if not os.path.exists(backup_folder):
                os.makedirs(backup_folder)

            timestamp = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
            backup_file = f'u972251825_idpwoadb_{timestamp}_backup.sql'
            backup_file_path = os.path.join(backup_folder, backup_file)

            # Database connection
            db_engine = create_engine(
                f"mysql+pymysql://{settings.DATABASES['default']['USER']}:{settings.DATABASES['default']['PASSWORD']}@"
                f"{settings.DATABASES['default']['HOST']}:{settings.DATABASES['default']['PORT']}/{settings.DATABASES['default']['NAME']}"
            )
            inspector = inspect(db_engine)

            # Backup process
            with open(backup_file_path, 'w', encoding='utf-8') as backup_file:
                for table_name in inspector.get_table_names():
                    # Dump the table schema
                    create_table_query = db_engine.execute(text(f"SHOW CREATE TABLE {table_name}")).fetchone()[1]
                    backup_file.write(f"-- Schema for table {table_name}\n")
                    backup_file.write(create_table_query + ";\n\n")

                    # Dump the table data
                    backup_file.write(f"-- Data for table {table_name}\n")
                    rows = db_engine.execute(text(f"SELECT * FROM {table_name}")).fetchall()
                    if rows:
                        columns = [col['name'] for col in inspector.get_columns(table_name)]
                        for row in rows:
                            values = ', '.join("'" + str(value).replace("'", "''") + "'" if value is not None else 'NULL' for value in row)
                            backup_file.write(f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({values});\n")
                    backup_file.write("\n")

            # Prepare file for download 
            with open(backup_file_path, 'rb') as file:
                response = HttpResponse(file.read(), content_type='application/octet-stream')
                response['Content-Disposition'] = f'attachment; filename="{backup_file}"'

            # Save backup details to the database (databasebackup_tbl)
            session = sessionmaker(bind=db_engine)()  # Creating a session to insert into the database
            backup_filename = basename(backup_file_path)  # Extract only the filename
            new_backup = dbbackupDtl(
                filename=backup_filename,  # Use only the filename
                date=datetime.datetime.now(),
                status='Active'  # You can set the status as per your requirement
            )
            session.add(new_backup)
            session.commit()

            return response

        except Exception as e:
            traceback.print_exc()    
            return Response({'message': f'Error creating database backup: {str(e)}'},
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
class get_Backup(APIView):
    permission_classes = (IsAuthenticated,)
    authentication_classes = (TokenAuthentication,) 
    
    def post(self, request):
        session = dbsession.Session()
        try:
            
            backup_sql = ' select databasebackup_tbl.id,databasebackup_tbl.filename,databasebackup_tbl.date from databasebackup_tbl where databasebackup_tbl.status="Active" '
            backup_result = session.execute(text(backup_sql)).fetchall()
            backup_list = [dict(row) for row in backup_result] 
            response_data = {
               
                "backup_list":backup_list 
            }

            if not backup_list :
                return Response({'response': 'Error', 'message': 'No data found'}, status=200) 
            
            return Response(response_data, status=200)
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
           session.close()
           
              
class get_automatic_Backup(APIView):
    permission_classes = (IsAuthenticated,)
    authentication_classes = (TokenAuthentication,) 
    
    def post(self, request):
        session = dbsession.Session()
        try:
            
            backup_sql = ' select automaticdbbackup_tbl.id,automaticdbbackup_tbl.filename,automaticdbbackup_tbl.date from automaticdbbackup_tbl where automaticdbbackup_tbl.status="Active" '
            backup_result = session.execute(text(backup_sql)).fetchall()
            backup_list = [dict(row) for row in backup_result] 
            response_data = {
               
                "backup_list":backup_list 
            }

            if not backup_list :
                return Response({'response': 'Error', 'message': 'No data found'}, status=200) 
            
            return Response(response_data, status=200)
        except SQLAlchemyError as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            print(e)
            session.rollback()
            session.close()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
           session.close()


@api_view(['GET','POST'])
@permission_classes([AllowAny, ]) 
def automatic_Backup(request): 
        session = dbsession.Session()
        try:
            backup_folder = os.path.join(settings.BASE_DIR, 'idpwoa', 'automatic_backups')
            files = os.listdir(backup_folder) 
            sql_files = [f for f in files if f.endswith('_backup.sql')]
            
            if sql_files:
                latest_file = max(sql_files, key=lambda f: os.path.getmtime(os.path.join(backup_folder, f)))
                backup_file_path = os.path.join(backup_folder, latest_file)

                try:
                    with open(backup_file_path, 'rb') as file:
                        response = HttpResponse(file.read(), content_type='application/octet-stream')
                        response['Content-Disposition'] = f'attachment; filename="{latest_file}"'
                        print('File downloaded successfully: ' + latest_file)
                        backupObj = automaticbackupDtl() 
                        backupObj.filename = latest_file
                        formatted_datetime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M') 
                        backupObj.date = formatted_datetime
                        backupObj.backupedid = request.data['id']   
                        backupObj.status = 'Active'
                        backupObj.createddate = datetime.datetime.now()
                        session.add(backupObj)
                        session.commit()
                        session.refresh(backupObj)
                        return Response({'response':'Success','message': 'File downloaded successfully', 'file_name': latest_file},
                                        status=status.HTTP_200_OK) 
                except FileNotFoundError:
                    return HttpResponseNotFound(f'File not found: {backup_file_path}')
            else:
                return Response({'message': 'No backup files found'}, status=status.HTTP_404_NOT_FOUND)

        except SQLAlchemyError as e:
            traceback.print_exc()
            session.rollback()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        except Exception as e:
            traceback.print_exc() 
            session.rollback()
            return Response({'response':'Error','message': 'Something went wrong please try again after sometime','Error':str(e)})
        finally:
            session.close()
  
            
            

