from django.shortcuts import render

import io
from django.db import models
import calendar
import datetime
import re
import os
import math, random 
import json,jwt
import sys

import hashlib
import string
import secrets
import environ
import requests



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.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.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 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) for row in userObj]
            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'
                    
            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"})
        


# 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()


# 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
            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()





@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.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)
        session.rollback()
        session.close()
        return Response({'response':'Error','message':"Something went wrong...! please try again later"})

