#ALERTAIR MONITOR FLIGHTS
import mysql.connector
import phonenumbers
from datetime import date
from pytz import timezone as tz
import cv2
from heyoo import WhatsApp
from datetime import timedelta
from email.mime.multipart import MIMEMultipart
from sqlescapy import sqlescape
from email.mime.text import MIMEText
import datetime
from haversine import haversine, Unit
import json
import ast
import math
import pdfkit
import urllib.parse
import requests
import time
from folium.features import DivIcon
import random
import string
import fitz
from PIL import Image, ImageDraw, ImageFont, ImageColor
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import folium
from smtplib import SMTP_SSL, SMTP_SSL_PORT
import sys
# appending a path
sys.path.append("./libs/cache.py")
sys.path.append("./libs/whatsapp_client.py")

from libs.cache import Cache
from libs.whatsapp_client import WhatsAppWrapper

client = WhatsAppWrapper()


#client.send_message("Alertair restarted",  "13042395146")
url=f"http://localhost:5000/send_message?phone=13042395146&message=restarted";
print(url)
response = requests.get(url)

#exit(1)



flights_url="https://airlabs.co/api/v9/flights?api_key=f250f4ba-57ad-462c-b988-e669aa89d652&flight_iata="
schedules_url="https://airlabs.co/api/v9/schedules?api_key=f250f4ba-57ad-462c-b988-e669aa89d652&flight_icao="
routes_url="https://airlabs.co/api/v9/routes?api_key=f250f4ba-57ad-462c-b988-e669aa89d652&airline_icao=TVF&flight_number=305"
airport_url="https://airlabs.co/api/v9/airports?&api_key=f250f4ba-57ad-462c-b988-e669aa89d652&iata_code="



def TakeCredit(user_id,credits_to_deduct=1):

    global mycursor;

    print(f"Taking one credit from user...{user_id}")
    mycursor.execute(f"SELECT credits FROM users WHERE user_id={user_id}")
    myresult = mycursor.fetchall()
    credits=myresult[0][0]
    if (credits==0):
        credits=0
    else:
        credits-=credits_to_deduct

    mycursor.execute(f"UPDATE users SET credits={credits} WHERE user_id={user_id}")
    mydb.commit()


def send_email(msg1,target="",subject=""):


    SMTP_HOST = 'mail.postale.io'
    SMTP_USER = 'info@alertair.net'
    SMTP_PASS = 'X724vHaF$%Eggd'

    # Craft the email by hand
    from_email = 'Alertair <info@alertair.net>'  # or simply the email address
    #to_bcc = ['log@visatopia.net']
    if (target):
        to_emails = [ target]
    #else:
    #    to_emails =to_bcc;

    body = msg1
    msg = MIMEMultipart('alternative')

    msg['From'] = from_email
    if (target):
        msg['To'] =  ', '.join(to_emails)
    #msg['Bcc'] =  ', '.join(to_bcc)

    if (subject==""):
        msg['Subject'] = msg1
    else:
        msg['Subject'] = subject
    text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
    part1 = MIMEText(text, 'plain')
    part2 = MIMEText(body, 'html')

    # Attach parts into message container.
    # According to RFC 2046, the last part of a multipart message, in this case
    # the HTML message, is best and preferred.
    msg.attach(part1)
    msg.attach(part2)
    # Connect, authenticate, and send mail
    smtp_server = SMTP_SSL(SMTP_HOST, port=SMTP_SSL_PORT)
    smtp_server.set_debuglevel(1)  # Show SMTP server interactions
    smtp_server.login(SMTP_USER, SMTP_PASS)
    if (target):
        smtp_server.sendmail(from_email, to_emails, msg.as_string())
    smtp_server.sendmail(from_email, "info@alertair.net", msg.as_string())

    # Disconnect
    smtp_server.quit()


def SystemEmails():

    global imap
    global u_id
    global mycursor
    global mydb;



    mycursor = mydb.cursor()
    #print("SELECT * FROM users WHERE welcome_email=0")
    print("Sending welcome emails for new users...");

    mycursor.execute("SELECT * FROM users WHERE welcome_email=0")



    email_template2= """\
    <!DOCTYPE html>
    <html>
    <head>
      <style>
        body {
          font-family: sans-serif;
          font-size: 14px;
        }
      </style>
    </head>
    <body>
      <p><b>Dear {User},</b></p>
      <p>Thank you again for submitting your eVisa application number <b>{formKey}</b>. Upon reviewing the information provided against the updated requirements, we have found that a few more details are required, such as the passport issuing date, etc.</p>
      <p>No need to worry; you don't have to go through the entire process again. Our consultant has already updated your file with the data you just provided.</p>
      <p>To ensure a smooth processing of your application, we kindly request that you provide the missing information by clicking on the following link to access your order in process: <p><a href="{continueProcessLink}">Click here to access your eVisa Application</a></p>
      <p>If you are unable to click on the link, you can copy it entirely and paste it into your browser's address bar from here: <p>{continueProcessLink}</p>
      <p>If you encounter any problems or have any questions, please email us back, and a consultant will contact you to assist you further.</p>
      <p>Thank you for your cooperation. If you have any questions or need further assistance, please don't hesitate to contact us.</p>
      <p>Best regards,</p>
      <p><b>Visetnam Team. | Powered by AITRVL</b></p>
    </body>
    </html>""";
    subject2="Action Required: Provide Missing Information for Your e-Visa Application Number: {generateId}";


    email_template1="""\
            <!DOCTYPE html>
        <html>
        <head>
        <meta charset="UTF-8">
        <title>Welcome to Alertair!</title>
        <style>
            body {
                font-family: Arial, sans-serif;
                font-size: 16px;
            }
        </style>
        </head>
        <body>
            <p><b>Dear {User},</b></p>
            <p>Thank you for joining Alertair!</b></p>
            <p>Our unique service allows you to receive Whatsapp alerts, anytime, anywhere on any flight in the world. </p>
            <p>Starting from delays, pre-landing, takeoff, cruising, landing and many more cool alerts!</p>
            <p>We credited your account with 10 free alerts so you can try and enjoy!</p>
            <p>Start here: <a href="https://www.alertair.net/">https://www.alertair.net</a></p>
            <p>Best regards,</p>
            <p><b>Alertair Team. </b></p>
        </body>
        </html> """;
    subject1="Welcome to Alertair!"


    email_receipt="""\
            <!DOCTYPE html>
        <html>
        <head>
        <meta charset="UTF-8">
        <title>Receipt #{generateId} for Alerts Purchase</title>
        <style>
            body {
                font-family: Arial, sans-serif;
                font-size: 14px;
            }
        </style>
        </head>
        <body>
            <p><b>Dear {User},</b></p>
            <p>Thank you for your payment of ${amount} for {service_string} Alerts Credits. Your receipt number is <b>{generateId}</b>.</p>
            <p>We appreciate your cooperation and hope we enjoy our service.</p>
            <p><b>***Payment will be shown on credit card statement as kosherwhere llc.</b></p>
            <p>Best regards,</p>
            <p><b>Alertair Team</b></p>
        </body>
        </html> """;
    subject_receipt="Receipt #{generateId} for Alerts Purchase"

    #createsql="INSERT "
    myresult = mycursor.fetchall()



    for request in myresult:
            user_id=request[0];
            firstname= request[4]
            lastname= request[5]
            if (not lastname):
                lastname=""
            email_template1=email_template1.replace("{User}",firstname+" "+lastname);
            print(email_template1);
            print(subject1)
            updatesql=f"UPDATE users SET welcome_email=1,last_update=now() WHERE user_id=" + '{}'.format(request[0])
            print(updatesql)
            send_email(email_template1,request[1],subject1)
            mycursor.execute(updatesql)
            mydb.commit()


             #VALUES ('','','','','','','','','','',0,'','','','','','','','','','','','',0,'','','','','','','','','','','','','','','','','','px','','','a','','','','','','','','','','unpaid','1234','1234','P9H8EPBGMB','JLMTVHVQEDVNJ1J42KFVHK9T5PLVSY','en','David','Avital','1983-05-02','90days-single',1,'avitaldavid@gmail.com','21297150')

    #####################################
    sql=f"SELECT users.user_id, users.email, users.fname, users_purchases.purchase_amount, users_purchases.purchase_credits,users_purchases.purchase_id FROM users_purchases INNER JOIN users ON users.user_id=users_purchases.user_id WHERE users_purchases.applied=1 AND users_purchases.sent_receipt=0  "
    #print(sql)
    mycursor.execute(sql)



    myresult = mycursor.fetchall()

    for request in myresult:
        generateId=(''.join(random.choices(string.ascii_uppercase , k=8)));
        service_string=request[4]

        subject_receipt=subject_receipt.replace("{generateId}",generateId);
        email_receipt=email_receipt.replace("{User}",request[2]);
        email_receipt=email_receipt.replace("{generateId}",generateId);
        email_receipt=email_receipt.replace("{amount}",request[3]);
        email_receipt=email_receipt.replace("{service_string}",service_string);
        email_receipt=email_receipt.replace("{additional_services}","");


        print(subject_receipt);
        print(email_receipt)


        updatesql=f"UPDATE users_purchases SET sent_receipt=1, receipt_id='{generateId}' WHERE user_id={request[0]} AND purchase_id={request[5]}"
        print(updatesql)
        mycursor.execute(updatesql)
        mydb.commit()


        send_email(email_receipt,request[1],subject_receipt)






    return 0



    sql=f"SELECT * FROM requests WHERE status='confirm' AND last_update < DATE_SUB(NOW(), INTERVAL {random.randint(3, 15)} MINUTE)"
    #sql=f"SELECT * FROM requests WHERE status='confirm' AND last_update < DATE_SUB(NOW(), INTERVAL 0 MINUTE)"
    print(sql)
    mycursor.execute(sql)

    myresult = mycursor.fetchall()

    for request in myresult:
            generateId=(request[20])
            secretagentkey=request[22]
            print(generateId)
            print(request[16])
            bod=request[15]
            bod=bod[0:bod.index("T")]

            service_type=request[5]
            expedite=request[6]
            pexp=request[17]
            pexp=pexp[0:pexp.index("T")]

            arrival_date=request[18]
            arrival_date=arrival_date[0:arrival_date.index("T")]

            url="https://visetnam.net/retrieve-individual-application?autoinputKey="+generateId+"&autoinputPassportNumber="+request[16]+"&autoinputBirthDate="+bod
            email_template2=email_template2.replace("{formKey}",generateId);
            email_template2=email_template2.replace("{continueProcessLink}",url);
            email_template2=email_template2.replace("{User}",request[7]+" "+request[8]);
            subject2=subject2.replace("{generateId}",generateId);
            print(email_template2);
            print(url)
            updatesql="UPDATE requests SET status='done' WHERE request_id=" + '{}'.format(request[0])
            print(updatesql)

            send_email(email_template2,request[14],subject2)
            mycursor.execute(updatesql)
            mydb.commit()
            insertsql=f"INSERT INTO applications_individual  (stage4EmergencyContactPhoneNumber,stage4EmergencyContactPhoneCountryCode,stage4EmergencyContactEmail,stage4EmergencyContactLastName,stage4EmergencyContactFirstName,stage4ContactAddressLine1,stage3Profession,stage2PurposeOfTravel,stage2FatherName,verificationCodeCompletedTimestamp,automationData,rejectReasons,stagePayPaymentId,stagePayPaymentType,stagePayBillingAddressZipCode,stagePayBillingAddressState,stagePayBillingAddressCountry,stagePayBillingAddressCity,stagePayBillingAddressLine2,stagePayBillingAddressLine1,stagePayAddressSameAsBilling,stagePayZipCode,stagePayState,stagePayCountry,stagePayCity,stagePayAddressLine2,stagePayAddressLine1,stagePayFullName,stage5QuestionsAndAnswers,stage4City,stage4ApartmentNumber,stage4AddressLine2,stage4AddressLine1,stage4AddressWhileInCountryIsLikeHotelAddressFlag,stage4ContactCity,stage4ContactApartmentNumber,stage4ContactAddressLine2,stage4ContactName,stage4FlightDestinationHotelAddress,stage4FlightDestinationHotelName,stage4FlightCompany,stage4FlightNumber,stage4FlightDate,stage3Phones,stage3Education,stage3MaritalStatus,stage2QuestionWereYouACitizenOfOtherCountry,stage2QuestionAreYouACitizenOfOtherCountry,stage2PersonalIdentificationNumber,stage2IssuingCity,stage2IssuingCountry,stage2ExpirationDate,stage2IssuanceDate,stage2FlightCountryOrigin,stage2ArrivalDate,stage2CurrentlyCitizenOfCountries,stage2PreviousCitizenOfCountries,stage2CountryOfCitizenship,stage2CountryOfBirth,stage2CityOfBirth,stage2Gender,stage2MotherName,stage2FirstName,stage2LastName,status,verificationCodeFailCounter,verificationCode,generatedId,secretAgentKey,languageKey,stage2FirstNameEnglish,stage2LastNameEnglish,stage2BirthDate,stage2VisaType,stage2VisaExpeditedFlag,stage2Email,stage2PassportNumber)VALUES ('','+1','','','','','','','',now(),'','','','','','','','','','',0,'','','','','','','','','','','','',0,'','','','','','','','','','','','','no','no','','','select','{pexp}','','','{arrival_date}','','','select','select','','male','','','','unpaid','1234','1234','{generateId}','{secretagentkey}','en','{request[7]}','{request[8]}','{bod}','{service_type}',{expedite},'{request[14]}','{request[16]}')"
            mydb  = mysql.connector.connect(user='visetnam', password='3*LKlH!3&354L*Ro',
                                          host='127.0.0.1',
                                          database='visetnam',auth_plugin="mysql_native_password")
            print(insertsql)
            mycursor = mydb.cursor()
            mycursor.execute(insertsql)
            mydb.commit()

            #os.system("php /var/www/html/api/complete-payment/complete-payment.route.php 30373039 "+generateId+" single RESTRICTED");

             #VALUES ('','','','','','','','','','',0,'','','','','','','','','','','','',0,'','','','','','','','','','','','','','','','','','px','','','a','','','','','','','','','','unpaid','1234','1234','P9H8EPBGMB','JLMTVHVQEDVNJ1J42KFVHK9T5PLVSY','en','David','Avital','1983-05-02','90days-single',1,'avitaldavid@gmail.com','21297150')
            print(insertsql)

    mydb  = mysql.connector.connect(user='visetnam', password='3*LKlH!3&354L*Ro',
                              host='127.0.0.1',
                              database='aitrvl',auth_plugin="mysql_native_password")
    mycursor = mydb.cursor()

def CalcLeftTime(lat,lng,arr_iata,speed):

    ### NEED TO ADD TO CACHE ONE TIME ######



    print("Calculate time left to the flight...")
    rjson=Cache.AirportApiCall(arr_iata,mycursor,mydb)
    print(rjson)
    #exit(1)

    loc1=(rjson['lat'],rjson['lng'])
    loc2=(lat,lng)
    dist=haversine(loc1,loc2,unit=Unit.NAUTICAL_MILES)
    print(speed)
    print(dist)
    divide=speed*0.621371
    if divide==0:
        return {"hours" : 0, "mins": "0", "timestring" : "0"}
    else:
        hr=dist/divide
    mins=hr*60;

    hrs=math.trunc(mins/60)
    mins=math.trunc(mins-hrs*60)


    timestring=""
    if (hrs==0):
        timestring+=f"{mins} minutes"
    else:
        timestring=f"{hrs} hours and {mins} minutes"

    return {"hours" : hrs, "mins": mins, "timestring" : timestring}


def MonitorByReg():

    flights=GetFlights("WHERE flight_date=flight_arrival_utc")

    for request in flights:
        print(f"Monitoring Flights by Registration Number...")
        airline_iata=request[0]
        flight_number=request[2]
        flight_icao=request[1];
        flight_date=request[3];
        flight_arrival_utc=request[4];
        islive=request[6];
        ended=request[5];
        tookoff=request[7];
        descending=request[8]
        pre_landing= request[9]
        landed=request[10]
        final_landing=request[11]


        if (islive==0):
            print("Checking if someone is on a move...")
            lj=Cache.LiveApiCall(airline_iata,flight_number,1,mycursor,mydb)
            if (not lj):
                print("Flight is offline...")
                dep_iata=""
            else:
                print("There is some move, moving to live")
                mycursor.execute(f"UPDATE alerts_users_flights SET islive=1,ended=0,pre_landing=0,monitor=1,final_landing=0,landed=0,scheduled=0,delay=0,tookoff=0,boarded=0,moving=0,descending=0,24hrs=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
                mydb.commit()




        if (islive==1):
            print("Checking who is live...")
            lj=Cache.LiveApiCall(airline_iata,flight_number,1,mycursor,mydb)
            if (not lj):
                dep_iata=""

            if (not lj):
                print("no more live, closing...")
                #UpdateActivityFlights(airline_iata,,flight_number,flight_icao,,flight_date,params="islive=0,ended=1")
                mycursor.execute(f"UPDATE alerts_users_flights SET islive=0,ended=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
                mydb.commit()
                continue

            if 'dep_iata' in lj:
                dep_iata=lj['dep_iata']
            else:
                dep_iata=""

            if 'arr_iata' in lj:
                arr_iata=lj['arr_iata']
            else:
                arr_iata=""

            print(lj)



            #Check Takeoff
            users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.tookoff=0 AND alerts_users_flights.islive=1")


            if tookoff==0:
                if lj is not None:
                    if (lj['alt']>100):
                        print("took off already...")
                        mycursor.execute(f"UPDATE alerts_users_flights SET tookoff=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
                        mydb.commit()


            if tookoff==0:
               if lj is not None:
                    if "speed" in lj:
                        if (lj['speed']>0):
                            if (1==1):
                            #if "v_speed" in lj:
                            #    if (lj['v_speed']>0):
                                if (1==1):
                                        if "alt" in lj:
                                            if (lj['alt']>5 and lj['alt']<500):
                                                print("Takeoff")
                                                for user in users:
                                                    message=f"Hi {user[1]}, %0a *Taking-off* - *{user[8]}* %0aYour flight is taking-off right now!%0depart from {lj['dep_iata']} %0aNo delays reported"
                                                    ActivityLog(user[2],message,user,0,2,lj,"",8)
                                                    print("Altering for scheduled...")
                                                mycursor.execute(f"UPDATE alerts_users_flights SET tookoff=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
                                                mydb.commit()
                                                continue;
            #Checking Landing

            #calc time to Destination
            timestring=""
            if "arr_iata" in lj:
                if "lat" in lj:
                    if "lng" in lj:
                        if "speed" in lj:
                            timestring=CalcLeftTime(lj['lat'],lj['lng'],lj['arr_iata'],lj['speed'])['timestring']
                        else:
                            timestring=""


            if (tookoff==1 and descending==0):
                if "v_speen" in lj:
                    if (lj['v_speed']<-3 and lj['alt']>500):
                        print("Start Descending from cruise altitude...")
                        print(f"Descending now...{airline_iata} {flight_number} {flight_icao} {flight_date}")
                        users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.descending=0")
                        for request in users:
                            message=f"*Descending* - *{request[8]}* %0aFlight started descending... %0aEstimated landing time: {timestring}%0aCVertical Speed:{round((lj['v_speed']*10)*3.28,2)} fpm %0aDestination: {arr_iata}%0aCurrently Cruising at *{lj['alt']}* feet %0aSpeed of: *{lj['speed']} Km/h*%0aHeading direction of *{lj['dir']}°*"
                            ActivityLog(request[2],message,request,0,2,lj,"",)
                        print("Altering for Descending Alert...")
                        mycursor.execute(f"UPDATE alerts_users_flights SET monitor=1, descending=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                        mydb.commit()
                        continue;

            if (tookoff==1 and pre_landing==0):
              if 'v_speed' in lj:
                if (lj['v_speed']<0 and lj['alt']<300 and lj['alt']>100):
                    print(f"Pre Landing now...{airline_iata} {flight_number} {flight_icao} {flight_date}")
                    users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.final_landing=0 AND alerts_users_flights.pre_landing=0")
                    landing="Pre Landing"
                    for request in users:
                        message=f"*{landing}* - *{request[8]}*%0aEstimated landing time: {timestring}%0aDeparted from {dep_iata}%0aDestination: {arr_iata}%0aCurrently Cruising at *{lj['alt']}* feet %0aSpeed of: *{lj['speed']} Km/h*%0aHeading direction of *{lj['dir']}°*"
                        ActivityLog(request[2],message,request,0,2,lj,"",9)
                    print("Altering for PRe Landing Alert...")
                    mycursor.execute(f"UPDATE alerts_users_flights SET monitor=1, pre_landing=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                    mydb.commit()
                    continue;
            #if (lj['alt']<500):
            #    print("Prepare for landing...")
            #Final Approach
            print(lj['status'])
            if 'v_speed' in lj:
              if (lj['v_speed']<0 and tookoff==1 and final_landing==0 ):
                if (lj['alt']<100 and lj['alt']>0):
                    print(f"Landing now...{airline_iata} {flight_number} {flight_icao} {flight_date}")
                    users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.final_landing=0")

                    landing="Final Approach"
                    for request in users:
                        message=f"*{landing}* - *{request[8]}*%0aEstimated landing time: {timestring}%0aDeparted from {dep_iata}%0aDestination: {arr_iata}%0aCurrently Cruising at *{lj['alt']}* feet %0aSpeed of: *{lj['speed']} Km/h*%0aHeading direction of *{lj['dir']}°*"
                        ActivityLog(request[2],message,request,0,2,lj,"",9)
                    print("Altering for Final Approach Alert...")
                    mycursor.execute(f"UPDATE alerts_users_flights SET monitor=1, final_landing=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                    mydb.commit()
                    continue;

            print(lj['status'])
            if (tookoff==1 and landed==0):
                if (lj['alt']==0):
                    print(f"Landing now...{airline_iata} {flight_number} {flight_icao} {flight_date}")
                    users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.final_landing=0")
                    landing="Landed"
                    for request in users:
                        message=f"*{landing}* - *{request[8]}*%0aEstimated landing time: {timestring}%0aDeparted from {dep_iata}%0aDestination: {arr_iata}%0aCurrently Cruising at *{lj['alt']}* feet %0aSpeed of: *{lj['speed']} Km/h*%0aHeading direction of *{lj['dir']}°*"
                        ActivityLog(request[2],message,request,0,2,lj,"",9)
                    print("Altering for Landing Alert...")
                    mycursor.execute(f"UPDATE alerts_users_flights SET tookoff=0,monitor=1, landed=1,ended=1, monitor=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                    mydb.commit()
                    continue;
            #exit(1)


def GetUsers(where_params):
    #GetUsers Function

    global mycursor;


    mycursor.execute(f"SELECT alerts_users_flights.alert_id,\
                             users.fname,\
                             alerts_users_flights.mobile,\
                             alerts_users_flights.flight_icao,\
                             alerts_users_flights.islive,\
                             alerts_users_flights.flight_icao,\
                             alerts_users_flights.flight_date, \
                             alerts_users_flights.user_id, \
                             alerts_users_flights.flight_number,\
                             alerts_users_flights.airline_iata, \
                             alerts_users_flights.tookoff, \
                             alerts_users_flights.descending, \
                             alerts_users_flights.flight_arrival_utc, \
                             alerts_users_flights.person_name, \
                             alerts_users_flights.relationship, \
                             alerts_users_flights.copy_myself, \
                             alerts_users_flights.my_copy_mobile \
                             FROM alerts_users_flights INNER JOIN users ON users.user_id=alerts_users_flights.user_id {where_params}")


    myresult = mycursor.fetchall()

    return myresult

def GetFlights(where_params):

    global mycursor;


    #mycursor.execute(f"SELECT `airline_iata`,`flight_icao`,`flight_number`,`flight_date`,`flight_arrival_utc`,`ended`,`islive`,`tookoff`,`descending`,`last_update` FROM `alerts_users_flights` {where_params} GROUP BY `airline_iata`,`flight_icao`,`flight_number`,`flight_date`,`flight_arrival_utc`,`ended`,`islive`,`tookoff`,`descending`,`last_update`   ORDER BY `last_update` DESC "    )
    mycursor.execute(f"SELECT `airline_iata`,`flight_icao`,`flight_number`,`flight_date`,`flight_arrival_utc`,`ended`,`islive`,`tookoff`,`descending`,`pre_landing`,`landed`,`final_landing` FROM `alerts_users_flights` {where_params} GROUP BY `airline_iata`,`flight_icao`,`flight_number`,`flight_date`,`flight_arrival_utc`,`ended`,`islive`,`tookoff`,`descending`,`pre_landing`,`landed`,`final_landing` "    )
    myresult = mycursor.fetchall()




    return myresult





def SendWAMessage(phone,message,user,free_credit,credits,lj,lsj,zoom):
    #SendWAMessage Function

    try:
        phone_number = phonenumbers.parse(phone)
    except Exception:
        print("issue with number")
        return 1
    if (not phonenumbers.is_valid_number(phone_number)):
        print(f"Phone Number is Invalid, Notify user that we deleted and he should create a new alert! {phone_number}")
        mycursor.execute(f"SELECT DISTINCT email,fname FROM `users` WHERE user_id='{user[7]}'"   )
        myresult = mycursor.fetchall()
        email = myresult[0][0]
        fname = myresult[0][1]
        email_template1="""\
                <!DOCTYPE html>
            <html>
            <head>
            <meta charset="UTF-8">
            <title>Welcome to Alertair!</title>
            <style>
                body {
                    font-family: Arial, sans-serif;
                    font-size: 16px;
                }
            </style>
            </head>
            <body>
                <p><b>Dear {User},</b></p>
                <p>You Number {Phone} is invalid!</b></p>
                <p>We tried to send a Whatsapp message to the number and its not working...</p>
                <p>The system automatically deleted your alerts associated with this number</p>
                <p>Please create a new Alert with a valid whatsapp number</p>
                <p>No credits charged</p>
                <p>Start here: <a href="https://www.alertair.net/">https://www.alertair.net</a></p>
                <p>Best regards,</p>
                <p><b>Alertair Team. </b></p>
            </body>
            </html> """;
        subject1="Wrong Whatsapp Number!"
        email_template1=email_template1.replace("{User}",fname);
        email_template1=email_template1.replace("{Phone}",phone);
        send_email(email_template1,email,subject1)
        mycursor.execute(f"DELETE FROM alerts_users_flights WHERE user_id={user[7]} AND mobile='{phone}'")
        mydb.commit()
        return 1


    person_name = user[13]
    relationship = user[14]
    copy_myself = user[15]
    my_copy_mobile = user[16]
    #Checking relationship

    original_message=message

    if (person_name!="" and relationship!="Myself"):
        message=message.replace(user[1],person_name+", your "+relationship+" "+user[1]+", added you to receive alerts on this flight.")


    print("Sending Whatsapp Message to..."+phone+"")
    #url=f"http://localhost:5000/send_message?phone={phone}&message={urllib.parse.quote(message)}";
    #print(url)
    #response = requests.get(url)

    if (free_credit):
        message=message+"%0a*Free Alert*"
        original_message=original_message+"%0a*Free Alert*"
    else:
        message=message+"%0a*1 Credit Deducted*"
        original_message=original_message+"%0a*1 Credit Deducted*"

    #message=message.replace("%0a","\n")
    #original_message=original_message.replace("%0a","\n")

    political_countries_url = (
        "http://geojson.xyz/naturalearth-3.3.0/ne_50m_admin_0_countries.geojson"
    )
    lat=0
    lng=0
    dir=0
    if (not lj):
        if (lsj):
            if (lsj['dep_iata']):
                #######NEED TO ADD TO CACHE ONE TIME########### LOADING AND THATS ALL
                #print(f"https://airlabs.co/api/v9/airports?&api_key=f250f4ba-57ad-462c-b988-e669aa89d652&iata_code={lsj['dep_iata']}")

                print(lsj['dep_iata'])

                aj = Cache.AirportApiCall(lsj['dep_iata'],mycursor,mydb)

                lat=aj['lat']
                lng=aj['lng']




    if (lj):
        lng=lj['lng']
        lat=lj['lat']
        dir=lj['dir']

    if (lat and lng):

        center_point = (lat,lng) # I use this location as my personal Memory Palace
        map = folium.Map(location = (center_point),height = 500, width = 500,zoom_start = zoom,
                          zoom_control=True, scrollWheelZoom=True,
                          dragging=True, no_touch=False, )
        folium.GeoJson(political_countries_url).add_to(map)
        img = Image.open('/var/www/html/alertair-root/plane.png')

        img_deg = img.rotate(-dir)
        img_deg.save('/var/www/html/alertair-root/planedir.png')
        icon = folium.features.CustomIcon('/var/www/html/alertair-root/planedir.png', icon_size=(50, 50))
        folium.Marker(
          location = (center_point),
          icon=icon
        ).add_to(map)
        folium.Marker(
             location = (center_point),
             icon=DivIcon(
               icon_size=(250,36),
                icon_anchor=(0,0),
                html=f'<div style="font-size: 20pt">&nbsp;{user[3]}</div>',
            )
          ).add_to(map)
            #folium.Choropleth(
            #geo_data=political_countries_url,
            #data=eco_footprints,
            #columns=["Country/region", "Ecological footprint"],
            #key_on="feature.properties.name",
            #).add_to(map)
            #tile = folium.TileLayer(
            #  tiles = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
            #  attr = 'Esri',
            #  name = 'Esri Satellite',
            #  overlay = False,
            #  control = True
            #).add_to(map)
        map_png = convert_map_png(map,"/var/www/html/alertair-root/alerts/map.png")



        add_logo("/var/www/html/alertair-root/alerts/map.png","/var/www/html/alertair-root/alertair.png","/var/www/html/alertair-root/alerts/map-logo.png")


        print("Sending Whatsapp Message to..."+phone+"")
        if (not free_credit):
            url=f"http://localhost:5000/send_user_image?phone={phone}&filename=/var/www/html/alertair-root/alerts/map-logo.png&message={urllib.parse.quote(message)}";
            print(url)
            response = requests.get(url)
            print(response)

            #client.send_message_image( message, "https://www.alertair.net/alerts/map-logo.png", phone)

            #client.send_message("hello_world",  phone)

            insertsql=f"INSERT INTO users_alerts_activity  (user_id, alert_id, flight_icao, flight_number,flight_datetime,alert_type_id,message,mobile) \
                                                        VALUES ({user[7]}, '{user[0]}', '{user[3]}', '{user[8]}','{user[6]}',1,'{message}','{phone}');"
            mycursor.execute(insertsql)
            mydb.commit()


            ##if copy is needed
            if (copy_myself==1):

                credits=2
                original_message="(COPY) "+original_message
                url=f"http://localhost:5000/send_user_image?phone={my_copy_mobile}&filename=/var/www/html/alertair-root/alerts/map-logo.png&message={urllib.parse.quote(original_message)}";
                print(url)
                response = requests.get(url)

                #client.send_message_image( original_message, "https://www.alertair.net/alerts/map-logo.png", my_copy_mobile)



                insertsql=f"INSERT INTO users_alerts_activity  (user_id, alert_id, flight_icao, flight_number,flight_datetime,alert_type_id,message,mobile) \
                                                            VALUES ({user[7]}, '{user[0]}', '{user[3]}', '{user[8]}','{user[6]}',1,'{original_message}','{my_copy_mobile}');"
                mycursor.execute(insertsql)
                mydb.commit()


    else:
        url=f"http://localhost:5000/send_user_sticker?phone={phone}&filename=/var/www/html/alertair-root/alerts/warning.png";
        print(url)
        #response = requests.get(url)
        #print(response)

        #client.send_image( "https://www.alertair.net/alerts/warning.png", phone)


        url=f"http://localhost:5000/send_message?phone={phone}&message={urllib.parse.quote(message)}";
        print(url)
        response = requests.get(url)

        #client.send_message( message, phone)



        insertsql=f"INSERT INTO users_alerts_activity  (user_id, alert_id, flight_icao, flight_number,flight_datetime,alert_type_id,message,mobile) \
                                                    VALUES ({user[7]}, '{user[0]}', '{user[3]}', '{user[8]}','{user[6]}',1,'{message}','{phone}');"
        mycursor.execute(insertsql)
        mydb.commit()



        if (copy_myself==1):
            url=f"http://localhost:5000/send_user_sticker?phone={my_copy_mobile}&filename=/var/www/html/alertair-root/alerts/warning.png";
            print(url)
            response = requests.get(url)

            #client.send_image( "https://www.alertair.net/alerts/warning.png", my_copy_mobile)

            credits=2
            original_message="(COPY) "+original_message
            url=f"http://localhost:5000/send_message?phone={my_copy_mobile}&message={urllib.parse.quote(original_message)}";
            print(url)
            response = requests.get(url)

            #client.send_message( message, my_copy_mobile)




            insertsql=f"INSERT INTO users_alerts_activity  (user_id, alert_id, flight_icao, flight_number,flight_datetime,alert_type_id,message,mobile) \
                                                        VALUES ({user[7]}, '{user[0]}', '{user[3]}', '{user[8]}','{user[6]}',1,'{original_message}','{my_copy_mobile}');"
            mycursor.execute(insertsql)
            mydb.commit()


    #if (response=="<Response [500]>"):
    #    return 1
    #else:
    if (not free_credit):
        TakeCredit(user[7],credits)






    return 0;



def ActivityLog(mobile,message,request,free_credit=0,credits=1,lj="",lsj="",zoom=3):
    #ActivityLog Function
    global mycursor

    user_id=request[7]
    #Check if user has enough credit
    mycursor.execute(f"SELECT credits,fname,zero_credits_alert FROM users WHERE user_id={user_id}")
    myresult = mycursor.fetchall()

    if (len(myresult)>0):
        if (myresult[0][0]<=0):
            print(f"No more credits for {user_id}")
            message=f"Hi {myresult[0][1]},%0aYou don't have enough credits to receive new alerts!%0aYou can quickly buy credits here:%0ahttps://www.alertair.net%0aMake sure you don't miss any important alerts%0aThank you!"
            zero_credits_alert=myresult[0][2]
            if (zero_credits_alert==0):
                SendWAMessage(mobile,message,myresult[0][0],1,0,"","",6)
                mycursor.execute(f"UPDATE users SET zero_credits_alert=1 WHERE user_id={user_id};")
                mydb.commit()
            else:
                print("Message on 0 credits already sent to user")
            return 1;





    #insertsql=f"INSERT INTO users_alerts_activity  (user_id, alert_id, flight_icao, flight_number,flight_datetime,alert_type_id,message,mobile) \
    #                                        VALUES ({user_id}, '{request[0]}', '{request[3]}', '{request[8]}','{request[6]}',1,'{message}','{mobile}');"
    #mycursor.execute(insertsql)
    #mydb.commit()




    print(mobile)
    print(message)

    print("Adding to Activity Log...")
    ret=SendWAMessage(mobile,message,request,free_credit,credits,lj,lsj,zoom)




def NewAlertMessage():
    global mycursor
    global flights_url


    print("Sending new alerts...")

    users=GetUsers("WHERE alerts_users_flights.welcome=0")


    for request in users:
        airline_iata=request[9]
        flight_number=request[8]
        flight_arrival_utc=request[12]

        if (flight_arrival_utc==flight_number):
            if (request[4]==1):
                message=f"Hi {request[1]},%0aCongratulations!%0aNew flight alert has been added for this number for Tail Number *{request[3]} {request[8]}*"
            else:
                message=f"Hi {request[1]},%0aCongratulations!%0aNew flight alert has been added for this number for Tail Number *{request[3]} {request[8]}*"

        print(airline_iata)
        print(flight_number)
        tstamp1=""
        if (flight_arrival_utc!=flight_number):
            fmt= '%Y-%m-%dT%H:%M:%S.%fZ'

            tstamp1 = datetime.datetime.strptime('{}'.format(request[6]), fmt)
            print(type(tstamp1))
            tstamp_now = datetime.datetime.now()

        timezone=""
        rj=Cache.RoutesCall(airline_iata,flight_number,mycursor,mydb)
        if 'dep_iata' in rj:
            aj=Cache.AirportApiCall(rj['dep_iata'],mycursor,mydb)
            timezone=aj['timezone']
            print(timezone)
            #exit(1)

            timezonetime= tstamp1.astimezone(tz(timezone))
            timezonetime=timezonetime.strftime("%Y-%m-%d %H:%M")
        else:
            timezonetime=""




        if (tstamp1!=""):
            if (request[4]==1):
                message=f"Hi {request[1]},%0aCongratulations!%0aNew flight alert has been added for this number for flight *{request[3]}* %0aDepartured: *{timezonetime} %0aTimezone: {timezone}!"
            else:
                message=f"Hi {request[1]},%0aCongratulations!%0aNew flight alert has been added for this number for flight *{request[3]}* %0aExpected Departure: *{timezonetime}* %0aTimezone: {timezone}!"

        ActivityLog(request[2],message,request,free_credit=1)
        #print (f"UPDATE alerts_users_flights SET welcome=1 WHERE alert_id={request[0]};")
        mycursor.execute(f"UPDATE alerts_users_flights SET welcome=1 WHERE alert_id={request[0]};")
        mydb.commit()
        print("DEBUG...")
        if (request[4]==1):
            print("New User Just Added a Live Flight, Let's send him his first status message...");

            if (tstamp1!=""):
                response_json=Cache.LiveApiCall(airline_iata,flight_number,0,mycursor,mydb)
            else:
                response_json=Cache.LiveApiCall(airline_iata,flight_number,1,mycursor,mydb)

            print("DEBUG2...")

            if (len(response_json)==0):
                print(f"Issue while loading the information for {request[5]}, skipping for now...F5HHH")
                continue
            print(response_json)
            status=response_json['status'];
            altitude=int(response_json['alt'] / 0.3048) ;
            dir=response_json['dir'];
            speed=response_json['speed'];
            if "v_speed" in response_json:
                v_speed=response_json['v_speed'];
            lng=response_json['lng'];
            lat=response_json['lat'];
            if "dep_iata" in response_json:
                dep_iata=response_json['dep_iata']
            else:
                dep_iata=response_json['reg_number']
            if "arr_iata" in response_json:
                arr_iata=response_json['arr_iata']
            else:
                arr_iata=response_json['reg_number']


            if ('arr_iata' in response_json):
                timestring=CalcLeftTime(response_json['lat'],response_json['lng'],response_json['arr_iata'],response_json['speed'])['timestring']
            else:
                timestring="No Info"



            message=f"*Flight Status* - *{request[5]}*%0aEstimated landing in: {timestring}%0aDeparted from {dep_iata}%0aDestination: {arr_iata}%0aCurrently Cruising at *{altitude}* feet %0aSpeed of: *{speed} Km/h*%0aHeading direction of *{dir}°*"
            ActivityLog(request[2],message,request,0,1,response_json)

            #SendWAMessage(request[2],message)
    #    print (f"UPDATE alerts_users_flights SET welcome=1 WHERE alert_id={request[0]};")
        mycursor.execute(f"UPDATE alerts_users_flights SET welcome=1 WHERE alert_id={request[0]};")
        mydb.commit()



def SOS():
    print("Here unusual stuff")

def Delays():
    global mycursor



    flights=GetFlights("WHERE delay=0 AND ended=0 AND flight_date<>flight_arrival_utc")



    for request in flights:
        print(f"Delay Notifications...")
        airline_iata=request[0]
        flight_number=request[2]
        flight_icao=request[1];
        flight_date=request[3];
        flight_arrival_utc=request[4];
        ended=request[5];
        print(f"Checking...{airline_iata} {flight_number} {flight_icao} {flight_date}")
        fmt= '%Y-%m-%dT%H:%M:%S.%fZ'
        tstamp1 = datetime.datetime.strptime('{}'.format(flight_date), fmt)
        tstamp_now = datetime.datetime.now()
        td=tstamp1-tstamp_now

        td_hours = int((td.total_seconds() / 60 /60))
        td_mins = int((td.total_seconds() / 60 )-td_hours*60)
        rj=Cache.RoutesCall(airline_iata,flight_number,mycursor,mydb)
        if rj is not None:
            if 'dep_iata' in rj:
                aj=Cache.AirportApiCall(rj['dep_iata'],mycursor,mydb)
                timezone=aj['timezone']
                print(timezone)
                #exit(1)

                timezonetime= tstamp1.astimezone(tz(timezone))
                timezonetime=timezonetime.strftime("%Y-%m-%d %H:%M")
            else:
                timezonetime=""
        else:
            timezonetime=""

        print(f"The flight is in...{td_hours} hrs {airline_iata} {flight_number} {flight_icao} {flight_date}")
        if (td_hours>12):
            print(f"Too much time until the flight...continue {airline_iata} {flight_number} {flight_icao} {flight_date}")
            continue
        else:
            if (td_hours<-12):
                print(f"Past or done {airline_iata} {flight_number} {flight_icao} {flight_date}")
                continue




        response_json=Cache.LiveScheduledCall(airline_iata,flight_number,mycursor,mydb);

        if (not response_json):
            print(f"Cannot pull {airline_iata} {flight_number} {flight_icao} {flight_date}")
            continue
        if "delayed" in response_json:
            delayed=response_json['delayed']
        else:
            delayed=0;





        status=response_json['status']
        dep_iata=response_json['dep_iata']
        arr_iata=response_json['arr_iata']
        duration=response_json['duration']


        users=GetUsers(f"WHERE  alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.delay=0")
        if (delayed):
            if (int(delayed)>0):
                for user in users:

                    print(f"flight is delayed {delayed}")
                    if (status=="scheduled"):
                        print("Flight still on the ground")
                        message=f"Hi {user[1]}, %0a*Delay* - *{user[5]}* %0aYour flight is delayed {round(delayed,2)} minutes and will depart soon%0afrom {dep_iata} on {timezonetime} %0aDuration: {round(duration/60,2)} hours in {arr_iata}"
                        print(message)
                        ActivityLog(user[2],message,user,0,1,"",response_json)

                    else:
                        if (status=="en-route"):
                            print("Flight is already in the air")
                            message=f"Hi {user[1]}, %0a *Delayed* - *{user[5]}* %0aYour flight was delayed {round(delayed,2)} minutes and will arrive late%0aDeparted from {dep_iata} %0aDuration: {round(duration/60,2)} hours in {arr_iata}%0a"
                            print(message)
                            ActivityLog(user[2],message,user,0,1,"",response_json)
                    print("Altering for delay...")
                    mycursor.execute(f"UPDATE alerts_users_flights SET delay=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
                    mydb.commit()



def TakeOff():
    global mycursor

    flights=GetFlights("WHERE islive=1 and monitor=1 AND ended=0  AND flight_date<>flight_arrival_utc AND tookoff=0")

    for request in flights:
        print("Take-offs Notifications...")
        airline_iata=request[0]
        flight_number=request[2]
        flight_icao=request[1];
        flight_date=request[3];
        flight_arrival_utc=request[4];
        ended=request[5];
        print(f"Checking...{airline_iata} {flight_number} {flight_icao} {flight_date}")
    #    fmt= '%Y-%m-%dT%H:%M:%S.%fZ'
    #    tstamp1 = datetime.datetime.strptime('{}'.format(flight_date), fmt)
    #    tstamp_now = datetime.datetime.now()

        lsj=Cache.LiveScheduledCall(airline_iata,flight_number,mycursor,mydb)
        lj=Cache.LiveApiCall(airline_iata,flight_number,0,mycursor,mydb)

        if (not lsj):
            lsj=""
            continue;
        if (not lj):
            lj=""
            continue;
        #if (len(lj)==0):
        #    print("Ending missed take offs that already finished...")
        #    mycursor.execute(f"UPDATE alerts_users_flights SET monitor=0 ,ended=1, islive=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
        #    mydb.commit()

        users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.tookoff=0 AND alerts_users_flights.islive=1")

        print(lj)
        print(lsj)

        if (lsj['arr_iata']==lj['arr_iata']):
            if "dep_actual_utc" not in lsj:
                if lj is not None:
                    if "speed" in lj:
                        if (lj['speed']>0):
                            if "alt" in lj:
                                if (lj['alt']>100):
                                    print("mark already took off")
                                    mycursor.execute(f"UPDATE alerts_users_flights SET tookoff=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
                                    mydb.commit()


        if (lsj['arr_iata']==lj['arr_iata']):
            if "dep_actual_utc" not in lsj:
                if lj is not None:
                    if "speed" in lj:
                        if (lj['speed']>0):
                            if "alt" in lj:
                                print("could be just started take off...")
                                if (lj['alt']<50):
                                #if (lj['alt']>5 and lj['alt']<500):
                                    print("Takeoff")
                                    for user in users:
                                        message=f"Hi {user[1]}, %0a*Taking-off* - *{user[5]}* %0aYour flight is taking-off right now!%0adepart from {lsj['dep_iata']} %0aFlight Duration: {round(lsj['duration']/60,2)} hours to {lsj['arr_iata']}%0aNo delays reported"
                                        ActivityLog(user[2],message,user,0,1,lj,lsj,8)

                                        print("Altering for scheduled...")
                                    mycursor.execute(f"UPDATE alerts_users_flights SET tookoff=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
                                    mydb.commit()






def PlaneMoving():
    global mycursor
    #airport ="https://airlabs.co/api/v9/airports?&api_key=f250f4ba-57ad-462c-b988-e669aa89d652&iata_code=" + json2.dep_iata

    #NEED TO HAVE MOVING CACHE
    lng=response_json['lng'];
    lng=response_json['lat'];

    flights=GetFlights("WHERE islive=1 and monitor=1 and ended=0  AND flight_date<>flight_arrival_utc")

    for request in flights:
        print("Plane is on the move Notifications...")
        airline_iata=request[0]
        flight_number=request[2]
        flight_icao=request[1];
        flight_date=request[3];
        flight_arrival_utc=request[4];
        ended=request[5];
        print(f"Checking...{airline_iata} {flight_number} {flight_icao} {flight_date}")
        fmt= '%Y-%m-%dT%H:%M:%S.%fZ'
        tstamp1 = datetime.datetime.strptime('{}'.format(flight_date), fmt)
        tstamp_now = datetime.datetime.now()

        lsj=Cache.LiveScheduledCall(airline_iata,flight_number,0, mycursor,mydb)
        lj=Cache.LiveApiCall(airline_iata,flight_number,0, mycursor,mydb)
        #if (len(lj)==0):
        #    print("Ending missed take offs that already finished...")
        #    mycursor.execute(f"UPDATE alerts_users_flights SET monitor=0 ,ended=1, islive=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
        #    mydb.commit()

        users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.tookoff=0 AND alerts_users_flights.islive=1")

        print(lj)
        if "dep_actual_utc" not in lsj:
            if "speed" in lj:
                if (lj['speed']>0):
                    if "alt" in lj:
                        print("could be just started take off...")
                        if (lj['alt']<50):
                            print("Takeoff")
                            for user in users:
                                message=f"Hi {user[1]}, %0a*Taking-off* - *{user[5]}* %0aYour flight is taking-ff right now!%0aDeparted from {dep_iata} %0aLanding after {round(duration/60,2)} hours in {arr_iata}%0aNo delays reported"
                                ActivityLog(user[2],message,request1,0,1,lj)
                                print("Altering for scheduled...")
                            mycursor.execute(f"UPDATE alerts_users_flights SET tookoff=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=0")
                            mydb.commit()












def Scheduled():
    global mycursor


    flights=GetFlights("WHERE islive=0 AND ended=0 AND flight_date<>flight_arrival_utc")


    for request in flights:
        print("Scheduled Flights Notifications...")
        airline_iata=request[0]
        flight_number=request[2]
        flight_icao=request[1];
        flight_date=request[3];
        flight_arrival_utc=request[4];
        ended=request[5];
        print(f"Checking...{airline_iata} {flight_number} {flight_icao} {flight_date}")
        fmt= '%Y-%m-%dT%H:%M:%S.%fZ'
        tstamp1 = datetime.datetime.strptime('{}'.format(flight_date), fmt)
        tstamp_now = datetime.datetime.now()
        td=tstamp1-tstamp_now

        td_hours = int((td.total_seconds() / 60 /60))
        td_mins = int((td.total_seconds() / 60 )-td_hours*60)

        print(td_hours)
        print(td_mins)

        rj=Cache.RoutesCall(airline_iata,flight_number,mycursor,mydb)
        if rj is not None:
            if 'dep_iata' in rj:
                aj=Cache.AirportApiCall(rj['dep_iata'],mycursor,mydb)
                timezone=aj['timezone']
                print(timezone)
                #exit(1)

                timezonetime= tstamp1.astimezone(tz(timezone))
                timezonetime=timezonetime.strftime("%Y-%m-%d %H:%M")
            else:
                timezonetime=""


        if (td_hours<-20):
            print("Flight never happenned and past...ending")
            mycursor.execute(f"UPDATE alerts_users_flights SET ended=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=0")
            mydb.commit()

        if (td_hours<=2 and td_hours>=0 ):


            _response_json=Cache.LiveScheduledCall(airline_iata,flight_number,mycursor,mydb)

            if not _response_json:
                print("Skipping...")
                continue;
            dep_iata=_response_json['dep_iata']
            arr_iata=_response_json['arr_iata']
            duration=_response_json['duration']
            delayed=_response_json['delayed']
            if (delayed=="None"):
                print("No Delays...")

            users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.final_landing=0 AND scheduled=0 AND alerts_users_flights.islive=0")
            #ISSUE 2HRS FLIGHT ON TIME

            #print(sqlcmd)

            for request1 in users:
                if (td_hours==0):
                    message=f"Hi {request1[1]}, %0a*Scheduled* - *{request1[5]}* %0aYour flight is on time!%0aIt will depart from {dep_iata} on {timezonetime} which is in {td_mins} minutes%0aDuration: {round(duration/60,2)} hours until landing in {arr_iata}%0aNo delays"
                else:
                    message=f"Hi {request1[1]}, %0a*Scheduled* - *{request1[5]}* %0aYour flight is on time!%0aIt will depart from {dep_iata} on {timezonetime} which is in {td_hours} hours and {td_mins} minutes%0aDuration: {round(duration/60,2)} hours until landing in {arr_iata}%0aNo delays"
                print(message)
                ActivityLog(request1[2],message,request1,0,1,"",_response_json)

            print("Altering for scheduled...")
            mycursor.execute(f"UPDATE alerts_users_flights SET scheduled=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=0")
            mydb.commit()
            continue

        ##### 24 HOURS NOTICE

        if (td_hours<=12 and td_hours>=0 ):


            print(f"Checking 24hours notice...{airline_iata} {flight_icao}")


            _response_json=Cache.LiveScheduledCall(airline_iata,flight_number,mycursor,mydb)


            if not _response_json:
                print("Skipping...")
                continue;
            dep_iata=_response_json['dep_iata']
            arr_iata=_response_json['arr_iata']
            duration=_response_json['duration']
            delayed=_response_json['delayed']
            if (delayed=="None"):
                print("No Delays...")

            users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND 24hrs=0 AND alerts_users_flights.islive=0")
            #ISSUE 2HRS FLIGHT ON TIME

            #print(sqlcmd)

            for request1 in users:
                if (td_hours==0):
                    message=f"Hi {request1[1]}, %0a *Scheduled* - *{request1[5]}* %0aYour flight is on time!%0aIt will depart from {dep_iata} on {timezonetime}  which is in {td_mins} minutes%0aDuration: {round(duration/60,2)} hours in {arr_iata}%0aNo delays"
                else:
                    message=f"Hi {request1[1]}, %0a *Scheduled* - *{request1[5]}* %0aYour flight is on time!%0aIt will depart from {dep_iata} on {timezonetime}  which is in {td_hours} hours and {td_mins} minutes%0aDuration: {round(duration/60,2)} hours until landing in {arr_iata}%0aNo delays"
                print(message)

                ActivityLog(request1[2],message,request1,0,1,"",_response_json)

            print("Altering for scheduled...")
            mycursor.execute(f"UPDATE alerts_users_flights SET 24hrs=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=0")
            mydb.commit()






def Landing(live_json,request):


    airline_iata=request[0]
    flight_number=request[2]
    flight_icao=request[1];
    flight_date=request[3];
    flight_arrival_utc=request[4];
    ended=request[5];
    print(live_json)
    altitude=feet = int(live_json['alt'] / 0.3048)
    dir=live_json['dir']
    speed=live_json['speed']
    if ('v_speed' in live_json):
      v_speed=live_json['v_speed']
    else:
      v_speed=0
    lng=live_json['lng']
    lat=live_json['lat']
    dep_iata=live_json['dep_iata']
    arr_iata=live_json['arr_iata']



    timestring=CalcLeftTime(lat,lng,arr_iata,speed)['timestring']
    if (speed==0):
      timestring="0"

    #Check if LANDING
    if (v_speed<-2 and altitude>20000):
        print("Start Descending from cruise altitude...")
        print(f"Descending now...{airline_iata} {flight_number} {flight_icao} {flight_date}")
        users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.descending=0")
        for request in users:
            message=f"*Descending* - *{request[5]}* %0aFlight started descending...%0aExpected landing in {timestring}%0aVertical Speed:{round((v_speed*10)*3.28,2)} fpm %0aDestination: {arr_iata}%0aCurrently Cruising at *{altitude}* feet %0aSpeed of: *{speed} Km/h*%0aHeading direction of *{dir}°*"
            ActivityLog(request[2],message,request,0,1,live_json,'',8)
        print("Altering for Descending Alert...")
        mycursor.execute(f"UPDATE alerts_users_flights SET monitor=1, descending=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
        mydb.commit()

    if (altitude<10000):
        print("Prepare for landing...")
    if (altitude<10000):
        print("Prepare for landing...")
    #Final Approach
    print(live_json['status'])
    if (altitude<300):
        print(f"Landing now...{airline_iata} {flight_number} {flight_icao} {flight_date}")
        users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.final_landing=0")
        for request in users:
            message=f"*Final Approach* - *{request[5]}* %0aLanding%0aExpected landing in {timestring}%0aDeparted from {dep_iata}%0aDestination: {arr_iata}%0aCurrently Cruising at *{altitude}* feet %0aSpeed of: *{speed} Km/h*%0aHeading direction of *{dir}°*"
            ActivityLog(request[2],message,request,0,1,live_json,'',8)
        print("Altering for Final Approach Alert...")
        mycursor.execute(f"UPDATE alerts_users_flights SET monitor=1, final_landing=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
        mydb.commit()
#


def MonitorLive():
    global mycursor
    global flights_url




    flights=GetFlights("WHERE islive=1 and monitor=1 and ended=0  AND flight_date<>flight_arrival_utc")

    print(flights)
    print("Live Monitoring...")
    for request in flights:
        airline_iata=request[0]
        flight_number=request[2]
        flight_icao=request[1];
        flight_date=request[3];
        flight_arrival_utc=request[4];
        ended=request[5];

        fmt= '%Y-%m-%dT%H:%M:%S.%fZ'
        tstamp1 = datetime.datetime.strptime('{}'.format(flight_date), fmt)
        tstamp_now = datetime.datetime.now()
        td=tstamp1-tstamp_now
        td_hours = int((td.total_seconds() / 60 /60))
        td_mins = int((td.total_seconds() / 60 )-td_hours*60)

        response_json=Cache.LiveApiCall(airline_iata,flight_number,0, mycursor,mydb)
        if (not response_json ):
            print(f"Skipping no return...{flight_icao} {flight_number} ")
            response_json=[];

        if (response_json=="None" or response_json==""):
            print(f"Skipping no return...{flight_icao} {flight_number}")
            response_json=[];



        users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.final_landing=0")

        _response_json=Cache.LiveScheduledCall(airline_iata,flight_number,mycursor,mydb)

        if (not _response_json):
            print(f"Remove from monitoring not live...{flight_icao} {flight_number}")
            mycursor.execute(f"UPDATE alerts_users_flights SET monitor=0,ended=1, islive=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
            mydb.commit()
            continue



        delayed=_response_json['delayed']
        dep_delayed=_response_json['dep_delayed']
        arr_delayed=_response_json['arr_delayed']
        duration=_response_json['duration']
        dep_iata=_response_json['dep_iata']
        arr_iata=_response_json['arr_iata']



        if (td_hours<=-20):
            print("Ending Flight since its not coming soon or the gap too large...")
            mycursor.execute(f"UPDATE alerts_users_flights SET monitor=0, landed=1,ended=1,islive=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
            mydb.commit()
            continue

        if (len(response_json)==0):
            print(f"4XFF Issue while loading the information,  skipping for now...{flight_icao}")
            print(f"4XFF Checking maybe already landed...{flight_icao}")





            #print(_response_json)
            if (len(_response_json)>0):
                status=_response_json['status'];
                print(status)
                dep_delayed=_response_json['dep_delayed']
                if (dep_delayed!="None"):
                    print(f"Flight is going to be delayed {dep_delayed} {status}")
                if (_response_json['status']=="landed"):
                    print("Flight Landed Successfully We can Notify and Close...")
                    print("Altering Landing and Close...")


                    if (delayed=="None"):
                        delayed=0;
                    if (not delayed):
                        delayed=0;


                    for _request in users:
                        message=f"*Landed* - *{flight_icao}* %0aLanded Safely%0aDeparted from {dep_iata}%0aDestination: {arr_iata}%0aFlight delayed: {delayed} minutes%0aTotal Flight Duration: { round(duration/60,2)} Hours"
                        ActivityLog( request[2],message,_request,0,1,response_json,_response_json,8)
                    mycursor.execute(f"UPDATE alerts_users_flights SET monitor=0, landed=1,ended=1, islive=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                    mydb.commit()
                else:

                    if (_response_json['status']=="landed"):
                        mycursor.execute(f"UPDATE alerts_users_flights SET monitor=0, landed=1,ended=1, islive=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                        mydb.commit()
                    if (_response_json['status']=="active"):
                        print("Flight is active means it's live!")
                        mycursor.execute(f"UPDATE alerts_users_flights SET monitor=1, landed=0,ended=0, islive=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' AND islive=0")
                        mydb.commit()





            else:
                print(td_mins)
                print("Maybe the flight is soon to be live...")
                if (td_hours==0 and (td_mins<=5 and td_mins>-30)):
                    print("Flight suppose to become LIVE soon...its OK...")
                else:
                    print("Ending Flight since its not coming soon or the gap too large...")
                    print("Check if just landed...")
                    if (_response_json['status']=="landed"):
                        users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.final_landing=0")
                        for request in users:
                            message=f"*Landed* - *{_request[5]}* %0aLanded Safely%0aDeparted from {dep_iata}%0aDestination: {arr_iata}*%0aFlight delayed: {delayed} minutes%0aTotal Flight Duration: { round(duration/60,2)} Hours"
                            ActivityLog( request[2],message,request,0,1,response_json,_response_json,8)
                        print("Altering for Landing Alert...")
                        mycursor.execute(f"UPDATE alerts_users_flights SET monitor=0, landed=1,ended=1,islive=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                        mydb.commit()
                        continue

                    else:
                        if (response_json['status']!="en-route"):
                            print("Closing....")
                            mycursor.execute(f"UPDATE alerts_users_flights SET monitor=0,ended=1, islive=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                            mydb.commit()
                            continue





        else:
            status=response_json['status'];
            if (status=="en-route"):
                print(f"Plane is in the Sky {airline_iata} {flight_icao}")
            else:
                print("No more live, lets remove and end from monitor...")
                if (response_json['status']=="landed"):
                    users=GetUsers(f"WHERE alerts_users_flights.airline_iata='{airline_iata}'  AND alerts_users_flights.flight_icao='{flight_icao}' AND alerts_users_flights.flight_date='{flight_date}' AND alerts_users_flights.flight_number='{flight_number}'  AND alerts_users_flights.final_landing=0")
                    for request in users:
                        message=f"*Landed* - *{flight_icao}* %0aLanded Safely%0aDeparted from {dep_iata}%0aDestination: {arr_iata}%0aFlight delayed: {delayed} minutes%0aTotal Flight Duration: { round(duration/60,2)} Hours"
                        ActivityLog( request[2],message,request,0,1,response_json,_response_json,8)
                    print("Altering for Landing Alert...")
                    mycursor.execute(f"UPDATE alerts_users_flights SET monitor=0, landed=1,ended=1,islive=0 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                    mydb.commit()
                    continue
                else:
                    print("closing")
                    mycursor.execute(f"UPDATE alerts_users_flights SET monitor=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
                    mydb.commit()
                    continue



                if "dep_actual_utc" in _response_json:
                    if (td_hours<=0 and td_hours>=((duration/60)/2)*-1):
                        print("Plane is probably not on landing stage but take off..")
                    else:
                        Landing(response_json,request)
                else:
                    print("Checking its synced....")
                    if (_response_json['arr_iata']==response_json['arr_iata']):
                        Landing(response_json,request)
                    else:
                        print("Not Same flight probably is the following one and with same flight number")
                        Landing(response_json,request)


            #







def AddToMonitor():

    global mycursor



    flights=GetFlights("WHERE islive=0 and monitor=0 and ended=0 AND flight_date<>flight_arrival_utc")

    for request in flights:
        print("Preparing Flights for Monitoring...")
        airline_iata=request[0]
        flight_number=request[2]
        flight_icao=request[1];
        flight_date=request[3];
        flight_arrival_utc=request[4];
        ended=request[5];
        print(f"Checking...{airline_iata} {flight_number} {flight_icao} {flight_date}")
        fmt= '%Y-%m-%dT%H:%M:%S.%fZ'
        tstamp1 = datetime.datetime.strptime('{}'.format(flight_date), fmt)
        tstamp_now = datetime.datetime.now()



        td=tstamp1-tstamp_now
        if (td.total_seconds()<0):
            if (ended==1):
                print(f"Past Flight...{airline_iata} {flight_number} {flight_icao} {flight_date}")
                continue;
            else:
                print("Found Flight That Haven't Been Monitored, Lets Check if its Still Relevant...")
                print("Checking The Arrival Time ...")
                flight_arrival_utc=datetime.datetime.strptime('{}'.format(flight_arrival_utc), fmt)
                diff=flight_arrival_utc-tstamp_now
                if (diff.total_seconds()<0):
                    print("Already Landed...Skipping...")
                    mycursor.execute(f"UPDATE alerts_users_flights SET ended=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
                    mydb.commit()
                    continue
                else:
                    print("TBD Flight That Need to Add to Monitoring...")
                    print(f"Move to Monitor...{airline_iata} {flight_number} {flight_icao} {flight_date}")
                    mycursor.execute(f"UPDATE alerts_users_flights SET islive=1 , monitor=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
                    mydb.commit()
                    continue


        td_hours = int((td.total_seconds() / 60 /60))
        td_mins = int((td.total_seconds() / 60 )-td_hours*60)
        print(f"Left for live monitor {td_hours} {td_mins}");
        if (td_hours==0 and td_mins<5):
            flights=GetFlights("WHERE islive=0 and monitor=0 and ended=0  AND flight_date<>flight_arrival_utc")
            print("Flight in 5 mins...")
            airline_iata=request[0]
            flight_number=request[2]
            flight_icao=request[1];
            flight_date=request[3];
            print(f"Move to Monitor...{airline_iata} {flight_number} {flight_icao} {flight_date}")
            mycursor.execute(f"UPDATE alerts_users_flights SET islive=1 , monitor=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")
            mydb.commit()

            continue
        else:
            print(f"Flight will begin in {td_hours} hours...")
            print("Waiting to find new flights to monitor...")
            continue
            #years_diff=td_hours/8760
            #print(format(td_hours)+" "+format(td_mins))



    flights=GetFlights("WHERE islive=1 and monitor=0 and ended=0 AND flight_date<>flight_arrival_utc")

    for request in flights:
        print("New Live Flights to Be Addded to Monitor...")
        airline_iata=request[0]
        flight_number=request[2]
        flight_icao=request[1];
        flight_date=request[3];
        print(f"Adding...{airline_iata} {flight_number} {flight_icao} {flight_date}")
        mycursor.execute(f"UPDATE alerts_users_flights SET monitor=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}' and islive=1")
        mydb.commit()




def SyncActivityFlights():

    global mycursor;

    sql="SELECT `airline_iata`,`flight_icao`,`flight_number`,`flight_date`, count(`airline_iata`) as count FROM `alerts_users_flights` WHERE islive=1 GROUP BY `airline_iata`,`flight_icao`,`flight_number`,`flight_date` HAVING count>1"
    mycursor.execute(sql)
    myresult = mycursor.fetchall()

    for flight in myresult:
        sql=f"SELECT `airline_iata`,`flight_icao`,`flight_number`,`flight_date`, `ended`,`islive`,`tookoff`,`descending`,`pre_landing`, `last_update` \
            FROM `alerts_users_flights`   \
            WHERE flight_icao='{flight[1]}' AND \
             airline_iata='{flight[0]}' AND\
             flight_number='{flight[2]}' AND\
             flight_date='{flight[3]}' \
            GROUP BY `airline_iata`,`flight_icao`,`flight_number`,`flight_date` ,`ended`,`islive`,`tookoff`,`descending`,`pre_landing`,`last_update` \
            ORDER BY `last_update` LIMIT 1"

        mycursor.execute(sql)
        syncone = mycursor.fetchall()
        syncone=syncone[0];
        setstring=""
        if syncone[4]==1:
            setstring+="ended=1,"
        if syncone[5]==1:
            setstring+="islive=1,"
        if syncone[6]==1:
            setstring+="tookoff=1,"
        if syncone[7]==1:
            setstring+="ended=1,"
        if syncone[8]==1:
            setstring+="pre_landing=1,"

        setstring=setstring[:-1]



        sql=f"UPDATE `alerts_users_flights` \
            SET {setstring} \
            WHERE flight_icao='{flight[1]}' AND \
             airline_iata='{flight[0]}' AND\
             flight_number='{flight[2]}' AND\
             flight_date='{flight[3]}' "


        mycursor.execute(sql)
        mydb.commit()

        #mycursor.execute(sql)
        #syncone = mycursor.fetchall()

#    print("Check if activity of flight exist")

#    sql="SELECT airline_iata, flight_icao, flight_number, flight_date FROM `flights_activity"
#    mycursor.execute(sql)
#    myresult = mycursor.fetchall()

#    if (len(myresult)>1):
#        print("Exists")
#        mycursor.execute(f"UPDATE alerts_users_flights SET islive=0,ended=1 WHERE airline_iata='{airline_iata}' and flight_number='{flight_number}' and flight_icao='{flight_icao}' and flight_date='{flight_date}'")

#    exit(1)



    #INSERT INTO flights_activity (airline_iata, flight_number, flight_icao, flight_date)
    #SELECT airline_iata, flight_number, flight_icao, flight_date FROM `alerts_users_flights` GROUP BY 1,2,3,4

#`ended`,`islive`,`tookoff`,'descending',`last_update` FROM `alerts_users_flights`
    #mycursor.execute(f"SELECT `airline_iata`,`flight_icao`,`flight_number`,`flight_date` FROM `flights_activity` GROUP BY `airline_iata`,`flight_icao`,`flight_number`,`flight_date`")
    #myresult = mycursor.fetchall()


    #sql="SELECT airline_iata, flight_icao, flight_number, flight_date FROM `alerts_users_flights` GROUP BY 1,2,3,4 "
    #mycursor.execute(sql)
    #myresult = mycursor.fetchall()

    #for flight in myresult:



def add_logo(mfname, lfname, outfname):

    mimage = Image.open(mfname)
    limage = Image.open(lfname)

    # resize logo
    wsize = int(min(mimage.size[0], mimage.size[1]) * 0.15)
    wpercent = (wsize / float(limage.size[0]))
    hsize = int((float(limage.size[1]) * float(wpercent)))

    simage = limage.resize((wsize, hsize))
    mbox = mimage.getbbox()
    sbox = simage.getbbox()

    # right bottom corner
    box = (mbox[2] - sbox[2], mbox[3] - sbox[3])
    mimage.paste(simage, box)
    mimage.save(outfname)







def convert_map_png(folium_map, file_name):
  mapName = file_name

  # Get HTML File of Map
  folium_map.save(mapName + '.html')
  htmlfile = mapName + '.html'

  # Convert Map from HTML to PDF, Delay to Allow Rendering
  options = {'javascript-delay': 500,
    'page-size': 'Letter',
    'margin-top': '0.0in',
    'margin-right': '0.0in',
    'margin-bottom': '0.0in',
    'margin-left': '0.0in',
    'encoding': "UTF-8",
    'custom-header': [
        ('Accept-Encoding', 'gzip')
    ]}
  pdfkit.from_file(htmlfile,  (mapName + '.pdf'), options=options)
  pdffile = mapName + '.pdf'

  # Convert Map from PDF to PNG
  doc = fitz.open(pdffile)
  page = doc.load_page(0)
  pix = page.get_pixmap(dpi=200)
  output = mapName + '.png'
  pix.save(output)
  pngfile = mapName + '.png'
  doc.close()

  # Crop Out Map Image
  pilImage = Image.open(pngfile)

  croppedImage = pilImage.crop((0,0,800,800)).save(file_name,"png") # Adjust this if your map renders differently on PDF

  return croppedImage


if __name__ == '__main__':
    print("Start ALERTAIR Turbo Engines...")


    #Very Nice to Add Image to TEXT
    #img = Image.new(mode="RGBA", size=(300,300), color='black')
    #draw = ImageDraw.Draw(img)
    #font = ImageFont.truetype('./fonts/RobotoCondensed-Regular.ttf', 35)
    #draw.text((10, 50), "Speed: 838km/h",font=font, fill='white')
    #img.save("/var/www/html/alertair-root/alerts/info.png")


    #exit(1)




    #m.save('../../alertair-root/alerts/map.html')
    #draw.text((140, 100), text, fill='black')
    #print(m)





    while (1==1):
        mydb  = mysql.connector.connect(user='alertair', password='4aKjmULhz',
                                      host='localhost',
                                      database='alertair',auth_plugin="mysql_native_password")

        mycursor = mydb.cursor()


        #string_phone_number = "+972546619909"
        #phone_number = phonenumbers.parse(string_phone_number)
        #print(phonenumbers.is_valid_number(phone_number))
        #exit(1)



        SyncActivityFlights()

        #exit(1)
        SystemEmails()
        NewAlertMessage()
        Cache.UpdateLiveCache("","",mycursor,mydb)
        Scheduled()
        TakeOff()
        #Taxiing()
        #UpdateScheduledCache()

        AddToMonitor()
        MonitorLive()
        MonitorByReg()
        Delays()
    #    TakeOff()



        #TakeOff
        #Boarding()
        #Delay()
        #Pre flight


        mycursor.close()
        mydb.close()
        print("Going to Wait for next loop...")
        time.sleep(30)



#def Landing():
