import json
from math import exp
import os
import argparse
from django.core.exceptions import ValidationError
from numpy import nan

import logging
import xml.etree.ElementTree as xml
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
import ftplib
from ftplib import FTP_TLS
from django.db import models
from django.template.loader import render_to_string
import datetime
from datetime import datetime

from numpy.lib.stride_tricks import broadcast_arrays
from .models import *
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.contrib.sessions.base_session import AbstractBaseSession
from django.contrib.sessions.models import Session
from pprint import pprint
from slugify import slugify
import datetime
from django import template
import time
from lxml import etree
from io import StringIO, BytesIO
from django.http import HttpResponseRedirect
from django.db.models import Max
from django.shortcuts import redirect
import xml.dom.minidom as xml2
from django.db import IntegrityError
from ftplib import error_perm
from pathlib import Path
import threading
import schedule
from django.contrib import messages
from datetime import timedelta

logger = logging.getLogger(__name__)
# colors = ['#9DBFF9','#FCCC75','#FF5C5C']
colors = ['#C152B6','#EA792D','#499E59','#23A8E2','#974BEF']

def index(request):
    from threading import Thread
    # pprint(request.session.user)
    #insert_verif = Thread(verifs_timer_insert,request)
    #insert_verif.start()
    request.session['id_user'] = '1' # make is dynamique
    channel = Channels.objects.get(pk = 1)
    day =  '2021-09-06' #make it dynamique than make it fix if data not found
    day = datetime.datetime.strptime(day, '%Y-%m-%d')
    dayformat = day.strftime('%Y-%m-%d')
    #user = 1 ==> make it dynamique
    channels_sfr = list(Channels.objects.filter(id_user='1').values_list("sfr_channel_name",flat=True))
    #region => make it dynamique
    val = Sfr_analytics.objects.filter(sfr_channel_name__in=channels_sfr, region='France' ,day=str(dayformat))
    result = []
    channel_sfr=[]
    purcent = Impressions.objects.get(pk='1') # change the name impressions to SFR_market_share
    for channel in channels_sfr :
        res= val.filter(sfr_channel_name=channel).values_list('minute','purcent')
        if len(res)>0:

            nb  =  float(purcent.total_users) / float(purcent.market_share_purcent)
            labels  = [x[0] for x in res ]
            data  = [int(float(x[1])*nb) for x in res]
            result.append( data)
            channel_sfr.append(channel)
    import random

    color = colors

    channels =Channels.objects.filter(id_user = request.session['id_user']).values_list('channel_name')
    channels = [x[0] for x in channels]
    lines  = Verifs.objects.filter(airStatuscode="0001",broadcastDate="20211024")
    # lines  = Verifs.objects.all()
    data2 = []

    for line in lines:
        if line.networkname in channels :
            p ={
                'channel':line.networkname,
                'name' : line.spotId,
                'day' : str(line.airTime).split(' ')[0],
            }

            region = ChannelsZone.objects.get(zonename =line.zonename)
            p['region'] = region.region
            min = str(line.airTime).split(' ')[1].split(':')
            minute = min[0]+':'+min[1]+':00'
            p['minute'] = minute
            p['color'] = '#00800000'
            if  str(line.airStatuscode) == '0001':
                p['status'] = 'Aired Successfully'
                p['color'] = '#2c2c8cb3'

                for i in Sfr_analytics.objects.filter(day=p['day'],minute=p['minute']):
                    if p['channel'] in i.sfr_channel_name :
                        purcent = Impressions.objects.get(pk='1')
                        nb  = float(i.purcent) * float(purcent.total_users) / float(purcent.market_share_purcent)
                        p['nb_wach'] = int(nb)
            elif str(line.airStatuscode) == '0008':
                p['status'] = 'Failed, Adspot cut'
                p['nb_wach'] = '-'

            else :
                p['status'] = 'Failed, Other Reason'
                p['nb_wach'] = '-'

            data2.append(p)

    campaigns = len(Campaigns.objects.filter(id_user=request.session['id_user']))
    campaigns_active = len(Campaigns.objects.filter(id_user=request.session['id_user'],pacing=True))
    advertiser = most_advertisers(request)
    bookeds = booked_adbreaks(request)
    agences =active_agency(request)
    playlist = playlists(request)
    activites = Activity.objects.all().order_by('-id_activity')[0:5]
    channels = Channels.objects.filter(id_user=request.session['id_user'])
    #activites = []
    return render(request, "DAIManagementApp/index.html", {'labels': labels,'data': data, 'data2': data2, 'day': dayformat,
                                                            'nb_channels':len(channels) ,'campaigns':campaigns,
                                                            'campaigns_active':campaigns_active , 'advertisers':advertiser,
                                                            'bookeds':bookeds,'agences':agences,'playlists':playlist,
                                                            'activites':activites , "channels":channels , 'result':result ,
                                                            'channels_sfr':channel_sfr,'color':color})

# calculer le nombrer des playlists delivrer et annuler
def playlists(request):
    from datetime import datetime, timedelta
    result = {
        'delivered' :0,
        'cancelled' :0,
        'purcent' : 0
    }
    channels =Channels.objects.filter(id_user = request.session['id_user'])
    yesterday = datetime.now() - timedelta(days=1)
    date = yesterday.strftime('%Y-%m-%d')
    try :
        playlist = list(Playlists.objects.filter(id_channel__in = channels ,broadcastdate=date ))[-1]
        channel = playlist.id_channel.channel_name
    except:
        return result
    day = date.replace('-','')
    verifs = Verifs.objects.filter(networkname=channel,broadcastDate=date).values_list('airStatuscode')
    verifs = [i[0] for i in verifs ]
    if len(verifs) == 0:
        return result
    for i in verifs :
        if i =='0001':
            result['delivered'] +=1
        else:
            result['cancelled'] +=1
    purcent  = result['delivered']*100/len(verifs)
    result['purcent'] = round(purcent,2)
    return result

def booked_adbreaks(request):
        channels =Channels.objects.filter(id_user = request.session['id_user']).values_list('id_channel','channel_name')
        result = []
        for channel in channels :
            r = {}

            adspot = Adspots.objects.filter(id_channel = channel[0])
            booked = Campaigns.objects.filter(id_adpost__in=adspot , booked=True)
            avail = AdspotsInAvail.objects.filter(id_adspot__in = adspot)
            r['channel'] = channel[1]
            r['booked'] = len(booked)
            r['avail'] = len(avail)
            if len(booked) > 0 :
                result.append(r)
        return result
# les campaigns qui sont termine  ou en cours
def active_agency(request):
    agences = Agency.objects.filter(id_user=request.session['id_user'],is_deleted=0).values_list('id_agency','name','datetime')
    result = []
    for agence in agences:
        r={}
        r['name'] = agence[1]
        brands = Brands.objects.filter(id_agency=agence[0])
        campaigns = Campaigns.objects.filter(id_brand__in=brands,pacing=True)
        if len(campaigns)!=0:
            r['date'] = agence[2]
            r['campaigns'] = len(campaigns)
            result.append(r)
    return result

def most_advertisers(request) :

    brands_id = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).values_list('id_brand')
    brands_id = [x[0] for x in brands_id]
    brands = Brands.objects.filter(pk__in=brands_id).order_by('-id_brand')
    totals = []
    dic = []
    result = []
    for i in brands:
        adspots = Adspots.objects.filter(id_brand=i)
        toutal = len(adspots)
        totals.append(toutal)
        brand = {'id_brand' : i.id_brand,
                'name_brand' : i.brand_name,
                'total_adspots' : toutal,
                'logo' : i.logo }
        print(brand)
        dic.append(brand)
    print(totals)
    for i in range(0,4):
        max_value = max(totals)
        max_index = totals.index(max_value)
        a=totals.pop(max_index)
        result.append(dic[max_index])
    print(result)
    return result


def login(request):
    return render(request, "DAIManagementApp/login.html")

def test_options(request):
    if request.method =='POST':
        options = request.POST.get('optionsname')
        print(options)
    return render(request, "DAIManagementApp/test_options.html")

def logout(request):
    #The request.session['islogged'] or['id_user'] raise KeyError if the given key isn�t already in the session.
    try:
        del request.session['islogged']
        del request.session['id_user']
    except KeyError:
        pass
    return render(request, "DAIManagementApp/login.html")

def dologin(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    try:
        data=Users.objects.filter(userlogin=username).get(userpass=password)
    except Users.DoesNotExist:
        messages.error(request, 'Someting Wrong.')
        return render(request,'DAIManagementApp/login.html')
    if data:
        request.session['islogged'] = 'yes'
        request.session['id_user'] = str(data.id_user)
        return redirect('/DAIManagement/')
    else:
        messages.error(request, 'Error detected.')


def handle_uploaded_file(file, path, filename):
    with open(path+"/"+filename, 'wb+') as destination:
        for chunk in file.chunks():
            destination.write(chunk)


# Generating XML file from the Database
def GenerateXMLfromDatabase(day, channel_id, id_zonename, version,draft_version='0'):
    #day is 2021-10-25
    # getting the channel selected in form
    channel = Channels.objects.get(id_channel=channel_id)
    channel_zone = ChannelsZone.objects.get(id_zone_channel=id_zonename)

    # day format will be YYYY-MM-DD, so to get the other format YYYYMMDD we'll transform it
    datetimeobject = datetime.datetime.strptime(day, '%Y-%m-%d')
    dayformat = datetimeobject.strftime('%Y%m%d')
    dayformat_string = str(dayformat)

    # finding the playlist based on Channel and Daytime and Version
    # max_version_draft = Playlists.objects.filter(broadcastdate=str(day)).aggregate(Max('draft_version')).get('draft_version__max')
    # new_version_draft = max_version_draft
    playlist = Playlists.objects.get(id_channel_id=int(channel_id), version=version, broadcastdate=str(day), id_zone_channel=channel_zone.id_zone_channel,is_draft='0',draft_version=draft_version)

    # insertion of Schedule tag data in the xml file
    root = xml.Element('Schedule')
    root.set('xmlns', 'http://www.scte.org/schemas/118-3/201X')
    root.set('broadcastDate', dayformat_string)
    root.set('begDateTime', day + 'T00:01:00+00:00')
    root.set('endDateTime', day + 'T23:59:59+00:00')
    root.set('networkName', channel.networkname)
    root.set('zoneName', channel_zone.zonename)
    root.set('revision', version)
    root.set('level', '0')
    root.set('schemaVersion', 'http://www.w3.org/2001/XMLSchema')

    # finding windows linked to this playlist
    windows = Windows.objects.filter(id_playlist=playlist.id_playlist)

    windows_array = {}
    win_i = 0
    for window in windows:
        # transforming window start from datetime to string
        windowStartxml = str(window.window_start).replace(' ', 'T')
        windowStartxml = windowStartxml + '+00:00'
        # using windows_array to insert as many windows as possible without having issues with the names of windows to append to xml
        windows_array[win_i] = xml.Element('Window')  # we can have more than one window
        windows_array[win_i].set('windowStart', windowStartxml)
        windows_array[win_i].set('windowDuration', window.window_duration)
        root.append(windows_array[win_i])
        # finding avails linked to this window
        avails = Avails.objects.filter(id_window=window.id_window)
        avails_array = {}
        av_i = 0
        for avail in avails:
            # transforming window start from datetime to string
            availStartxml = str(avail.avail_start).replace(' ', 'T')
            availStartxml =  availStartxml + '+00:00'
            # using avails_array to insert as many avails as possible without having issues with the names of avails to append to xml
            avails_array[av_i] = xml.SubElement(windows_array[win_i], 'Avail')
            avails_array[av_i].set('availStart', availStartxml)
            avails_array[av_i].set('availInWindow', avail.availinwindow)
            avails_array[av_i].set('availNum', '0')
            # finding adspots linked to this avail
            adspotsinAV = AdspotsInAvail.objects.filter(id_avail=avail.id_avail).select_related('id_adspot')
            adspots_array = {}
            ads_i = 0
            for adspot in adspotsinAV:

                adspot_duration = time.strftime('%H%M%S00', time.gmtime(int(adspot.id_adspot.duration)))
                adspots_array[ads_i] = xml.SubElement(avails_array[av_i], 'Spot')
                adspots_array[ads_i].set('eventType', 'LOI')
                adspots_array[ads_i].set('trafficId', str(adspot.trafficid))
                adspots_array[ads_i].set('positionInAvail', str(adspot.positioninavail))
                # we will add a function that will convert seconds to hhmmssmm there are many ones on stackoverflow, let's now suppose that the duration of the spot is less than 60 seconds just to test
                adspots_array[ads_i].set('length', adspot_duration)
                adspots_array[ads_i].set('spotId', adspot.id_adspot.filename)
                adspots_array[ads_i].set('adId', adspot.id_adspot.duration + 'sec')
                adspots_array[ads_i].set('schedSource', 'Local')
            ads_i += 1
        av_i += 1
    win_i += 1
    tree = xml.ElementTree(root)
    print(dayformat_string)
    print(channel_zone.zonename)
    print(channel.channel_name)
    print(playlist.version)
    fileName = dayformat_string + "-" + channel_zone.zonename + "-" + channel.channel_name + "-" + playlist.version + ".sch"
    print(fileName)
    path = "files/DAI-Management"
    if not os.path.exists(path):
        os.makedirs(path)
    with open(fileName, "wb") as files:
        tree.write(files, encoding='utf-8', xml_declaration=True)
    return fileName


def testGenerateFromDatabase(request):
    return HttpResponse(GenerateXMLfromDatabase("2021-08-16", "2M", "1"))


def getfile(filename , mode ):
    for path, subdirs, files in os.walk('/'):
        for name in files:
            if filename == name :
                file = os.path.join(path, name)
                f = open(file , mode)
                return f


def uploadFTP2(host, user, password, filename, path_inftp):

    ftp = ftplib.FTP(host, user, password)
    ftp.encoding = "utf-8"
    ftp.cwd(path_inftp)

    for path, subdirs, files in os.walk(os.getcwd()):
        for name in files:
            if filename == name :
                file = os.path.join(path, name)
                print(file)
                with open(file, "rb") as f:
                    ftp.storbinary(f"STOR {filename}", f)
    ftp.quit()

def downloadFTP(host, user, password, filepath_inftp, file_inftp,  localpath):

    ftp = ftplib.FTP(host, user, password)
    ftp.encoding = "utf-8"
    ftp.cwd(filepath_inftp)
    filename = file_inftp
    # localfile = localpath+'/'+filename
    localfile = localpath+'/'+filename
    print(localfile)

    try:
        with open(localfile, "wb") as file:
            ftp.retrbinary(f"RETR {filename}", file.write)
    except error_perm:
        print('ERR', localfile)
        os.unlink(localfile)

    #
    # with open(localfile, "wb") as file:
    #     ftp.retrbinary(f"RETR {filename}", file.write)

    ftp.quit()



def test_download(request):
    return HttpResponse(downloadFTP("uk06.tmd.cloud", "testftp@epgsano.com", "I?#=s3FfnSu_", "/2M/schedules/",  "test.txt" , "/var/www/html/DAI-Management/DAIManagement/FTP_files/"))

def uploadFTP(host, port, user, password, filename, path_inftp):

    ftp = ftplib.FTP(host, user, password)
    # ftp.encoding = "utf-8"
    # Enter File Name with Extension
    ftp.cwd(path_inftp)
    module_dir = os.path.dirname(__file__)  # get current directory
    path = "files/DAI-Management"


    # Read file in binary mode
    with open(filename, "rb") as file:
        # Command for Uploading the file "STOR filename"
        ftp.storbinary(f"STOR {filename}", file)
    ftp.quit()


def saveXML2db(request):
    path = "files/results/20210906-2005-00001.xml"
    doc = xml2.parse(path)
    networkname = doc.firstChild.getAttribute("networkName")
    zonename = doc.firstChild.getAttribute("zoneName")
    broadcastdate = doc.firstChild.getAttribute("broadcastDate")
    verComplete = doc.firstChild.getAttribute("verComplete")


    Spots = doc.getElementsByTagName("Spot")
    results = []
    for spot in Spots:
        trafficId = spot.getAttribute("trafficId")
        spotId  = spot.getAttribute("spotId")

        airTime = spot.getAttribute("airTime")
        newAirTime = airTime.replace("T", " ")
        newAirTime2 = newAirTime.replace("+02:00", "")

        airLength = spot.getAttribute("airLength")
        airStatusCode = spot.getAttribute("airStatusCode")
        version = spot.getAttribute("revision")
        try:
            Verifs.objects.update_or_create(networkname=networkname, zonename=zonename, broadcastDate=broadcastdate, trafficId=trafficId, spotId=spotId, airTime=newAirTime2, airLength=airLength, airStatuscode=airStatusCode, revision=version,  vercomplete = verComplete)
        except IntegrityError as e:
            insertion = Verifs.objects.filter(networkname=networkname, zonename=zonename, broadcastDate=broadcastdate, trafficId=trafficId, spotId=spotId, airTime=newAirTime2, airLength=airLength, airStatuscode=airStatusCode, revision=version).update(vercomplete = verComplete)

        # Verifs.objects.update_or_create(networkname=networkname, zonename=zonename, broadcastDate=broadcastdate, trafficId=trafficId, spotId=spotId, airTime=newAirTime2, airLength=airLength, airStatuscode=airStatusCode, revision=version,  vercomplete = verComplete)
        #verifs.save()
    return HttpResponse("data has been inserted")





def test_upload(request):
    return HttpResponse(uploadFTP2("uk06.tmd.cloud", "testftp@epgsano.com", "I?#=s3FfnSu_", "/files/DAI-Management/20210815-2005-2M-1.sch" , "2M/schedules/France"))

def views_advertiser(request ,id_brand=""):
    if id_brand != "":

        brand =  Brands.objects.get(pk=id_brand)
        channels = Adspots.objects.filter(id_brand=id_brand).values_list('id_channel').distinct()
        channels =  [ i[0]  for i in list(channels)]
        channels = Channels.objects.filter(pk__in = channels)
        adspots = Adspots.objects.filter(id_brand=id_brand).order_by('id_channel')

        return render(request,'DAIManagementApp/views_advertiser_adspots.html', {'data':{'adspots':adspots, 'brand' : brand , 'channels' : list(channels)}})
    else :

        brands_id = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).values_list('id_brand')
        brands_id = [x[0] for x in brands_id]
        brands = Brands.objects.filter(pk__in=brands_id).order_by('-id_brand')

        dic = []
        for i in brands:

            adspots = Adspots.objects.filter(id_brand=i)
            toutal = len(adspots)
            brand = {'id_brand' : i.id_brand,
                    'name_brand' : i.brand_name,
                    'total_adspots' : toutal,
                    'logo' : i.logo }
            print(brand)
            dic.append(brand)


        return render(request , 'DAIManagementApp/views_advertiser.html' , {'brands':dic } )

def add_advertiser(request):
    if request.method =='POST':
        advertiser_name = request.POST.get('advertiser_name')
        category = request.POST.get('category')
        advertiser_desc = request.POST.get('advertiser_desc')
        active_0_1 = request.POST.get('active_0_1')
        now = datetime.datetime.now()
        path = "static/Advertisers_imgs"
        now_infile = str(now).replace(" ", "_")
        now_infile = now_infile.replace(":", "-")
        filename = advertiser_name+"__"+now_infile+".png"
        try :
            handle_uploaded_file(request.FILES['advertiser_logo'], path, filename)
        except:
            import shutil
            shutil.move('logo.png',path+'/'+filename)
        Brand = Brands(brand_name=advertiser_name ,description=advertiser_desc, category=category, status=active_0_1, logo=path+'/'+filename)
        activite ='Add Advertirer'
        desc = 'Admin Add advertiser  id: ' + str(Brand.id_brand)
        activity = Activity(activity=activite , date=now ,description=desc )
        activity.save()
        Brand.save()
        Advertiser_user = UsersAdvertisers(id_user_id=request.session['id_user'], id_brand_id=Brand.id_brand, status=active_0_1, datetime=now)
        Advertiser_user.save()
        return redirect('/DAIManagement/views_advertiser/')

    else:
        return render(request, "DAIManagementApp/add_advertiser.html")

def edit_advertiser(request,id_brands="1"):
    print(request.method)
    if request.method == 'POST':
        print(id_brands)
        brand = Brands.objects.get(pk=id_brands)
        return render(request , 'DAIManagementApp/edit_advertiser_id.html', {'brand' : brand})
    else:
        # brands_id = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).select_related('id_brand').all()
        # brands = Brands.objects.filter(pk__in=brands_id)
        brands_id = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).values_list('id_brand')
        brands_id = [x[0] for x in brands_id]
        brands = Brands.objects.filter(pk__in=brands_id).order_by('-id_brand')
        return render(request,'DAIManagementApp/edit_advertiser.html',{ 'brands' : brands})

def update_advertiser(request , id_brand =""):
    brand = Brands.objects.get(pk=id_brand)
    advertiser_name = request.POST.get('advertiser_name')
    category = request.POST.get('category')
    advertiser_desc = request.POST.get('advertiser_desc')
    active_0_1 = request.POST.get('active_0_1')
    now = datetime.datetime.now()
    try :
        path = "Advertisers_imgs"
        now_infile = str(now).replace(" ", "_")
        now_infile = now_infile.replace(":", "-")
        filename = advertiser_name+"__"+now_infile+".png"
        handle_uploaded_file(request.FILES['advertiser_logo'], 'static/'+path, filename)
        brand.logo = 'static/'+path+'/'+filename
    except :
        pass
    if advertiser_name != '' :
        brand.brand_name = advertiser_name
    if category != '':
        brand.category = category
    if advertiser_desc != '':
        brand.description = advertiser_desc
    if active_0_1 != '':
        brand.status = active_0_1

    activite = 'Edit Advertirer'
    desc = 'Admin edit advertiser  id: ' + str(brand.id_brand)
    activity = Activity(activity=activite , date=now ,description=desc )
    activity.save()
    brand.save()
    brands = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).filter(status="1").select_related('id_brand').all()
    return redirect('/DAIManagement/views_advertiser/')


def disable(request , id_brand=""):

    if request.method == 'POST':
        now = datetime.datetime.now()
        activite = 'Disable Advertirer'
        desc = 'Admin disable advertiser  id: ' + str(id_brand)
        activity = Activity(activity=activite , date=now ,description=desc )
        activity.save()
        brand = Brands.objects.get(pk=id_brand)
        status = (1+ int(brand.status) ) % 2
        brand.status = str(status)
        brand.save()

    # brands_id = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).select_related('id_brand').all()
    # brands = Brands.objects.filter(pk__in=brands_id).order_by('-id_brand')

    brands_id = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).values_list('id_brand')
    brands_id = [x[0] for x in brands_id]
    brands = Brands.objects.filter(pk__in=brands_id).order_by('-id_brand')

    return render(request,'DAIManagementApp/disable_advertiser.html',{ 'brands' : brands})



def add_creative(request):
    if request.method =='POST':
        # channel_id = request.POST.get('channel_id')



        advertiser_id = request.POST.get('advertiser_id')
        adspot_name = request.POST.get('adspot_name')
        adspot_duration = request.POST.get('adspot_duration')
        active_0_1 = request.POST.get('active_0_1')
        now = datetime.datetime.now()
        now_infile = str(now).replace(" ", "_")
        now_infile = now_infile.replace(":", "-")


        channel_list = request.POST.getlist('channel_id')
        if channel_list != None:
            for channel in channel_list:
                path = "adspots/user_"+str(request.session['id_user'])+"/ch_"+str(channel)
                if not os.path.exists("static/"+path):
                    os.makedirs("static/"+path)

                new_now_infile = now_infile.replace(".","-")
                filename = request.FILES['adspot_file'].name
                # filename = "ch_"+str(channel)+"__"+slugify(adspot_name)+"__"+str(adspot_duration)+"sec__"+new_now_infile+".ts"
                handle_uploaded_file(request.FILES['adspot_file'], "static/"+path, filename)
                creative = Adspots(id_channel_id=channel ,id_brand_id=advertiser_id, adspot_name=adspot_name, duration=adspot_duration, status=active_0_1, original_filepath=path+'/'+filename ,  datetime=now,filename=filename)
                creative.save()

                channel_name = Channels.objects.get(pk=channel)
                DST_FOLDER = channel_name.channel_name +'/'+'spots'
                SRC_FILEPATH = "static/"+path+'/'+ filename
                send_adspot(DST_FOLDER,SRC_FILEPATH)

        activite = 'Add Creative'
        desc = 'Admin Add creative  id: ' + str(creative.id_brand)
        activity = Activity(activity=activite , date=now ,description=desc )
        activity.save()

        return redirect("/DAIManagement/edit_creative/")
    else:
        channels=Channels.objects.filter(id_user=request.session['id_user'])
        advertisers = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).filter(status="1").select_related('id_brand').all()
        return render(request, "DAIManagementApp/add_creative.html" ,{'data':{'channels':channels, 'advertisers':advertisers}})


def edit_creative(request , id_adpost="1"):
    if request.method =='POST':
        adpost = Adspots.objects.get(pk=id_adpost)

        channels=Channels.objects.filter(id_user=request.session['id_user']).order_by('-id_channel')
        advertisers = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).filter(status="1").select_related('id_brand').all().order_by('-id_user_advertiser')

        adspost = {'adspost' : adpost,
                    'channels': channels,
                    'advertisers': advertisers}

        return render(request, "DAIManagementApp/edit_creative_id.html", adspost)
    else :
        print(request.method)
        id_session = str(request.session['id_user'])
        channels = Channels.objects.filter(id_user=id_session).order_by('-id_channel').values_list('id_channel',flat=True)
        brands = UsersAdvertisers.objects.filter(id_user=id_session).order_by('-id_user_advertiser').values_list('id_brand',flat=True)
        adspots = Adspots.objects.filter(id_channel__in=channels).filter(id_brand__in=brands).order_by('-id_adpost')
        data = {'adspots': adspots}
        return render(request , "DAIManagementApp/edit_creative.html", data)

def update(request , id_adpost  ):
    if request.method == "POST":
        creative = Adspots.objects.get(pk=id_adpost)

        channel_id = request.POST.get('channel_id')
        advertiser_id = request.POST.get('advertiser_id')
        adspot_name = request.POST.get('adspot_name')
        adspot_duration = request.POST.get('adspot_duration')
        active_0_1 = request.POST.get('active_0_1')
        now = datetime.datetime.now()

        now_infile = str(now).replace(" ", "_")
        now_infile = now_infile.replace(":", "-")
        path = "adspots/user_"+str(request.session['id_user'])+"/ch_"+str(channel_id)
        filename = "ch_"+str(channel_id)+"__"+slugify(adspot_name)+"__"+str(adspot_duration)+"sec__"+now_infile+".ts"
        filename_m3u8 = "ch_"+str(channel_id)+"__"+adspot_name+"__"+str(adspot_duration)+"sec__"+now_infile+".m3u8"
        if not os.path.exists("static/"+path):
            print("path not  exist")
            os.makedirs("static/"+path)
        else :
            print("path exist ")
        print(str(request))
        print("static/"+str(creative.original_filepath) + "  test file " )


        try :
            handle_uploaded_file(request.FILES['adspot_file'], "static/"+path, filename)
            f = open("static/"+path+"/"+filename_m3u8, "a")
            f.write("#EXTM3U \n")
            f.write("#EXT-X-VERSION:3 \n")
            f.write("#EXT-X-MEDIA-SEQUENCE:0 \n")
            f.write("#EXTINF:"+adspot_duration+", \n")
            f.write(filename)
            f.close()
        except :
            import shutil
            if os.path.exists("static/"+ creative.original_filepath):
                shutil.move("static/"+ creative.original_filepath, "static/"+path+"/"+filename)

        creative.original_filepath = path+"/"+filename

        channel_name = Channels.objects.get(pk=channel_id)
        DST_FOLDER = channel_name.channel_name +'/'+'spots'
        SRC_FILEPATH = "static/"+path+'/'+ filename
        send_adspot(DST_FOLDER,SRC_FILEPATH)

        # if creative.id_channel.id_channel != channel_id:
        #     creative.id_channel = Channels.objects.get(pk=channel_id)
        # elif creative.id_brand.id_brand != int(advertiser_id):
        #     creative.id_brand == Brands.objects.get(pk=advertiser_id)
        # elif creative.adspot_name!=adspot_name:
        #     print("inside if")
        #     creative.adspot_namea=adspot_name
        #
        # elif bool(adspot_duration) and creative.duration!=adspot_duration :
        #     creative.duration=adspot_duration
        # elif creative.status!=active_0_1:
        #     creative.status=active_0_1

        creative.id_channel = Channels.objects.get(pk=channel_id)
        creative.id_brand == Brands.objects.get(pk=advertiser_id)
        creative.adspot_name=adspot_name
        creative.duration=adspot_duration
        creative.status=active_0_1
        creative.datetime=now

        activite = 'Edit Creative'
        desc = 'Admin Edit creative  id: ' + str(creative.id_brand)
        activity = Activity(activity=activite , date=now ,description=desc )
        activity.save()

        creative.save()
        return redirect("/DAIManagement/edit_creative/")

def views_creative(request):
    adspots = Adspots.objects.all().order_by('-id_post')
    return render(request , 'DAIManagementApp/views_creative.html',{'adspots':adspots})

# def new_playlist(request):
#     if request.method == 'POST':
#         useraccess = Useraccess.objects.get(id_user=request.session['id_user'])
#         channel_id = request.POST.get('channel_id')
#         channeldata = Channels.objects.get(id_channel=channel_id)
#         zonename = request.POST.get('zonename')
#         daydate = request.POST.get('day')
#         number_of_windows = request.POST.get('numofwin')
#         channel_zone = ChannelsZone.objects.get(id_channel=channel_id, zonename=zonename)
#
#         daydate = datetime.datetime.strptime(str(daydate), '%m/%d/%Y')
#         daydate = daydate.strftime('%Y-%m-%d')
#         start_date = str(daydate) + "T00:01:00+00:00"
#         end_date = str(daydate) + "T23:59:00+00:00"
#         now = datetime.datetime.now()
#         Playlist = Playlists(id_channel_id=channel_id ,version="1", broadcastdate=str(daydate), start_date=start_date, end_date=end_date, creation_datetime=now, id_zone_channel_id=channel_zone.id_zone_channel)
#         Playlist.save()
#         traffic = 0
#         record_inserted = 0
#         for i in range(int(number_of_windows)):
#             if request.POST.get('numofavails['+str(i)+']'):
#                 numofavails = request.POST.get('numofavails['+str(i)+']')
#                 window_start = request.POST.get('windowstart['+str(i)+']')
#                 window_start = daydate+' '+window_start+':00'
#                 window_end = request.POST.get('windowend['+str(i)+']')
#                 window_end = daydate+' '+window_end+':00'
#                 FMT = '%Y-%m-%d %H:%M:%S'
#                 window_duration = datetime.datetime.strptime(window_end, FMT) - datetime.datetime.strptime(window_start, FMT)
#                 window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
#                 window_duration = window_duration.strftime('%H%M%S00')
#                 Window = Windows(id_playlist_id=Playlist.id_playlist, window_start=window_start, window_end=window_end, window_duration=window_duration )
#                 Window.save()
#
#                 for j in range(int(numofavails)):
#                     if request.POST.get('availstart['+str(i)+']['+str(j)+']'):
#                         av_start = request.POST.get('availstart['+str(i)+']['+str(j)+']')
#                         av_start = daydate+' '+av_start+':00'
#                         number_of_ads = request.POST.get('numofads['+str(i)+']['+str(j)+']')
#                         Avail = Avails(id_window_id=Window.id_window, avail_start=av_start, availinwindow=str(j+1), datetime=now )
#                         Avail.save()
#
#                         for k in range(int(number_of_ads)):
#                             if request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']'):
#                                 adspot = request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']')
#                                 traffic +=1
#                                 AdspotsInAv = AdspotsInAvail(id_avail_id=Avail.id_avail, id_adspot_id=adspot, positioninavail=str(k+1), trafficid=traffic)
#                                 AdspotsInAv.save()
#                                 record_inserted = 1
#
#         xmlfilename = GenerateXMLfromDatabase(daydate, channel_id, channel_zone.id_zone_channel, '1' )
#         path_inftp = channeldata.ftp_channel_name+'/schedules/'+channel_zone.region
#         uploadFTP(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)
#         channels = Channels.objects.filter(id_user=request.session['id_user'])
#         return render(request, "DAIManagementApp/new_playlist.html",{'data': {'channels': channels},'record_inserted': record_inserted})
#     else:
#         channels = Channels.objects.filter(id_user=request.session['id_user'])
#         return render(request, "DAIManagementApp/new_playlist.html",{'data': {'channels': channels}})


def new_playlist_old(request):
    if request.method == 'POST':

        useraccess = Useraccess.objects.get(id_user=request.session['id_user'])
        channel_id = request.POST.get('channel_id')
        channeldata = Channels.objects.get(id_channel=channel_id)
        zonename = request.POST.get('zonename')
        daydate = request.POST.get('day')
        number_of_windows = request.POST.get('numofwin')
        channel_zone = ChannelsZone.objects.get(id_channel=channel_id, zonename=zonename)

        daydate = datetime.datetime.strptime(str(daydate), '%m/%d/%Y')
        daydate = daydate.strftime('%Y-%m-%d')
        start_date = str(daydate) + "T00:01:00+00:00"
        end_date = str(daydate) + "T23:59:00+00:00"
        now = datetime.datetime.now()
        Playlist = Playlists(id_channel_id=channel_id ,version="1", broadcastdate=str(daydate), start_date=start_date, end_date=end_date, creation_datetime=now, id_zone_channel_id=channel_zone.id_zone_channel)
        Playlist.save()
        traffic = 0
        # starts =[]
        for i in range(int(number_of_windows)):
            number_of_ads = request.POST.get('numofads['+str(i)+']')
            if request.POST.get('numofads['+str(i)+']'):
                number_of_ads = request.POST.get('numofads['+str(i)+']')
                window_start = request.POST.get('windowstart['+str(i)+']')
                window_start = daydate+' '+window_start+':00'
                window_end = request.POST.get('windowend['+str(i)+']')
                window_end = daydate+' '+window_end+':00'
                FMT = '%Y-%m-%d %H:%M:%S'
                window_duration = datetime.datetime.strptime(window_end, FMT) - datetime.datetime.strptime(window_start, FMT)
                window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
                window_duration = window_duration.strftime('%H%M%S00')

                Window = Windows(id_playlist_id=Playlist.id_playlist, window_start=window_start, window_end=window_end, window_duration=window_duration )
                Window.save()
                Avail = Avails(id_window_id=Window.id_window, avail_start=window_start, availinwindow='1', datetime=now )
                Avail.save()
                for j in range(int(number_of_ads)):
                    if request.POST.get('ad['+str(i)+']['+str(j)+']'):
                        adspot = request.POST.get('ad['+str(i)+']['+str(j)+']')
                        traffic +=1
                        AdspotsInAv = AdspotsInAvail(id_avail_id=Avail.id_avail, id_adspot_id=adspot, positioninavail=str(j+1), trafficid=traffic)
                        AdspotsInAv.save()
        xmlfilename = GenerateXMLfromDatabase(daydate, channel_id, channel_zone.id_zone_channel, '1' )
        path_inftp = channeldata.ftp_channel_name+'/schedules/'+channel_zone.region
        uploadFTP(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)
        # channels = Channels.objects.filter(id_user=request.session['id_user'])
        return render(request, "DAIManagementApp/new_playlist.html")
    else:
        channels = Channels.objects.filter(id_user=request.session['id_user'])
        return render(request, "DAIManagementApp/new_playlist.html",{'data': {'channels': channels}})


def load_adspots(request):
    channel_id = request.GET.get('channel')
    adspots = Adspots.objects.filter(id_channel=channel_id).select_related('id_brand').all()

    return render(request, 'DAIManagementApp/dropdown_adspots.html', {'adspots': adspots})

def load_regions(request):
    channel_id = request.GET.get('channel')
    regions = ChannelsZone.objects.filter(id_channel=channel_id)
    return render(request,'DAIManagementApp/dropdown_region.html',{'regions': regions})

def load_playlistdays(request):
    channel_id = request.GET.get('channel')
    region_id = request.GET.get('region_id')

    # playlist = Playlists.objects.filter(id_channel=channel_id)
    return render(request,'DAIManagementApp/dropdown_region.html',{'regions': regions})



def edit_playlist_old(request,id_playlist="1"):
    if request.method == 'POST':
        playlist = Playlists.objects.get(pk=id_playlist)
        channels = Channels.objects.filter(id_user=request.session['id_user'])
        region = ChannelsZone.objects.get(id_zone_channel=playlist.id_zone_channel.id_zone_channel)
        d = playlist.broadcastdate

        windows = Windows.objects.filter(id_playlist=playlist.id_playlist)

        win = Windows.objects.filter(id_playlist=playlist.id_playlist).values_list('id_window', flat=True)
        avails = Avails.objects.filter(id_window__in=win).values_list('id_avail', flat=True)
        av = Avails.objects.filter(id_window__in=win);
        adspots = AdspotsInAvail.objects.filter(id_avail__in=avails)

        data = {'playlist': playlist, 'channels': channels,'region':region,'d':d,'windows':windows,'adspots':adspots, 'av':av }
        return render(request, "DAIManagementApp/edit_playlist_id.html", data)
    else:
        id_session = str(request.session['id_user'])
        channels = Channels.objects.filter(id_user=id_session).values_list('id_channel', flat=True)
        playlists = Playlists.objects.filter(id_channel__in=channels).order_by('-id_playlist')
        data = {'playlists': playlists}
        return render(request, "DAIManagementApp/edit_playlist.html",data)



def new_playlist(request):
    if request.method == 'POST':
        apply_btn = request.POST.get("apply_btn")
        draft_btn = request.POST.get("draft_btn")
        if(apply_btn):
            useraccess = Useraccess.objects.get(id_user=request.session['id_user'])
            channel_id = request.POST.get('channel_id')
            channeldata = Channels.objects.get(id_channel=channel_id)
            zonename = request.POST.get('zonename')
            daydate = request.POST.get('day')
            number_of_windows = request.POST.get('numofwin')
            channel_zone = ChannelsZone.objects.get(id_channel=channel_id, zonename=zonename)
            draft_version = request.POST.get('draft_version')

            daydate = datetime.datetime.strptime(str(daydate), '%m/%d/%Y')
            daydate = daydate.strftime('%Y-%m-%d')
            start_date = str(daydate) + "T00:01:00+00:00"
            end_date = str(daydate) + "T23:59:00+00:00"
            now = datetime.datetime.now()
            Playlist = Playlists(id_channel_id=channel_id ,version="1", broadcastdate=str(daydate), start_date=start_date, end_date=end_date, creation_datetime=now, id_zone_channel_id=channel_zone.id_zone_channel,is_draft='0',draft_version='0')
            Playlist.save()
            traffic = 0
            record_inserted = 0
            for i in range(int(number_of_windows)):
                if request.POST.get('numofavails['+str(i)+']'):
                    numofavails = request.POST.get('numofavails['+str(i)+']')
                    window_start = request.POST.get('windowstart['+str(i)+']')
                    window_start = daydate+' '+window_start+':00'
                    window_end = request.POST.get('windowend['+str(i)+']')
                    window_end = daydate+' '+window_end+':00'
                    FMT = '%Y-%m-%d %H:%M:%S'
                    window_duration = datetime.datetime.strptime(window_end, FMT) - datetime.datetime.strptime(window_start, FMT)
                    window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
                    window_duration = window_duration.strftime('%H%M%S00')
                    Window = Windows(id_playlist_id=Playlist.id_playlist, window_start=window_start, window_end=window_end, window_duration=window_duration )
                    Window.save()

                    for j in range(int(numofavails)):
                        if request.POST.get('availstart['+str(i)+']['+str(j)+']'):
                            av_start = request.POST.get('availstart['+str(i)+']['+str(j)+']')
                            av_start = daydate+' '+av_start+':00'
                            number_of_ads = request.POST.get('numofads['+str(i)+']['+str(j)+']')
                            Avail = Avails(id_window_id=Window.id_window, avail_start=av_start, availinwindow=str(j+1), datetime=now )
                            Avail.save()

                            for k in range(int(number_of_ads)):
                                if request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']'):
                                    adspot = request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']')
                                    traffic +=1
                                    AdspotsInAv = AdspotsInAvail(id_avail_id=Avail.id_avail, id_adspot_id=adspot, positioninavail=str(k+1), trafficid=traffic)
                                    AdspotsInAv.save()

            print(channel_zone.id_zone_channel)
            xmlfilename = GenerateXMLfromDatabase(daydate, channel_id, channel_zone.id_zone_channel, '1',Playlist.draft_version)
            path_inftp = channeldata.ftp_channel_name+'/schedules/'+channel_zone.region
            uploadFTP(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)
            last_id_playlist = Playlist.id_playlist
            now = datetime.datetime.now()
            activite = 'Add PlayList'
            desc = 'Admin Add PlayList  id: ' + str(Playlist.id_playlist)
            activity = Activity(activity=activite , date=now ,description=desc )
            activity.save()

            ############ Display data on view_playlist_id page ##################
            return redirect('view_playlist', id_playlist=last_id_playlist)
        else:
            useraccess = Useraccess.objects.get(id_user=request.session['id_user'])
            channel_id = request.POST.get('channel_id')
            channeldata = Channels.objects.get(id_channel=channel_id)
            zonename = request.POST.get('zonename')
            daydate = request.POST.get('day')
            number_of_windows = request.POST.get('numofwin')
            channel_zone = ChannelsZone.objects.get(id_channel=channel_id, zonename=zonename)

            daydate = datetime.datetime.strptime(str(daydate), '%m/%d/%Y')
            daydate = daydate.strftime('%Y-%m-%d')
            start_date = str(daydate) + "T00:01:00+00:00"
            end_date = str(daydate) + "T23:59:00+00:00"
            now = datetime.datetime.now()
            Playlist = Playlists(id_channel_id=channel_id ,version="1", broadcastdate=str(daydate), start_date=start_date, end_date=end_date, creation_datetime=now, id_zone_channel_id=channel_zone.id_zone_channel,is_draft='1',draft_version='1')
            Playlist.save()
            traffic = 0
            record_inserted = 0
            for i in range(int(number_of_windows)):
                if request.POST.get('numofavails['+str(i)+']'):
                    numofavails = request.POST.get('numofavails['+str(i)+']')
                    window_start = request.POST.get('windowstart['+str(i)+']')
                    window_start = daydate+' '+window_start+':00'
                    window_end = request.POST.get('windowend['+str(i)+']')
                    window_end = daydate+' '+window_end+':00'
                    FMT = '%Y-%m-%d %H:%M:%S'
                    window_duration = datetime.datetime.strptime(window_end, FMT) - datetime.datetime.strptime(window_start, FMT)
                    window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
                    window_duration = window_duration.strftime('%H%M%S00')
                    Window = Windows(id_playlist_id=Playlist.id_playlist, window_start=window_start, window_end=window_end, window_duration=window_duration )
                    Window.save()

                    for j in range(int(numofavails)):
                        if request.POST.get('availstart['+str(i)+']['+str(j)+']'):
                            av_start = request.POST.get('availstart['+str(i)+']['+str(j)+']')
                            av_start = daydate+' '+av_start+':00'
                            number_of_ads = request.POST.get('numofads['+str(i)+']['+str(j)+']')
                            Avail = Avails(id_window_id=Window.id_window, avail_start=av_start, availinwindow=str(j+1), datetime=now )
                            Avail.save()

                            for k in range(int(number_of_ads)):
                                if request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']'):
                                    adspot = request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']')
                                    traffic +=1
                                    AdspotsInAv = AdspotsInAvail(id_avail_id=Avail.id_avail, id_adspot_id=adspot, positioninavail=str(k+1), trafficid=traffic)
                                    AdspotsInAv.save()
            # xmlfilename = GenerateXMLfromDatabase(daydate, channel_id, channel_zone.id_zone_channel, '1' )
            # path_inftp = channeldata.ftp_channel_name+'/schedules/'+channel_zone.region
            # uploadFTP(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)
            last_id_playlist = Playlist.id_playlist

            ############ Display data on view_playlist_id page ##################
            return redirect('draft_playlist')
    else:
        channels = Channels.objects.filter(id_user=request.session['id_user'])
        return render(request, "DAIManagementApp/new_playlist.html",{'data': {'channels': channels}})



def edit_playlist(request,id_playlist="1"):
    if request.method == 'POST':
        edit_btn = request.POST.get("edit_btn")
        view_btn = request.POST.get("view_btn")
        insertion_results_btn = request.POST.get("insertion_results_btn")
        duplicate_btn = request.POST.get("duplicate_btn")
        draft_btn = request.POST.get("draft_btn")
        if(edit_btn):
            playlist = Playlists.objects.get(pk=id_playlist)
            channels = Channels.objects.filter(id_user=request.session['id_user'])
            region = ChannelsZone.objects.get(id_zone_channel=playlist.id_zone_channel.id_zone_channel)
            d = playlist.broadcastdate

            win = Windows.objects.filter(id_playlist=playlist.id_playlist).values_list('id_window', flat=True)

            data = {}
            data["windows"] = []
            data["number_of_wins"] = 0
            i = 0

            windows = Windows.objects.filter(id_playlist=playlist.id_playlist).order_by('window_start')
            for window in windows:
                window_dic = {}
                window_dic['i'] = i
                i = i+1
                window_dic['id_window'] = window.id_window
                window_start_formated = datetime.datetime.strptime(window.window_start, '%Y-%m-%d %H:%M:%S')
                window_start_formated_2 = window_start_formated.strftime("%H:%M")
                window_end_formated = datetime.datetime.strptime(window.window_end, '%Y-%m-%d %H:%M:%S')
                window_end_formated_2 = window_end_formated.strftime("%H:%M")
                window_dic['window_start'] = window_start_formated_2
                window_dic['window_end'] = window_end_formated_2
                window_dic['avails_in_win'] = []
                window_dic['num_of_avails'] = 0
                data["number_of_wins"] = i
                avails = Avails.objects.filter(id_window=window.id_window)
                j = 0
                for avail in avails:
                    avail_dic = {}
                    avail_dic["j"] = j
                    j = j+1
                    avail_dic["id_avail"] = avail.id_avail
                    avail_start_formated = datetime.datetime.strptime(avail.avail_start, '%Y-%m-%d %H:%M:%S')
                    avail_start_formated2 = avail_start_formated.strftime("%H:%M")
                    avail_dic["avail_start"] = avail_start_formated2
                    avail_dic["adspots_in_avail"] = []
                    window_dic["avails_in_win"].append(avail_dic)
                    adspots = AdspotsInAvail.objects.filter(id_avail=avail.id_avail)
                    window_dic['num_of_avails'] = j
                    k = 0
                    avail_dic["num_of_adspots"] = 0
                    for adspot in adspots:
                        adspot_dic = {}
                        adspot_dic["k"] = k
                        k = k+1
                        avail_dic["num_of_adspots"] = k
                        adspot_dic["id_adsinavail"] = adspot.id_adsinavail
                        adspot_dic["id_adspot"] = adspot.id_adspot
                        avail_dic["adspots_in_avail"].append(adspot_dic)
                data["windows"].append(window_dic)


            now = datetime.datetime.now()
            activite = 'Edit PlayList'
            desc = 'Admin Edit PlayList  id: ' + str(playlist.id_playlist)
            activity = Activity(activity=activite , date=now ,description=desc )
            activity.save()

            data_playlist = {'data':data["windows"],'playlist': playlist, 'channels': channels,'region':region,'d':d,'number_of_wins':data["number_of_wins"]}
            return render(request, "DAIManagementApp/edit_playlist_id.html", data_playlist)
        elif(duplicate_btn):
            playlist = Playlists.objects.get(pk=id_playlist)
            channels = Channels.objects.filter(id_user=request.session['id_user'])
            region = ChannelsZone.objects.get(id_zone_channel=playlist.id_zone_channel.id_zone_channel)
            d = playlist.broadcastdate

            win = Windows.objects.filter(id_playlist=playlist.id_playlist).values_list('id_window', flat=True)

            data = {}
            data["windows"] = []
            data["number_of_wins"] = 0
            i = 0

            windows = Windows.objects.filter(id_playlist=playlist.id_playlist)
            for window in windows:
                window_dic = {}
                window_dic['i'] = i
                i = i+1
                window_dic['id_window'] = window.id_window
                window_start_formated = datetime.datetime.strptime(window.window_start, '%Y-%m-%d %H:%M:%S')
                window_start_formated_2 = window_start_formated.strftime("%H:%M")
                window_end_formated = datetime.datetime.strptime(window.window_end, '%Y-%m-%d %H:%M:%S')
                window_end_formated_2 = window_end_formated.strftime("%H:%M")
                window_dic['window_start'] = window_start_formated_2
                window_dic['window_end'] = window_end_formated_2
                window_dic['avails_in_win'] = []
                window_dic['num_of_avails'] = 0
                data["number_of_wins"] = i
                avails = Avails.objects.filter(id_window=window.id_window)
                j = 0
                for avail in avails:
                    avail_dic = {}
                    avail_dic["j"] = j
                    j = j+1
                    avail_dic["id_avail"] = avail.id_avail
                    avail_start_formated = datetime.datetime.strptime(avail.avail_start, '%Y-%m-%d %H:%M:%S')
                    avail_start_formated2 = avail_start_formated.strftime("%H:%M")
                    avail_dic["avail_start"] = avail_start_formated2
                    avail_dic["adspots_in_avail"] = []
                    window_dic["avails_in_win"].append(avail_dic)
                    adspots = AdspotsInAvail.objects.filter(id_avail=avail.id_avail)
                    window_dic['num_of_avails'] = j
                    k = 0
                    avail_dic["num_of_adspots"] = 0
                    for adspot in adspots:
                        adspot_dic = {}
                        adspot_dic["k"] = k
                        k = k+1
                        avail_dic["num_of_adspots"] = k
                        adspot_dic["id_adsinavail"] = adspot.id_adsinavail
                        adspot_dic["id_adspot"] = adspot.id_adspot
                        avail_dic["adspots_in_avail"].append(adspot_dic)
                data["windows"].append(window_dic)


            data_playlist = {'data':data["windows"],'playlist': playlist, 'channels': channels,'region':region,'d':d,'number_of_wins':data["number_of_wins"]}
            return render(request, "DAIManagementApp/duplicate_playlist_id.html", data_playlist)
        elif(view_btn):
            return redirect('view_playlist', id_playlist=id_playlist)
        else:
            return redirect('insertion_results', id_playlist=id_playlist)
    else:
        now = datetime.datetime.now() - timedelta(days=30)
        id_session = str(request.session['id_user'])
        channels = Channels.objects.filter(id_user=id_session).values_list('id_channel', flat=True)
        playlists = Playlists.objects.filter(id_channel__in=channels,is_draft='0',start_date__gte=now).order_by('-broadcastdate')
        windows= Windows.objects.filter(id_playlist__in=playlists)
        details = []
        for window in windows :
            detail = {}
            detail["id_playlist"]=window.id_playlist.id_playlist
            broadcastDate_verif = str(window.window_start).split(' ')[0]
            broadcastDate_verif = broadcastDate_verif.replace('-','')
            detail["window_start"] = str(window.window_start).split(' ')[1]
            detail["window_end"] = str(window.window_end).split(' ')[1]
            avails = Avails.objects.filter(id_window=window)
            detail["avails"] = []
            for avail in avails:
                av = {}
                av['start']= str(avail.avail_start).split(' ')[1]
                AdspotsInAv = AdspotsInAvail.objects.filter(id_avail=avail)
                for adspot in AdspotsInAv:
                    av["adspot"] = AdspotsInAvail.objects.filter(id_avail=avail)
                    try:
                        result = Verifs.objects.filter(broadcastDate = broadcastDate_verif, trafficId = adspot.trafficid).latest('id_verif')
                        av["adspotname"] = adspot.id_adspot.adspot_name
                        av["airStatusCode"] = result.airStatuscode
                        av["airTime"] = result.airTime
                    except Verifs.DoesNotExist:
                        print('oups')
                    else:
                        print("file not ready yet")
                detail["avails"].append(av)
            details.append(detail)


        data = {'playlists': playlists , 'details':details}
        return render(request, "DAIManagementApp/edit_playlist.html",data)



def edit_older_playlist(request,id_playlist="1"):
    if request.method == 'POST':
        edit_btn = request.POST.get("edit_btn")
        view_btn = request.POST.get("view_btn")
        insertion_results_btn = request.POST.get("insertion_results_btn")
        duplicate_btn = request.POST.get("duplicate_btn")
        draft_btn = request.POST.get("draft_btn")
        if(edit_btn):
            playlist = Playlists.objects.get(pk=id_playlist)
            channels = Channels.objects.filter(id_user=request.session['id_user'])
            region = ChannelsZone.objects.get(id_zone_channel=playlist.id_zone_channel.id_zone_channel)
            d = playlist.broadcastdate

            win = Windows.objects.filter(id_playlist=playlist.id_playlist).values_list('id_window', flat=True)

            data = {}
            data["windows"] = []
            data["number_of_wins"] = 0
            i = 0

            windows = Windows.objects.filter(id_playlist=playlist.id_playlist).order_by('window_start')
            for window in windows:
                window_dic = {}
                window_dic['i'] = i
                i = i+1
                window_dic['id_window'] = window.id_window
                window_start_formated = datetime.datetime.strptime(window.window_start, '%Y-%m-%d %H:%M:%S')
                window_start_formated_2 = window_start_formated.strftime("%H:%M")
                window_end_formated = datetime.datetime.strptime(window.window_end, '%Y-%m-%d %H:%M:%S')
                window_end_formated_2 = window_end_formated.strftime("%H:%M")
                window_dic['window_start'] = window_start_formated_2
                window_dic['window_end'] = window_end_formated_2
                window_dic['avails_in_win'] = []
                window_dic['num_of_avails'] = 0
                data["number_of_wins"] = i
                avails = Avails.objects.filter(id_window=window.id_window)
                j = 0
                for avail in avails:
                    avail_dic = {}
                    avail_dic["j"] = j
                    j = j+1
                    avail_dic["id_avail"] = avail.id_avail
                    avail_start_formated = datetime.datetime.strptime(avail.avail_start, '%Y-%m-%d %H:%M:%S')
                    avail_start_formated2 = avail_start_formated.strftime("%H:%M")
                    avail_dic["avail_start"] = avail_start_formated2
                    avail_dic["adspots_in_avail"] = []
                    window_dic["avails_in_win"].append(avail_dic)
                    adspots = AdspotsInAvail.objects.filter(id_avail=avail.id_avail)
                    window_dic['num_of_avails'] = j
                    k = 0
                    avail_dic["num_of_adspots"] = 0
                    for adspot in adspots:
                        adspot_dic = {}
                        adspot_dic["k"] = k
                        k = k+1
                        avail_dic["num_of_adspots"] = k
                        adspot_dic["id_adsinavail"] = adspot.id_adsinavail
                        adspot_dic["id_adspot"] = adspot.id_adspot
                        avail_dic["adspots_in_avail"].append(adspot_dic)
                data["windows"].append(window_dic)


            now = datetime.datetime.now()
            activite = 'Edit PlayList'
            desc = 'Admin Edit PlayList  id: ' + str(playlist.id_playlist)
            activity = Activity(activity=activite , date=now ,description=desc )
            activity.save()

            data_playlist = {'data':data["windows"],'playlist': playlist, 'channels': channels,'region':region,'d':d,'number_of_wins':data["number_of_wins"]}
            return render(request, "DAIManagementApp/edit_playlist_id.html", data_playlist)
        elif(duplicate_btn):
            playlist = Playlists.objects.get(pk=id_playlist)
            channels = Channels.objects.filter(id_user=request.session['id_user'])
            region = ChannelsZone.objects.get(id_zone_channel=playlist.id_zone_channel.id_zone_channel)
            d = playlist.broadcastdate

            win = Windows.objects.filter(id_playlist=playlist.id_playlist).values_list('id_window', flat=True)

            data = {}
            data["windows"] = []
            data["number_of_wins"] = 0
            i = 0

            windows = Windows.objects.filter(id_playlist=playlist.id_playlist)
            for window in windows:
                window_dic = {}
                window_dic['i'] = i
                i = i+1
                window_dic['id_window'] = window.id_window
                window_start_formated = datetime.datetime.strptime(window.window_start, '%Y-%m-%d %H:%M:%S')
                window_start_formated_2 = window_start_formated.strftime("%H:%M")
                window_end_formated = datetime.datetime.strptime(window.window_end, '%Y-%m-%d %H:%M:%S')
                window_end_formated_2 = window_end_formated.strftime("%H:%M")
                window_dic['window_start'] = window_start_formated_2
                window_dic['window_end'] = window_end_formated_2
                window_dic['avails_in_win'] = []
                window_dic['num_of_avails'] = 0
                data["number_of_wins"] = i
                avails = Avails.objects.filter(id_window=window.id_window)
                j = 0
                for avail in avails:
                    avail_dic = {}
                    avail_dic["j"] = j
                    j = j+1
                    avail_dic["id_avail"] = avail.id_avail
                    avail_start_formated = datetime.datetime.strptime(avail.avail_start, '%Y-%m-%d %H:%M:%S')
                    avail_start_formated2 = avail_start_formated.strftime("%H:%M")
                    avail_dic["avail_start"] = avail_start_formated2
                    avail_dic["adspots_in_avail"] = []
                    window_dic["avails_in_win"].append(avail_dic)
                    adspots = AdspotsInAvail.objects.filter(id_avail=avail.id_avail)
                    window_dic['num_of_avails'] = j
                    k = 0
                    avail_dic["num_of_adspots"] = 0
                    for adspot in adspots:
                        adspot_dic = {}
                        adspot_dic["k"] = k
                        k = k+1
                        avail_dic["num_of_adspots"] = k
                        adspot_dic["id_adsinavail"] = adspot.id_adsinavail
                        adspot_dic["id_adspot"] = adspot.id_adspot
                        avail_dic["adspots_in_avail"].append(adspot_dic)
                data["windows"].append(window_dic)


            data_playlist = {'data':data["windows"],'playlist': playlist, 'channels': channels,'region':region,'d':d,'number_of_wins':data["number_of_wins"]}
            return render(request, "DAIManagementApp/duplicate_playlist_id.html", data_playlist)
        elif(view_btn):
            return redirect('view_playlist', id_playlist=id_playlist)
        else:
            return redirect('insertion_results', id_playlist=id_playlist)
    else:
        now = datetime.datetime.now() - timedelta(days=30)
        id_session = str(request.session['id_user'])
        channels = Channels.objects.filter(id_user=id_session).values_list('id_channel', flat=True)
        playlists = Playlists.objects.filter(id_channel__in=channels,is_draft='0',start_date__lte=now).order_by('-broadcastdate')

        data = {'playlists': playlists}
        return render(request, "DAIManagementApp/edit_older_playlist.html",data)

def insertion_results(request,id_playlist):
    playlist = Playlists.objects.get(pk=id_playlist)
    channels = Channels.objects.get(id_channel=playlist.id_channel.id_channel)
    region = ChannelsZone.objects.get(id_zone_channel=playlist.id_zone_channel.id_zone_channel)
    ftp_channel_name = channels.ftp_channel_name
    networkname = channels.networkname
    zonename = region.zonename
    broadcastdate = playlist.broadcastdate.replace("-","")
    result = Verifs.objects.filter(networkname=networkname,zonename=zonename,broadcastDate=broadcastdate).last()
    d = playlist.broadcastdate
    broadcastDate_verif = str(playlist.broadcastdate).replace("-","")
    win = Windows.objects.filter(id_playlist=playlist.id_playlist).values_list('id_window', flat=True)
    data = {}
    data["windows"] = []
    data["number_of_wins"] = 0
    i = 0
    record_inserted = 0
    if(result):
        verComplete = result.vercomplete
    else:
        verComplete = "false"
    if verComplete == "false":
    # if true:
        print("Wait I'm in ftp")
        filename_in_ftp = broadcastdate+"-"+zonename+"-00001.ver"
        path_in_ftp = "/"+ftp_channel_name+"/verifs/"
        path_in_app = "files/results/"+ftp_channel_name+"/verifs"
        if not os.path.exists(path_in_app):
            os.makedirs(path_in_app)
        # downloadFTP("uk06.tmd.cloud", "testftp@epgsano.com", "I?#=s3FfnSu_", "/2M/schedules/",  "test.txt" , "/var/www/html/DAI-Management/DAIManagement/FTP_files/")
        useraccess = Useraccess.objects.get(id_user=request.session['id_user'])
        print(useraccess)
        downloadFTP(useraccess.ftp_server, useraccess.ftp_user, useraccess.ftp_password, path_in_ftp , filename_in_ftp, path_in_app)
        # def downloadFTP(host, user, password, filepath_inftp, file_inftp,  localpath):
        if Path(path_in_app+'/'+filename_in_ftp).exists():
            doc = xml2.parse(path_in_app+'/'+filename_in_ftp)
            Spots = doc.getElementsByTagName("Spot")
            verComplete = doc.firstChild.getAttribute("verComplete")
            results = []
            for spot in Spots:
                trafficId = spot.getAttribute("trafficId")
                spotId  = spot.getAttribute("spotId")
                airTime = spot.getAttribute("airTime")
                newAirTime = airTime.replace("T", " ")
                newAirTime2 = newAirTime.replace("+02:00", "")
                airLength = spot.getAttribute("airLength")
                airStatusCode = spot.getAttribute("airStatusCode")
                version = spot.getAttribute("revision")
                try:
                    verif_to_update = Verifs.objects.get(networkname=networkname, zonename=zonename, broadcastDate=broadcastdate, trafficId=trafficId, spotId=spotId)
                    if verif_to_update:
                        verif_to_update.airTime = newAirTime2
                        verif_to_update.airLength = airLength
                        verif_to_update.airStatuscode = airStatusCode
                        verif_to_update.revision = version
                        verif_to_update.vercomplete = verComplete
                        verif_to_update.save()
                    else:
                        new_ad_verif = Verifs(networkname=networkname, zonename=zonename, broadcastDate=broadcastdate, trafficId=trafficId, spotId=spotId, airTime=newAirTime2, airLength=airLength, airStatuscode=airStatusCode, revision=version,  vercomplete = verComplete)
                        new_ad_verif.save()
                except Verifs.DoesNotExist:
                    print('oups')
                    new_ad_verif = Verifs(networkname=networkname, zonename=zonename, broadcastDate=broadcastdate, trafficId=trafficId, spotId=spotId, airTime=newAirTime2, airLength=airLength, airStatuscode=airStatusCode, revision=version,  vercomplete = verComplete)
                    new_ad_verif.save()
    windows = Windows.objects.filter(id_playlist=playlist.id_playlist)
    for window in windows:
        window_dic = {}
        window_dic['i'] = i
        i = i+1
        window_dic['id_window'] = window.id_window
        window_start_formated = datetime.datetime.strptime(window.window_start, '%Y-%m-%d %H:%M:%S')
        window_start_formated_2 = window_start_formated.strftime("%H:%M")
        window_end_formated = datetime.datetime.strptime(window.window_end, '%Y-%m-%d %H:%M:%S')
        window_end_formated_2 = window_end_formated.strftime("%H:%M")
        window_dic['window_start'] = window_start_formated_2
        window_dic['window_end'] = window_end_formated_2
        window_dic['avails_in_win'] = []
        window_dic['num_of_avails'] = 0
        data["number_of_wins"] = i
        avails = Avails.objects.filter(id_window=window.id_window)
        j = 0
        for avail in avails:
            avail_dic = {}
            avail_dic["j"] = j
            j = j+1
            avail_dic["id_avail"] = avail.id_avail
            avail_start_formated = datetime.datetime.strptime(avail.avail_start, '%Y-%m-%d %H:%M:%S')
            avail_start_formated2 = avail_start_formated.strftime("%H:%M")
            avail_dic["avail_start"] = avail_start_formated2
            avail_dic["adspots_in_avail"] = []
            window_dic["avails_in_win"].append(avail_dic)
            adspots = AdspotsInAvail.objects.filter(id_avail=avail.id_avail)
            window_dic['num_of_avails'] = j
            k = 0
            avail_dic["num_of_adspots"] = 0
            for adspot in adspots:
                adspot_dic = {}
                adspot_dic["k"] = k
                k = k+1
                avail_dic["num_of_adspots"] = k
                adspot_dic["id_adsinavail"] = adspot.id_adsinavail
                adspot_dic["id_adspot"] = adspot.id_adspot
                print("Wait I'm in database")
                try:
                    result = Verifs.objects.filter(broadcastDate = broadcastDate_verif, trafficId = adspot.trafficid, revision__lte = int(playlist.version)).latest('id_verif')
                    adspot_dic["airStatusCode"] = result.airStatuscode
                    adspot_dic["airTime"] = result.airTime
                except Verifs.DoesNotExist:
                    print('oups')
                else:
                    print("file not ready yet")
                avail_dic["adspots_in_avail"].append(adspot_dic)
        data["windows"].append(window_dic)
        record_inserted = 0
    data_playlist = {'data':data["windows"],'playlist': playlist, 'channels': channels,'region':region,'d':d,'number_of_wins':data["number_of_wins"],'record_inserted':record_inserted}
    return render(request, "DAIManagementApp/insertion_results.html", data_playlist)



def update_playlist(request, id_playlist):
    if request.method == 'POST':
        apply_btn = request.POST.get("apply_btn")
        draft_btn = request.POST.get("draft_btn")
        if(apply_btn):
            id_user = request.session['id_user']
            useraccess = Useraccess.objects.get(id_user=id_user)
            channel_id = request.POST.get('channel_id')
            channeldata = Channels.objects.get(id_channel=channel_id)
            zonename = request.POST.get('zonename')
            daydate = request.POST.get('day')
            number_of_windows = request.POST.get('numofwin')
            #return HttpResponse(number_of_windows)
            channel_zone = ChannelsZone.objects.get(id_channel=channel_id, zonename=zonename)
            version = request.POST.get('version')
            draft_version_old = request.POST.get('draft_version')

            daydate = datetime.datetime.strptime(str(daydate), '%Y-%m-%d')
            daydate = daydate.strftime('%Y-%m-%d')
            start_date = str(daydate) + "T00:01:00+00:00"
            end_date = str(daydate) + "T23:59:00+00:00"
            now = datetime.datetime.now()

            draft_version = request.POST.get('draft_version')

            playlist = Playlists.objects.get(pk=id_playlist)

            version_p = playlist.version
            broadcastdate_p = playlist.broadcastdate
            draft_version_p = playlist.draft_version
            start_date_p = playlist.start_date
            end_date_p = playlist.end_date

            max_version = Playlists.objects.filter(broadcastdate=str(daydate)).aggregate(Max('version')).get('version__max')
            new_version = int(max_version)+1
            Playlist = Playlists(id_channel_id=channel_id ,version=int(max_version)+1, broadcastdate=str(daydate), start_date=start_date, end_date=end_date, creation_datetime=now, id_zone_channel_id=channel_zone.id_zone_channel,is_draft='0',draft_version=draft_version_old)
            Playlist.save()
            traffic = 0
            record_inserted = 0
            var_test = 0
            for i in range(int(number_of_windows)):
                if request.POST.get('numofavails['+str(i)+']'):
                    numofavails = request.POST.get('numofavails['+str(i)+']')
                    window_start = request.POST.get('windowstart['+str(i)+']')
                    window_start = daydate+' '+window_start+':00'
                    window_end = request.POST.get('winend_['+str(i)+']')
                    window_end = daydate+' '+window_end+':00'
                    FMT = '%Y-%m-%d %H:%M:%S'
                    window_duration = datetime.datetime.strptime(window_end, FMT) - datetime.datetime.strptime(window_start, FMT)
                    window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
                    window_duration = window_duration.strftime('%H%M%S00')
                    Window = Windows(id_playlist_id=Playlist.id_playlist, window_start=window_start, window_end=window_end, window_duration=window_duration )
                    Window.save()

                    for j in range(int(numofavails)):
                        if request.POST.get('availstart['+str(i)+']['+str(j)+']'):
                            av_start = request.POST.get('availstart['+str(i)+']['+str(j)+']')
                            av_start = daydate+' '+av_start+':00'
                            number_of_ads = request.POST.get('numofads['+str(i)+']['+str(j)+']')
                            Avail = Avails(id_window_id=Window.id_window, avail_start=av_start, availinwindow=str(j+1), datetime=now )
                            Avail.save()

                            for k in range(int(number_of_ads)):
                                if request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']'):
                                    adspot = request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']')
                                    traffic +=1
                                    AdspotsInAv = AdspotsInAvail(id_avail_id=Avail.id_avail, id_adspot_id=adspot, positioninavail=str(k+1), trafficid=traffic)
                                    AdspotsInAv.save()
                                    record_inserted = 1
            last_id_playlist = Playlist.id_playlist
            xmlfilename = GenerateXMLfromDatabase(daydate, channel_id, channel_zone.id_zone_channel, str(new_version),draft_version_old)
            path_inftp = channeldata.ftp_channel_name+'/schedules/'+channel_zone.region
            uploadFTP(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)

            ############ Display data on view_playlist_id page ##################
            return redirect('view_playlist', id_playlist=last_id_playlist)
        else:
                        useraccess = Useraccess.objects.get(id_user=request.session['id_user'])
                        channel_id = request.POST.get('channel_id')
                        channeldata = Channels.objects.get(id_channel=channel_id)
                        zonename = request.POST.get('zonename')
                        daydate = request.POST.get('day')
                        number_of_windows = request.POST.get('numofwin')
                        channel_zone = ChannelsZone.objects.get(id_channel=channel_id, zonename=zonename)
                        playlist = Playlists.objects.get(pk=id_playlist)

                        version_p = playlist.version
                        broadcastdate_p = playlist.broadcastdate
                        draft_version_p = playlist.draft_version
                        start_date_p = playlist.start_date
                        end_date_p = playlist.end_date

                        max_version_draft = Playlists.objects.filter(broadcastdate=broadcastdate_p).aggregate(Max('draft_version')).get('draft_version__max')
                        new_version_draft = max_version_draft

                        #daydate = datetime.datetime.strptime(str(daydate), '%m/%d/%Y')
                        #daydate = daydate.strftime('%Y-%m-%d')
                        start_date = str(daydate) + "T00:01:00+00:00"
                        end_date = str(daydate) + "T23:59:00+00:00"
                        now = datetime.datetime.now()
                        Playlist = Playlists(id_channel_id=channel_id ,version=version_p, broadcastdate=broadcastdate_p, start_date=start_date_p, end_date=end_date_p, creation_datetime=now, id_zone_channel_id=channel_zone.id_zone_channel,is_draft='1',draft_version=new_version_draft+1)
                        Playlist.save()
                        traffic = 0
                        record_inserted = 0
                        for i in range(int(number_of_windows)):
                            if request.POST.get('numofavails['+str(i)+']'):
                                numofavails = request.POST.get('numofavails['+str(i)+']')
                                window_start = request.POST.get('windowstart['+str(i)+']')
                                window_start = daydate+' '+window_start+':00'
                                window_end = request.POST.get('winend_['+str(i)+']')
                                window_end = daydate+' '+window_end+':00'
                                FMT = '%Y-%m-%d %H:%M:%S'
                                window_duration = datetime.datetime.strptime(window_end, FMT) - datetime.datetime.strptime(window_start, FMT)
                                window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
                                window_duration = window_duration.strftime('%H%M%S00')
                                Window = Windows(id_playlist_id=Playlist.id_playlist, window_start=window_start, window_end=window_end, window_duration=window_duration )
                                Window.save()

                                for j in range(int(numofavails)):
                                    if request.POST.get('availstart['+str(i)+']['+str(j)+']'):
                                        av_start = request.POST.get('availstart['+str(i)+']['+str(j)+']')
                                        av_start = daydate+' '+av_start+':00'
                                        number_of_ads = request.POST.get('numofads['+str(i)+']['+str(j)+']')
                                        Avail = Avails(id_window_id=Window.id_window, avail_start=av_start, availinwindow=str(j+1), datetime=now )
                                        Avail.save()

                                        for k in range(int(number_of_ads)):
                                            if request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']'):
                                                adspot = request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']')
                                                traffic +=1
                                                AdspotsInAv = AdspotsInAvail(id_avail_id=Avail.id_avail, id_adspot_id=adspot, positioninavail=str(k+1), trafficid=traffic)
                                                AdspotsInAv.save()
                        # xmlfilename = GenerateXMLfromDatabase(daydate, channel_id, channel_zone.id_zone_channel, '1' )
                        # path_inftp = channeldata.ftp_channel_name+'/schedules/'+channel_zone.region
                        # uploadFTP(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)
                        last_id_playlist = Playlist.id_playlist

                        ############ Display data on view_playlist_id page ##################
                        return redirect('draft_playlist')




def view_playlist(request, id_playlist):
    playlist = Playlists.objects.get(pk=id_playlist)
    channels = Channels.objects.filter(id_user=request.session['id_user'])
    region = ChannelsZone.objects.get(id_zone_channel=playlist.id_zone_channel.id_zone_channel)
    d = playlist.broadcastdate

    win = Windows.objects.filter(id_playlist=playlist.id_playlist).values_list('id_window', flat=True)

    data = {}
    data["windows"] = []
    data["number_of_wins"] = 0
    i = 0
    record_inserted = 0
    windows = Windows.objects.filter(id_playlist=playlist.id_playlist)
    for window in windows:
        window_dic = {}
        window_dic['i'] = i
        i = i+1
        window_dic['id_window'] = window.id_window
        window_start_formated = datetime.datetime.strptime(window.window_start, '%Y-%m-%d %H:%M:%S')
        window_start_formated_2 = window_start_formated.strftime("%H:%M")
        window_end_formated = datetime.datetime.strptime(window.window_end, '%Y-%m-%d %H:%M:%S')
        window_end_formated_2 = window_end_formated.strftime("%H:%M")
        window_dic['window_start'] = window_start_formated_2
        window_dic['window_end'] = window_end_formated_2
        window_dic['avails_in_win'] = []
        window_dic['num_of_avails'] = 0
        data["number_of_wins"] = i
        avails = Avails.objects.filter(id_window=window.id_window)
        j = 0
        for avail in avails:
            avail_dic = {}
            avail_dic["j"] = j
            j = j+1
            avail_dic["id_avail"] = avail.id_avail

            avail_start_formated = datetime.datetime.strptime(avail.avail_start, '%Y-%m-%d %H:%M:%S')
            avail_start_formated2 = avail_start_formated.strftime("%H:%M")

            avail_dic["avail_start"] = avail_start_formated2
            avail_dic["adspots_in_avail"] = []
            window_dic["avails_in_win"].append(avail_dic)
            adspots = AdspotsInAvail.objects.filter(id_avail=avail.id_avail)
            window_dic['num_of_avails'] = j
            k = 0
            avail_dic["num_of_adspots"] = 0
            for adspot in adspots:
                adspot_dic = {}
                adspot_dic["k"] = k
                k = k+1
                avail_dic["num_of_adspots"] = k
                adspot_dic["id_adsinavail"] = adspot.id_adsinavail
                adspot_dic["id_adspot"] = adspot.id_adspot
                avail_dic["adspots_in_avail"].append(adspot_dic)
        data["windows"].append(window_dic)
        record_inserted = 0


    data_playlist = {'data':data["windows"],'playlist': playlist, 'channels': channels,'region':region,'d':d,'number_of_wins':data["number_of_wins"],'record_inserted':record_inserted}
    return render(request, "DAIManagementApp/view_playlist_id.html", data_playlist)


def duplicate_playlist(request,id_playlist="1"):
    if request.method == 'POST':
        playlist = Playlists.objects.get(pk=id_playlist)
        channels = Channels.objects.filter(id_user=request.session['id_user'])
        region = ChannelsZone.objects.get(id_zone_channel=playlist.id_zone_channel.id_zone_channel)
        d = playlist.broadcastdate

        win = Windows.objects.filter(id_playlist=playlist.id_playlist).values_list('id_window', flat=True)

        data = {}
        data["windows"] = []
        data["number_of_wins"] = 0
        i = 0

        windows = Windows.objects.filter(id_playlist=playlist.id_playlist)
        for window in windows:
            window_dic = {}
            window_dic['i'] = i
            i = i+1
            window_dic['id_window'] = window.id_window
            window_start_formated = datetime.datetime.strptime(window.window_start, '%Y-%m-%d %H:%M:%S')
            window_start_formated_2 = window_start_formated.strftime("%H:%M")
            window_end_formated = datetime.datetime.strptime(window.window_end, '%Y-%m-%d %H:%M:%S')
            window_end_formated_2 = window_end_formated.strftime("%H:%M")
            window_dic['window_start'] = window_start_formated_2
            window_dic['window_end'] = window_end_formated_2
            window_dic['avails_in_win'] = []
            window_dic['num_of_avails'] = 0
            data["number_of_wins"] = i
            avails = Avails.objects.filter(id_window=window.id_window)
            j = 0
            for avail in avails:
                avail_dic = {}
                avail_dic["j"] = j
                j = j+1
                avail_dic["id_avail"] = avail.id_avail
                avail_start_formated = datetime.datetime.strptime(avail.avail_start, '%Y-%m-%d %H:%M:%S')
                avail_start_formated2 = avail_start_formated.strftime("%H:%M")
                avail_dic["avail_start"] = avail_start_formated2
                avail_dic["adspots_in_avail"] = []
                window_dic["avails_in_win"].append(avail_dic)
                adspots = AdspotsInAvail.objects.filter(id_avail=avail.id_avail)
                window_dic['num_of_avails'] = j
                k = 0
                avail_dic["num_of_adspots"] = 0
                for adspot in adspots:
                    adspot_dic = {}
                    adspot_dic["k"] = k
                    k = k+1
                    avail_dic["num_of_adspots"] = k
                    adspot_dic["id_adsinavail"] = adspot.id_adsinavail
                    adspot_dic["id_adspot"] = adspot.id_adspot
                    avail_dic["adspots_in_avail"].append(adspot_dic)
            data["windows"].append(window_dic)


        data_playlist = {'data':data["windows"],'playlist': playlist, 'channels': channels,'region':region,'d':d,'number_of_wins':data["number_of_wins"]}
        return render(request, "DAIManagementApp/duplicate_playlist_id.html", data_playlist)
    else:
        id_session = str(request.session['id_user'])
        channels = Channels.objects.filter(id_user=id_session).values_list('id_channel', flat=True)
        playlists = Playlists.objects.filter(id_channel__in=channels).order_by('-id_playlist')
        data = {'playlists': playlists}
        return render(request, "DAIManagementApp/duplicate_playlist.html",data)


def duplicate_playlist_update(request, id_playlist):
    if request.method == 'POST':
        id_user = request.session['id_user']
        useraccess = Useraccess.objects.get(id_user_id=id_user)
        channel_id = request.POST.get('channel_id')
        channeldata = Channels.objects.get(id_channel=channel_id)
        zonename = request.POST.get('zonename')
        daydate = request.POST.get('day')
        number_of_windows = request.POST.get('numofwin')
        #return HttpResponse(number_of_windows)
        channel_zone = ChannelsZone.objects.get(id_channel=channel_id, zonename=zonename)
        version = request.POST.get('version')

        daydate = datetime.datetime.strptime(str(daydate), '%m/%d/%Y')
        daydate = daydate.strftime('%Y-%m-%d')
        start_date = str(daydate) + "T00:01:00+00:00"
        end_date = str(daydate) + "T23:59:00+00:00"
        now = datetime.datetime.now()

        max_version = Playlists.objects.filter(broadcastdate=str(daydate)).aggregate(Max('version')).get('version__max')

        Playlist = Playlists(id_channel_id=channel_id ,version=1, broadcastdate=str(daydate), start_date=start_date, end_date=end_date, creation_datetime=now, id_zone_channel_id=channel_zone.id_zone_channel,is_draft='0',draft_version='0')
        Playlist.save()
        traffic = 0
        record_inserted = 0
        var_test = 0
        for i in range(int(number_of_windows)):
            if request.POST.get('numofavails['+str(i)+']'):
                numofavails = request.POST.get('numofavails['+str(i)+']')
                window_start = request.POST.get('windowstart['+str(i)+']')
                window_start = daydate+' '+window_start+':00'
                window_end = request.POST.get('windowend['+str(i)+']')
                window_end = daydate+' '+window_end+':00'
                FMT = '%Y-%m-%d %H:%M:%S'
                window_duration = datetime.datetime.strptime(window_end, FMT) - datetime.datetime.strptime(window_start, FMT)
                window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
                window_duration = window_duration.strftime('%H%M%S00')
                Window = Windows(id_playlist_id=Playlist.id_playlist, window_start=window_start, window_end=window_end, window_duration=window_duration )
                Window.save()

                for j in range(int(numofavails)):
                    if request.POST.get('availstart['+str(i)+']['+str(j)+']'):
                        av_start = request.POST.get('availstart['+str(i)+']['+str(j)+']')
                        av_start = daydate+' '+av_start+':00'
                        number_of_ads = request.POST.get('numofads['+str(i)+']['+str(j)+']')
                        Avail = Avails(id_window_id=Window.id_window, avail_start=av_start, availinwindow=str(j+1), datetime=now )
                        Avail.save()

                        for k in range(int(number_of_ads)):
                            if request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']'):
                                adspot = request.POST.get('ad['+str(i)+']['+str(j)+']['+str(k)+']')
                                traffic +=1
                                AdspotsInAv = AdspotsInAvail(id_avail_id=Avail.id_avail, id_adspot_id=adspot, positioninavail=str(k+1), trafficid=traffic)
                                AdspotsInAv.save()
                                record_inserted = 1
        last_id_playlist = Playlist.id_playlist
        xmlfilename = GenerateXMLfromDatabase(daydate, channel_id, channel_zone.id_zone_channel, '1')
        path_inftp = channeldata.ftp_channel_name+'/schedules/'+channel_zone.region
        uploadFTP(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)

        ############ Display data on view_playlist_id page ##################
        return redirect('view_playlist', id_playlist=last_id_playlist)



# fonction manipulations les fichiers logs
def insert_logs(file_path):

    file = open(file_path, 'r')
    lines = file.read().splitlines()
    count = 0
    for line in lines :
        l = line.split('|')
        #print(l)

        if l[1].strip() == 'info':
            msg = l[2].strip().split(' ')
            if "Detected" == msg[0] :
                #print(l[2].strip())
                date = l[0].strip().replace(',' , '')
                day = date.split(' ')[0]
                day =date_time(day.replace('/','-'))
                time = date.split(' ')[1]
                if time.split(':')[0]== '24':
                    time = '00' + time[2:]
                if count == 0:
                    first_day = day

                datetime = str(day + str(' ') + time)
                #datetime = datetime.datetime.strptime(datetime, '%Y-%m-%d %H:%M:%S')

            # print(date)
                info = l[2].split(',')
                #print(info[0])
                channel  = info[0].split(' ')[-1]
                ch = channel.split('(')[0]
                id = channel.split(":")[1].replace(')','')
                duration = info[2].split(' ')[3]


                #print("Date : "+ datetime + " | Channel : "+ ch + " | ID : "+ id   +" | Duration = " + duration)
                count +=1

                print(str(count) + " Date : "+ datetime)
                channel = Channels.objects.get(pk=id)
                log = Adbreak_history.objects.update_or_create(id_channel=channel , datetime=datetime , day=day, time=time,channel_name=ch,duration=duration)
                #log.save()

    file.close()
    print(count)
    return first_day

def logs(request):
    print(request.method)
    if request.method == "POST":
        print(str(request.FILES['logs_file']))
        #preparer le chemin stocker fichier logs

        path = "logs/user_"+str(request.session['id_user'])
        filename = str(request.FILES['logs_file'])
        if not os.path.exists(path):
                print("path not  exist")
                os.makedirs(path)
        else :
                print("path exist ")
        handle_uploaded_file(request.FILES['logs_file'],  path ,filename)
        # traiter ficher
        day = insert_logs(path+'/'+filename)
        # Predir day prochain
        #predict_adbreak(day)

    yesterday = datetime.datetime.now() - timedelta(days=15)
    logs = AdbreakHistory.objects.filter(datetime__gte= yesterday )
    return render(request,'DAIManagementApp/add_logs.html' , {'logs':logs})

def date_time(datetime):
    date = datetime.split('-')
    date=date[2]+'-'+date[0]+'-'+date[1]
    return date

def get_logs(request):
    method = 'get'
    chanels = Channels.objects.all()
    if request.method == 'POST':
        ch = request.POST.get('channel_id')
        day = request.POST.get('day')
        print( " ID : " + ch + " DAY : " + day)

        channel = Channels.objects.get(pk=ch)
        logs = Adbreak_history.objects.filter(id_channel=channel,day=day)
        method = 'post'
        data = {
                'logs':logs,
                'channels':chanels,
                'method' : method
            }
    else :
            data = {

                'channels':chanels,
                'method' : method
            }
    return render(request,"DAIManagementApp/get_logs.html",{'data':data})


def add_campaign(request):
    if request.method == 'POST':
        # Part 1
        name = request.POST.get('campaign_name')
        id_brand = request.POST.get('id_brand')
        id_adpost = request.POST.get('id_adpost')
        pacing = request.POST.get('pacing')

        # Part data
        start_date = request.POST.get('start_day')
        end_date = request.POST.get('end_day')

        # part cpm
        pacing  = request.POST.get('pacing')
        volume  = request.POST.get('volume')

        delivery  = request.POST.get('delivery')
        if delivery == None:
            delivery = 0
        cpm     = request.POST.get('cpm')

        # Part placement
        placement = []
        time = DayTime.objects.all()
        for i in time:
            placement.append(request.POST.get(i.name))


        #Insert
        brand = Brands.objects.get(pk=id_brand)
        adpost = Adspots.objects.get(pk=id_adpost)

        campaign = Campaigns(name=name,id_advertiser=adpost,id_brand=brand,pacing=pacing,start_day=start_date,end_day=end_date,
                            volume=int(volume) , delivery=int(delivery) , cpm=float(cpm))
        campaign.save()
        now - datetime.datetime.now()
        activite = 'Add Campaign'
        desc = 'Admin Add Campaign  id: ' + str(campaign.id_campaign)
        activity = Activity(activity=activite , date=now ,description=desc )
        activity.save()
        print(campaign.id_campaign)
        campaign = Campaigns.objects.get(pk=str(campaign.id_campaign))
        for i in placement :
            if i != None:
                time = DayTime.objects.get(pk=i)

                p = Placement(id_time=time ,id_campaign=campaign)
                p.save()
        campaign = Campaigns.objects.all()
        return render(request,'DAIManagementApp/viwes_campaigns.html',{'campaigns': campaign})





    #brands = Brands.objects.all()
    brands = UsersAdvertisers.objects.filter(id_user=request.session['id_user']).filter(status="1")
    channels= Channels.objects.filter(id_user=request.session['id_user'])
    adspots = Adspots.objects.filter(id_channel__in=channels)
    print(len(adspots))
    datetime = DayTime.objects.all()
    data = {
        'brands'  : brands,
        'adspots' : adspots,
        'datetime': datetime
    }
    return render(request,'DAIManagementApp/add_campaign.html', {'data':data})



def add_campaign_new(request):
    from datetime import datetime
    if request.method == 'POST':
        name = request.POST.get('campaign_name')
        id_brand = request.POST.get('id_brand')
        id_adpost = request.POST.get('id_adpost')

        # pacing = request.POST.get('pacing')

        # Part data
        start_date = request.POST.get('start_day')
        end_date = request.POST.get('end_day')

        # part cpm
        pacing  = request.POST.get('pacing')
        volume  = request.POST.get('volume')
