
from multiprocessing import context
import os
import json
import time
import pytz
import random
import logging
import argparse
import datetime
import schedule
import threading
from math import exp
from numpy import nan
from pathlib import Path
from pprint import pprint
from slugify import slugify
from io import StringIO, BytesIO
from datetime import datetime, timedelta
try:
    from numpy.lib.stride_tricks import broadcast_arrays
except ImportError:
    from numpy import broadcast_arrays

from lxml import etree
import xml.dom.minidom as xml2
import xml.etree.ElementTree as xml

import ftplib
from ftplib import FTP_TLS, error_perm

from rest_framework.views import APIView

from threading import Thread
from concurrent.futures import ThreadPoolExecutor

from django import template
from django.db.models import Max
from django.contrib import messages
from django.db import models, IntegrityError
from django.shortcuts import render, redirect
from django.contrib.sessions.models import Session
from django.core.exceptions import ValidationError
from django.template.loader import render_to_string
from django.contrib.sessions.base_session import AbstractBaseSession
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from django.db import transaction
from apps.core.utils import check_user

import os  
import pytz
import json 
import time
import requests
import datetime  

from django.views import View  
from django.db import connection
from django.utils import timezone
from django.db import transaction
from django.contrib import messages
from django.urls import reverse_lazy, reverse
from django.db.models import Q, Count, Max, Min
from django.http import HttpResponse, JsonResponse  
from django.core.exceptions import PermissionDenied 
from django.utils.decorators import method_decorator 
from django.views.decorators.csrf import csrf_protect
from django.views.generic import ListView, UpdateView 
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods
from django.shortcuts import get_object_or_404, render, redirect
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

from apps.common.utils import is_ajax_request 

# Our tekchbila
from .utils import check_user, FTPClient, fetch_xml_from_url, parse_xml_content, extract_data_by_attributes

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

import telegram # this is from python-telegram-bot package

from django.conf import settings
from django.template.loader import render_to_string
import requests


from django.utils import timezone 
from django.core.cache import cache
from django.views.decorators.cache import cache_page 
from django.utils.decorators import method_decorator
from django.contrib.auth.mixins import LoginRequiredMixin

 
from apps.accounts.models import User
from apps.playlists.models import Verifs
from apps.channels.models import Channel, ChannelZone, ChannelZoneRelation
from apps.agencies.models import Agency, Brand, Advertiser
from apps.activities.models import Activity
from apps.campaigns.models import Campaigns, CampaignStatus, Pending
from apps.reports.models import  Impressions, Analytics, AnalyticsSource



from django.views import View

#======================================================
# Health Check View
#======================================================

@method_decorator(cache_page(60 * 3), name="dispatch")  # Cache for 3 minutes
class HealthCheckView(View):
    """
    Health check endpoint for monitoring.
    
    Returns application health status and basic metrics.
    """
    
    def get(self, request):
        """
        Handle GET request for health check.
        
        Args:
            request: HTTP request object
            
        Returns:
            JsonResponse: Health check data
        """
        try:
            # Check database connectivity
            user_count = User.objects.count()
            
            # Check cache connectivity
            cache_key = "health_check_test"
            cache.set(cache_key, "test", 60)
            cache_test = cache.get(cache_key)
            
            health_data = {
                "status": "healthy",
                "timestamp": timezone.now().isoformat(),
                "database": "connected",
                "cache": "connected" if cache_test == "test" else "disconnected",
                "user_count": user_count,
                "version": getattr(settings, "APP_VERSION", "1.0.0")
            }
            
            return JsonResponse(health_data)
        
        except Exception as e:
            logger.error(f"Health check failed: {e}")
            return JsonResponse({
                "status": "unhealthy",
                "error": str(e),
                "timestamp": timezone.now().isoformat()
            }, status=500)

#======================================================
# DashboardView View
#======================================================

class DashboardView(LoginRequiredMixin, View):
    """
    Dashboard Page View

    This view is responsible for rendering the dashboard page of the application.
    It extends the Django View class and defines the HTTP GET method to handle
    the request and return the rendered dashboard page template.

    Methods:
        get(request): Handles the HTTP GET request and returns the rendered
            dashboard page template.

    Template:
        - 'index.html': The HTML template used to render the dashboard page.

    """
    http_method_names = ["get"]
    template_name = "dashboard/index.html"
    extra_context = {
        "title": "Dashboard - Adtlas",
        "author": " Adtlas Development Team", 
        "description": "Dashboard for Adtlas TV advertising solutions. This dashboard provides insights into your TV advertising campaigns.",
        "keywords": "Adtlas, dashboard, TV advertising solutions, campaign insights, data visualization",
    }  

    def get_context_data(self, **kwargs):
        """
        Add dashboard page context data.
        """
        context = super().get_context_data(**kwargs)
        context.update({
            "title": _("Dashboard"),
        })
        return context  

    def get(self, request, *args, **kwargs):
        """
        Handles the HTTP GET request and returns the rendered dashboard page template.

        Args:
            request (HttpRequest): The HTTP request object.

        Returns:
            HttpResponse: The rendered dashboard page template.
        """

         # Check for AJAX requests
        if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
            return self._handle_ajax_request(request)
        
        # Get filtered queryset
        # queryset = self._get_filtered_queryset(request)
        queryset = Campaigns.objects.filter(
            campaign_manager=request.user
        )
        
        # Apply pagination
        paginator = Paginator(queryset, self._get_items_per_page(request))
        page_number = request.GET.get('page', 1)
        
        try:
            page_obj = paginator.get_page(page_number)
        except PageNotAnInteger:
            page_obj = paginator.get_page(1)
        except EmptyPage:
            page_obj = paginator.get_page(paginator.num_pages)
        
        # Build context
        context = self._build_context(request, page_obj, paginator)
        
        return render(request, self.template_name, context)

    def _build_context(self, request, page_obj, paginator):
        """
        Build template context with all necessary data.
        
        Args:
            request: Django HTTP request object
            page_obj: Paginated page object
            paginator: Paginator instance
            
        Returns:
            dict: Template context
        """
        user = request.user
        
        context = {
            # Pagination data
            'campaigns': page_obj.object_list,
            'page_obj': page_obj,
            'paginator': paginator,
            'is_paginated': paginator.num_pages > 1,
            
            # Filter data
            'channels': self._get_user_channels(user),
            'zones': self._get_available_zones(user),
            'agencies': self._get_agencies(user),
            'advertisers': self._get_advertisers(user),
            'filter_params': self._get_current_filters(request),
            'sort_options': self._get_sort_options(),
            
            # Statistics
            'stats': self._get_stats(user),
            
            # # Additional data
            'date_range': self._get_date_range(),
            'total_results': paginator.count,
            'current_page': page_obj.number,
            'total_pages': paginator.num_pages,
        }
        
        return context

    def _get_available_zones(self, user):
        """
        Get zones available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: Available zones
        """
        return ChannelZone.objects.filter(
            is_active=True
        ).distinct().order_by('name', 'code')

    def _get_user_channels(self, user):
        """
        Get channels available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: User's channels
        """
        # return Channel.objects.filter(user=user).order_by('name')
        return Channel.objects.all().order_by('name')

    def _get_agencies(self, user):
        """
        Get agencies available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: Available agencies
        """
        return Agency.objects.filter(owner=user).order_by('name')

    def _get_advertisers(self, user):
        """
        Get advertisers available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: Available advertisers
        """
        return Advertiser.objects.filter(user=user).order_by('brand__name')

    def _get_current_filters(self, request):
        """
        Get current filter parameters for template.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            dict: Current filter values
        """
        return {
            'search': request.GET.get('search', ''),
            'channel': request.GET.get('channel', 'all'),
            'agency': request.GET.get('agency', 'all'),
            'advertiser': request.GET.get('advertiser', 'all'),
            'zone': request.GET.get('zone', 'all'),
            'status': request.GET.get('status', 'all'),
            'date_from': request.GET.get('date_from', ''),
            'date_to': request.GET.get('date_to', ''),
            'date_range': request.GET.get('date_range', ''),
            'sort_by': request.GET.get('sort_by', '-created_at'),
            'per_page': request.GET.get('per_page', '20'),
        }

    def _get_sort_options(self):
        """
        Get available sorting options.
        
        Returns:
            list: Sort options for template
        """
        return [
            {'value': '-created_at', 'label': 'Newest First'},
            {'value': 'created_at', 'label': 'Oldest First'},
            
        ]
        
    def _get_stats(self, user):
        """
            Get campaigns statistics for dashboard.

            Args:
            user: Current user object

            Returns:
            dict: Campaigns statistics
        """

        base_queryset = Campaigns.objects.filter(campaign_manager=user)
        today = timezone.now().date()
        week_ago = today - datetime.timedelta(days=7)

        return {   
            'total_campaigns': base_queryset.count(),
            'active_campaigns': base_queryset.filter(
                status=CampaignStatus.In_progress,
                end_date__gte=today
            ).count(),
            'pending_campaigns': base_queryset.filter(
                status=CampaignStatus.Prebooked,
                end_date__gte=today
            ).count(),
            'expired_campaigns': base_queryset.filter( 
                end_date__lt=today
            ).count(), 
            'todays_campaigns': base_queryset.filter(end_date=today).count(),
            'recent_campaigns': base_queryset.filter(
                end_date__gte=week_ago
            ).count(),
            'upcoming_campaigns': base_queryset.filter(
                status=CampaignStatus.In_progress,
                end_date__gt=today, 
            ).count(),
            'past_campaigns': base_queryset.filter(
                end_date__lt=today
            ).count(),
        } 

    def _get_date_range(self):
        """
        Get date range information for filtering.
        
        Returns:
            dict: Date range options
        """
        today = timezone.now().date()
        
        return {
            'today': today,
            'yesterday': today - datetime.timedelta(days=1),
            'week_start': today - datetime.timedelta(days=today.weekday()),
            'month_start': today.replace(day=1),
            'min_date': today - datetime.timedelta(days=365),  # One year ago
            'max_date': today + datetime.timedelta(days=365),  # One year ahead
        }
    
    def _handle_ajax_request(self, request):
        """
        Handle AJAX requests for dynamic updates.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with data
        """
        action = request.GET.get('action')
        
        if action == 'get_zones':
            return self._get_zones_for_channel_ajax(request)
        elif action == 'get_agencies':
            return self._get_agencies_ajax(request)
        elif action == 'get_advertisers':
            return self._get_advertisers_for_agency_ajax(request)
        elif action == 'quick_stats':
            return self._get_quick_stats_ajax(request)
        # elif action == 'export_data':
        #     return self._export_campaigns_data_ajax(request)
        # elif action == 'load_more':
        #     return self._load_more_campaigns_ajax(request)
        
        # # Default: return filtered campaign data
        # return self._get_filtered_campaigns_ajax(request)

    def _get_zones_for_channel_ajax(self, request):
        """
        Get zones for a specific channel via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with zone data
        """
        channel_id = request.GET.get('channel_id')
        
        if not channel_id:
            return JsonResponse({'success': False, 'error': 'Channel ID required'})
        
        try:
            channel_id = int(channel_id)
            zones = ChannelZone.objects.filter(
                id_channel_id=channel_id
            ).values('id_zone_channel', 'networkname', 'region')
            
            return JsonResponse({
                'success': True,
                'zones': list(zones)
            })
        except (ValueError, TypeError):
            return JsonResponse({'success': False, 'error': 'Invalid channel ID'})

    def _get_agencies_ajax(self, request):
        """
        Get agencies available to the current user via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with agency data
        """
        user = request.user
        agencies = self._get_available_agencies(user)
        
        return JsonResponse({
            'success': True,
            'agencies': list(agencies.values('id_agency', 'name'))
        })

    def _get_available_agencies(self, user):
        """
        Get agencies available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: QuerySet of available agencies
        """
        return Agency.objects.filter(id_user=user)

    def _get_advertisers_for_agency_ajax(self, request):
        """
        Get advertisers available to the current user via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with advertiser data
        """
        user = request.user
        agency_id = request.GET.get('agency_id')
        
        if not agency_id:
            return JsonResponse({'success': False, 'error': 'Agency ID required'})

        try:
            agency_id = int(agency_id)
            advertisers = Advertiser.objects.filter(brand__agency__id=agency_id)
            
            return JsonResponse({
                'success': True,
                'advertisers': list(advertisers.values('id', 'name'))
            })
        except (ValueError, TypeError):
            return JsonResponse({'success': False, 'error': 'Invalid agency ID'})

    def _get_quick_stats_ajax(self, request):
        """
        Get quick statistics via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with statistics
        """
        user = request.user
        stats = self._get_stats(user)
        
        return JsonResponse({
            'success': True,
            'stats': stats
        })

    def _export_campaigns_data_ajax(self, request):
        """
        Export playlist data via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with export status
        """
        # Get filtered queryset for export
        queryset = self._get_filtered_queryset(request)
        
        # For now, return success with count
        # In a real implementation, you would generate a file and return the URL
        return JsonResponse({
            'success': True,
            'message': f'Export prepared for {queryset.count()} playlists',
            'download_url': '#',  # Replace with actual download URL
            'count': queryset.count()
        })
    
    def _get_items_per_page(self, request):
        """
        Get number of items per page from request or default.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            int: Items per page
        """
        try:
            per_page = int(request.GET.get('per_page', 20))
            # Limit to reasonable range
            return max(10, min(per_page, 100))
        except (ValueError, TypeError):
            return 20
 
 
# 
# 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.now()
#     dayformat = SfrAnalytics.objects.all().order_by("-id_impression")[0].day
#     #user = 1 ==> make it dynamique
#     channels_sfr = list(Channels.objects.filter(id_user=request.session['id_user']).values_list("sfr_channel_name",flat=True))
#     #region => make it dynamique
#     val = 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')
#         print("res === " , len(res))
#         if len(res)>0:

#             nb  =  float(purcent.total_users) / float(purcent.market_share_purcent)
#             labels  = [x[0] for x in res ]
#             data  = [float(x[1])*nb for x in res]
#             result.append( data)
#             channel_sfr.append(channel)
#         # else :
#         #     labels = [x[0] for x in res ]
#         #     data = []
#         #     channel = []
#         #     result.append( data)
#         #     channel_sfr.append(channel)
#     print("labels === " ,labels)
#     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]
#     #channels_id =Channels.objects.filter(id_user = request.session['id_user'])
#     lines  = Verifs.objects.filter(airStatuscode="0001").order_by("-id_verif")[:80]
#     # lines  = Verifs.objects.all()
#     data2 = []

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

#             id = Channels.objects.get(channel_name= line.networkname , id_user = request.session['id_user'])
#             print(id)
#             region = ChannelsZone.objects.get(id_channel=id,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'
#                 try :
#                     sfr = Analytics.objects.filter(day=p['day'],minute=p['minute']).order_by('-id_verif')
#                     for i in sfr  :
#                         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'] = nb
#                 except :
#                         p['nb_wach'] = 0

#             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'])

#     # Added 18-12-2023
#     no_vast_query_old = """
#         SELECT
#             Campaigns.id_campaign,
#             Count(Verifs.airStatusCode) as total_ads,
#             SUM(Analytics.purcent*1.25*4500000/17) as Total_impressions
#         FROM
#             Campaigns
#         LEFT JOIN Adspots ON Campaigns.id_campaign = Adspots.id_campaign
#         LEFT JOIN Verifs ON Verifs.spotId = Adspots.filename
#         LEFT JOIN Analytics ON SUBSTRING(Verifs.airTime, 12, 5) = SUBSTRING(Analytics.`minute`, 1, 5)
#         AND SUBSTRING(Verifs.airTime, 1, 10) = SUBSTRING(Analytics.`day`, 1, 10)
#         AND Analytics.sfr_channel_name = '2M Maroc'
#         WHERE Adspots.id_campaign is not null AND Verifs.airStatusCode= 0001
#         AND SUBSTRING(Verifs.airTime, 1, 10) > Campaigns.start_day AND SUBSTRING(Verifs.airTime, 1, 10) < Campaigns.end_day
#         GROUP BY Campaigns.id_campaign
#     """

#     no_vast_query = """
#         SELECT
#             Campaigns.id_campaign,
#             Count(Verifs.airStatusCode) as total_ads,
#             SUM(Analytics.purcent*1.25*4500000/17) as Total_impressions
#         FROM
#             Campaigns
#         INNER JOIN Adspots ON Campaigns.id_campaign = Adspots.id_campaign
#         INNER JOIN Verifs ON Verifs.spotId = Adspots.filename
#         INNER JOIN Analytics ON SUBSTRING(Verifs.airTime, 12, 5) = SUBSTRING(Analytics.`minute`, 1, 5)
#         AND SUBSTRING(Verifs.airTime, 1, 10) = SUBSTRING(Analytics.`day`, 1, 10)
#         AND Analytics.sfr_channel_name = '2M Maroc'
#         WHERE Adspots.id_campaign is not null AND Verifs.airStatusCode= 0001
#         AND SUBSTRING(Verifs.airTime, 1, 10) > Campaigns.start_day AND SUBSTRING(Verifs.airTime, 1, 10) < Campaigns.end_day
# 				AND Adspots.creative_id is null
#         GROUP BY Campaigns.id_campaign
#     """

#     vast_query = """
#         SELECT
#             Campaigns.id_campaign,
#             COALESCE(Ads.total_ads, 0) as total_ads,
#             COALESCE(Impressions.total_impression, 0) as total_impression
#         FROM
#             Campaigns
#         LEFT JOIN (
#             SELECT
#                 Campaigns.id_campaign,
#                 COUNT(Verifs.airStatusCode) as total_ads
#             FROM
#                 Campaigns
#             LEFT JOIN
#                 Adspots ON Campaigns.id_campaign = Adspots.id_campaign
#             LEFT JOIN
#                 Verifs ON Verifs.spotId = Adspots.filename
#             WHERE
#                 Adspots.id_campaign is not null and Verifs.airStatusCode= 0001
#                 AND SUBSTRING(Verifs.airTime, 1, 10) > Campaigns.start_day
#                 AND SUBSTRING(Verifs.airTime, 1, 10) < Campaigns.end_day
#             GROUP BY
#                 Campaigns.id_campaign
#         ) Ads ON Campaigns.id_campaign = Ads.id_campaign
#         LEFT JOIN (
#             SELECT
#                 Campaigns.id_campaign,
#                 COUNT(VAST_response.AD_id) as total_impression
#             FROM
#                 Campaigns
#             LEFT JOIN
#                 VAST_response ON Campaigns.vast_data = VAST_response.vast_url
#                 AND SUBSTRING(VAST_response.datetime_timestamp, 1, 10) > Campaigns.start_day
#                 AND SUBSTRING(VAST_response.datetime_timestamp, 1, 10) < Campaigns.end_day
#             WHERE
#                 Campaigns.vast_data is not null
#             GROUP BY
#                 Campaigns.id_campaign
#         ) Impressions ON Campaigns.id_campaign = Impressions.id_campaign
#         WHERE Campaigns.vast_data is not null
#     """

#     from django.db import connection
#     from .utils import NoVastResult, VastResult

#     # Execute the no_vast_query
#     with connection.cursor() as cursor:
#         cursor.execute(no_vast_query)
#         no_vast_results = [NoVastResult(*row) for row in cursor.fetchall()]

#     # Execute the vast_query
#     with connection.cursor() as cursor:
#         cursor.execute(vast_query)
#         vast_results = [VastResult(*row) for row in cursor.fetchall()]


#     #activites = []
#     return render(
#         request,
#         "core/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,

#             'campaigns_data': Campaigns.objects.filter(id_user=request.session['id_user']),
#             'vast_results': vast_results,
#             'no_vast_results': no_vast_results
#         }
#     )
 
# def index(request):

#     channel = Channels.objects.get(pk = 1)

#     dayformat = SfrAnalytics.objects.all().order_by("-id_impression")[0].day

#     channels_sfr = list(Channels.objects.filter(id_user=request.session['id_user']).values_list("sfr_channel_name",flat=True))

#     val = Analytics.objects.filter(sfr_channel_name__in=channels_sfr, region='France' ,day=str(dayformat))

#     result = []

#     channel_sfr=[]

#     purcent = Impressions.objects.get(pk='1')

#     for channel in channels_sfr :
#         res= val.filter(sfr_channel_name=channel).values_list('minute','purcent')
#         print("res === " , len(res))
#         if len(res)>0:

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

#     print("labels === " ,labels)

#     color = colors

#     channels = Channels.objects.filter(id_user = request.session['id_user']).values_list('channel_name')
#     channels = [x[0] for x in channels]

#     # #channels_id =Channels.objects.filter(id_user = request.session['id_user'])

#     lines  = Verifs.objects.filter(airStatuscode="0001").order_by("-id_verif")[:80]

#     # # lines  = Verifs.objects.all()
#     # data2 = []

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

#     #         id = Channels.objects.get(channel_name= line.networkname , id_user = request.session['id_user'])
#     #         print(id)
#     #         region = ChannelsZone.objects.get(id_channel=id,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'
#     #             try :
#     #                 sfr = Analytics.objects.filter(day=p['day'],minute=p['minute']).order_by('-id_verif')
#     #                 for i in sfr  :
#     #                     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'] = nb
#     #             except :
#     #                     p['nb_wach'] = 0

#     #         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'])

#     # Added 18-12-2023
#     no_vast_query_old = """
#         SELECT
#             Campaigns.id_campaign,
#             Count(Verifs.airStatusCode) as total_ads,
#             SUM(Analytics.purcent*1.25*4500000/17) as Total_impressions
#         FROM
#             Campaigns
#         LEFT JOIN Adspots ON Campaigns.id_campaign = Adspots.id_campaign
#         LEFT JOIN Verifs ON Verifs.spotId = Adspots.filename
#         LEFT JOIN Analytics ON SUBSTRING(Verifs.airTime, 12, 5) = SUBSTRING(Analytics.`minute`, 1, 5)
#         AND SUBSTRING(Verifs.airTime, 1, 10) = SUBSTRING(Analytics.`day`, 1, 10)
#         AND Analytics.sfr_channel_name = '2M Maroc'
#         WHERE Adspots.id_campaign is not null AND Verifs.airStatusCode= 0001
#         AND SUBSTRING(Verifs.airTime, 1, 10) > Campaigns.start_day AND SUBSTRING(Verifs.airTime, 1, 10) < Campaigns.end_day
#         GROUP BY Campaigns.id_campaign
#     """

#     no_vast_query = """
#         SELECT
#             Campaigns.id_campaign,
#             Count(Verifs.airStatusCode) as total_ads,
#             SUM(Analytics.purcent*1.25*4500000/17) as Total_impressions
#         FROM
#             Campaigns
#         INNER JOIN Adspots ON Campaigns.id_campaign = Adspots.id_campaign
#         INNER JOIN Verifs ON Verifs.spotId = Adspots.filename
#         INNER JOIN Analytics ON SUBSTRING(Verifs.airTime, 12, 5) = SUBSTRING(Analytics.`minute`, 1, 5)
#         AND SUBSTRING(Verifs.airTime, 1, 10) = SUBSTRING(Analytics.`day`, 1, 10)
#         AND Analytics.sfr_channel_name = '2M Maroc'
#         WHERE Adspots.id_campaign is not null AND Verifs.airStatusCode= 0001
#         AND SUBSTRING(Verifs.airTime, 1, 10) > Campaigns.start_day AND SUBSTRING(Verifs.airTime, 1, 10) < Campaigns.end_day
# 				AND Adspots.creative_id is null
#         GROUP BY Campaigns.id_campaign
#     """

#     vast_query = """
#         SELECT
#             Campaigns.id_campaign,
#             COALESCE(Ads.total_ads, 0) as total_ads,
#             COALESCE(Impressions.total_impression, 0) as total_impression
#         FROM
#             Campaigns
#         LEFT JOIN (
#             SELECT
#                 Campaigns.id_campaign,
#                 COUNT(Verifs.airStatusCode) as total_ads
#             FROM
#                 Campaigns
#             LEFT JOIN
#                 Adspots ON Campaigns.id_campaign = Adspots.id_campaign
#             LEFT JOIN
#                 Verifs ON Verifs.spotId = Adspots.filename
#             WHERE
#                 Adspots.id_campaign is not null and Verifs.airStatusCode= 0001
#                 AND SUBSTRING(Verifs.airTime, 1, 10) > Campaigns.start_day
#                 AND SUBSTRING(Verifs.airTime, 1, 10) < Campaigns.end_day
#             GROUP BY
#                 Campaigns.id_campaign
#         ) Ads ON Campaigns.id_campaign = Ads.id_campaign
#         LEFT JOIN (
#             SELECT
#                 Campaigns.id_campaign,
#                 COUNT(VAST_response.AD_id) as total_impression
#             FROM
#                 Campaigns
#             LEFT JOIN
#                 VAST_response ON Campaigns.vast_data = VAST_response.vast_url
#                 AND SUBSTRING(VAST_response.datetime_timestamp, 1, 10) > Campaigns.start_day
#                 AND SUBSTRING(VAST_response.datetime_timestamp, 1, 10) < Campaigns.end_day
#             WHERE
#                 Campaigns.vast_data is not null
#             GROUP BY
#                 Campaigns.id_campaign
#         ) Impressions ON Campaigns.id_campaign = Impressions.id_campaign
#         WHERE Campaigns.vast_data is not null
#     """

#     from django.db import connection
#     from .utils import NoVastResult, VastResult

#     # Execute the no_vast_query
#     with connection.cursor() as cursor:
#         cursor.execute(no_vast_query)
#         no_vast_results = [NoVastResult(*row) for row in cursor.fetchall()]

#     # Execute the vast_query
#     with connection.cursor() as cursor:
#         cursor.execute(vast_query)
#         vast_results = [VastResult(*row) for row in cursor.fetchall()]


#     #activites = []
#     return render(
#         request,
#         "core/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,

#             'campaigns_data': Campaigns.objects.filter(id_user=request.session['id_user']),
#             'vast_results': vast_results,
#             'no_vast_results': no_vast_results
#         }
#     )
 
# calculer le nombrer des playlists delivrer et annuler

def playlists(request):
    from datetime import datetime, timedelta
    result = {
        'delivered' :0,
        'cancelled' :0,
        'purcent' : 0
    }
    channels = Channel.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 = Channel.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


# 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 = Channel.objects.get(id_channel=channel_id)
    channel_zone = ChannelZone.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).order_by('window_start')

    windows_array = {}
    win_i = 0
    trafficid = 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)
        if len(avails) > 0:
            root.append(windows_array[win_i])

        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:
                trafficid+=1
                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('trafficId', str(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', str(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, port) if port else 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 AlmaFtp(host, username, password, local_file_path, remote_file_path):
    from ftplib import FTP
    try:
        # Connect to the FTP server
        with FTP(host) as ftp:
            # Login with credentials
            ftp.login(username, password)

            # Set the FTP directory (optional)
            # ftp.cwd('/your/remote/directory')

            # Open the local file in binary mode
            with open(local_file_path, 'rb') as file:
                # Upload the file to the FTP server
                ftp.storbinary(f'STOR {remote_file_path}', file)

            print(f"File '{local_file_path}' uploaded to '{remote_file_path}' on the FTP server.")
    except Exception as e:
        print(f"Error: {e}")


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


    try:
        ftp = ftplib.FTP(host, user, password)
        ftp.cwd(path_inftp)
        # ftp = ftplib.FTP(host, user, password)
        module_dir = os.path.dirname(__file__)  # get current directory
        path = "files/DAI-Management"

        with open(filename, "rb") as file:
            ftp.storbinary(f"STOR {filename}", file)
        ftp.quit()

        return True

    except Exception as e:
        print('%s' % type(e))
        send_msg_telegram2("⚠️ Connectivity issue with Enensys server, trying again ... ⚠️")
        try:
            ftp = ftplib.FTP(host, user, password)
            ftp.cwd(path_inftp)
            # ftp = ftplib.FTP(host, user, password)
            module_dir = os.path.dirname(__file__)  # get current directory
            path = "files/DAI-Management"

            with open(filename, "rb") as file:
                ftp.storbinary(f"STOR {filename}", file)
            ftp.quit()

            return True

        except Exception as e:
            print('%s' % type(e))
            send_msg_telegram2("⛔️ update was not pushed, please check OpenVPN or Enensys")
            return False


    #
    # try:
    #     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()
    #     return True
    #
    # except (error_temp, BrokenPipeError, socket.timeout) as e:
    #     print(e)
    #     return False


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 my_custom_sql(query, params):
#     from django.db import connection
#     with connection.cursor() as cursor:
#         cursor.execute(query, params)
#         results = cursor.fetchall()
#     return results


def dictfetchall(cursor):
    "Return all rows from a cursor as a dict"
    columns = [col[0] for col in cursor.description]
    return [dict(zip(columns, row)) for row in cursor.fetchall()]

 
# 
# def insertion_results(request, id_playlist):
#     # Retrieve the playlist object with the specified primary key
#     playlist = Playlists.objects.get(pk=id_playlist)
#     # Retrieve the channels object associated with the playlist's channel ID
#     channels = Channels.objects.get(id_channel=playlist.id_channel.id_channel)
#     # Retrieve the region information associated with the playlist's zone 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)

#         ftp_host = "172.16.205.1"
#         ftp_port =  60000
#         ftp_username = "SanoaMedia"
#         ftp_password = "SanoaMedia"


#         filename_in_ftp = broadcastdate+"-2005-00001.ver"
#         filename_in_local = broadcastdate+"-2005-00001.ver"
#         remote_path = f"2M/verifs/{filename_in_ftp}"
#         local_path = f"files/results/{ftp_channel_name}/verifs/{filename_in_local}"

#         #
#         ftp = FTPConnector(ftp_host, ftp_port, ftp_username, ftp_password)
#         # Download a file from the server
#         ftp.download_file(remote_path, local_path)

#         # 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_local).exists():
#             doc = xml2.parse(path_in_app+'/'+filename_in_local)
#             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).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
#                 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,
#         "core/insertion_results.html",
#         data_playlist
#     )


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

 
def predict(val ):
    import datetime
    import pandas as pd
    import numpy as np
    import calendar
    from statsmodels.tsa.arima_model import ARIMA
    df = pd.DataFrame(val , columns = ['Day','Minute','Purcent'])
    #df['Datetime'] = df['Day'] + ' ' + df['Minute']
    week = []
    for i in df['Day']:
        week.append(calendar.day_name[datetime.datetime.strptime(str(i), '%Y-%m-%d').weekday()])
    day = datetime.datetime.now()
    day_week = calendar.day_name[day.weekday()-1]
    df['Day_Week'] = week

    df_final  = df.loc[ df['Day_Week']==day_week  ]
    df_final.index = range(0,len(df_final['Minute']))
    from sklearn.preprocessing import PolynomialFeatures
    from sklearn.pipeline import make_pipeline
    from sklearn.linear_model import LinearRegression
    degree=8
    polyreg=make_pipeline(PolynomialFeatures(degree),LinearRegression())
    X= np.array(df_final.index).reshape(-1,1)
    y= np.array(df_final['Purcent']).reshape(-1,1)
    polyreg.fit(X,y)
    predict = polyreg.predict(X)
    df_final.drop_duplicates(subset=['Minute'])

    day += datetime.timedelta(days=6)
    label = df['Minute']
    for i in range(0,len(predict)) :
        line = Sfr_predict( sfr_channel_name = '2M Maroc',day = day , minute=label[i] , purcent=abs(predict[i]))
        line.save()

    return (label , predict)
 

def theme_mode(request):
    current_mode = request.GET.get('current_mode')
    if current_mode == 'light':
        body_class_theme = ''
    else:
        body_class_theme = 'dark-mode'

    request.session['theme_mode'] = body_class_theme
    return HttpResponse('')


def func_predict():
    schedule.every().day.at('00:00').do(predict_adbreak)
    # schedule.run_pending()
    while True:
        schedule.run_pending()
        time.sleep(1)

 
def realtime_filter(id_channel,start_at,duration, msg):#start_at
    FMT = '%Y-%m-%d %H:%M:%S'
    my_channel = Channel.objects.get(id_channel=id_channel)
    # useraccess = Useraccess.objects.get(id_user=1)
    send_msg_telegram(my_channel.channel_name,start_at,duration, msg)

    if int(duration)<25:
        playlist=Playlists.objects.filter(id_channel=id_channel)
        channel_zone = ChannelZone.objects.get(id_channel=id_channel, zonename="2005")
        otherplaylist = Playlists.objects.get(id_playlist=100)

        window=Windows.objects.filter(window_start__lte=start_at, window_end__gte=start_at).filter(id_playlist__in=playlist).last()
        new_window=Windows.objects.filter(id_playlist=otherplaylist).last()
        update_status = -1
        if (window):
            theid_playlist = window.id_playlist.id_playlist
            insertion_results_getter(theid_playlist)



            send_msg_telegram2("📣 Short adbreak detected, updating the playlist ...")

            update_status = 0
            print("I'm heeeere")
            print(window.id_playlist.id_playlist)
            preview_window_end = window.window_end
            from datetime import timedelta
            print(start_at)
            #start_at += timedelta(days=0, hours=0, minutes=-2)
            start_at = datetime.datetime.strptime(start_at, "%Y-%m-%d %H:%M:%S")

            # window.window_end = start_at
            # endo = window.window_end
            # window_duration = datetime.datetime.strptime(str(window.window_end), FMT) - datetime.datetime.strptime(str(window.window_start), FMT)
            # window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
            # window_duration = window_duration.strftime('%H%M%S00')
            # window.window_duration = window_duration
            # window.id_playlist = Playlists.objects.get(id_playlist=377)
            # window.save()
            print(window)
            start_at =  start_at + datetime.timedelta(minutes=15)
            # start_at = datetime.datetime.strptime(start_at, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(minutes=2)

            # new_window_duration = datetime.datetime.strptime(str(preview_window_end), FMT) - datetime.datetime.strptime(str(start_at), FMT)
            # print("start_at"+str(start_at))
            # print("preview_window_end"+str(preview_window_end))
            # print("new window duration "+str(new_window_duration))
            # new_window_duration = datetime.datetime.strptime(str(new_window_duration), '%H:%M:%S')
            # new_window_duration = new_window_duration.strftime('%H%M%S00')
            # new_window = Windows(id_playlist_id=otherplaylist.id_playlist, window_start=start_at, window_end=preview_window_end, window_duration=new_window_duration )
            new_window.save()
            print(new_window)

            # Get the id of the adbreaks that are not Aired yet
            from django.db import connection
            cursor = connection.cursor()

            broadcastDateForQuery = str(window.id_playlist.broadcastdate).replace("-","")
            id_windowForQuery = window.id_window
            daydate = str(window.id_playlist.broadcastdate)
            daydate_xml = str(window.id_playlist.broadcastdate)
            daydate = daydate.replace("-","")


            # daydate0012 = daydate2

            # queries = """
            #                   SELECT Adspots_in_avail.id_avail FROM Avails
            #                   left join Adspots_in_avail on Adspots_in_avail.id_avail = Avails.id_avail
            #                   left join Verifs on ( Verifs.broadcastDate = %s and Verifs.trafficId = Adspots_in_avail.trafficId )
            #                   where ( Adspots_in_avail.positionInAvail = 1 and Verifs.airStatusCode <> 0001 ) and  Avails.id_window= %s
            #               """

            queries = """
                              SELECT Adspots_in_avail.id_avail FROM Avails
                              left join Adspots_in_avail on Adspots_in_avail.id_avail = Avails.id_avail
                              left join Verifs on ( Verifs.broadcastDate = %s and Verifs.trafficId = Adspots_in_avail.trafficId )
                              where (Verifs.airStatusCode <> 0001 or Verifs.airStatusCode is null) and Avails.id_window= %s
                          """

            data_tuple=(broadcastDateForQuery,id_windowForQuery)
            cursor.execute(queries,data_tuple)
            row = cursor.fetchall()
            if new_window:
                for r in row:
                    availoo = r[0]
                    print(r[0])
                    avail = Avails.objects.get(id_avail=r[0])
                    pprint(avail)
                    avail.id_window = new_window
                    windddd = avail.id_window
                    avail.avail_start = new_window.window_start
                    print("the new avail winodws : "+str(avail.avail_start ))
                    avail.save()

            pplay = Playlists.objects.get(id_playlist=theid_playlist)
            pplay.version = int(pplay.version) + 1
            # pplay.version = int(pplay.version)
            pplay.save()

            new_version = str(Playlists.objects.get(id_playlist=theid_playlist).version)
            new_version_draft = str(Playlists.objects.get(id_playlist=theid_playlist).draft_version)
            max_version_draft = new_version_draft
            max_version = new_version
            # window.id_playlist = Playlists.objects.get(id_playlist=377)
            # window.save()
            # new_version = int(max_version)
            # max_version_draft = Playlists.objects.filter(broadcastdate=str(daydate)).aggregate(Max('draft_version')).get('draft_version__max')
            # new_version_draft = int(max_version_draft)
            xmlfilename = GenerateXMLfromDatabase(daydate_xml, id_channel, channel_zone.id_zone_channel, str(new_version), str(max_version_draft))
            path_inftp = my_channel.ftp_channel_name+'/schedules/'+channel_zone.region
            # if(uploadFTP4(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)):
                # update_status = 1


        if(update_status == 1):
            send_msg_telegram2("✅ Playlist updated")
        # if(update_status == 0):
        #     send_msg_telegram2("### Something happened, playlist was NOT updated ###")


def realtime_filter_new(id_channel,start_at,duration, msg):#start_at
    FMT = '%Y-%m-%d %H:%M:%S'
    my_channel = Channel.objects.get(id_channel=id_channel)
    # useraccess = Useraccess.objects.get(id_user=1)
    send_msg_telegram(my_channel.channel_name,start_at,duration, msg)
    if int(duration)<25:
        playlist=Playlists.objects.filter(id_channel=id_channel)
        channel_zone = ChannelZone.objects.get(id_channel=id_channel, zonename="2005")
        window=Windows.objects.filter(window_start__lte=start_at, window_end__gte=start_at).filter(id_playlist__in=playlist).last()
        update_status = -1
        if (window):
            send_msg_telegram2("📣 Short adbreak detected, updating the playlist ...")

            update_status = 0
            print("I'm heeeere")
            print(window.id_playlist.id_playlist)
            preview_window_end = window.window_end
            from datetime import timedelta
            print(start_at)
            #start_at += timedelta(days=0, hours=0, minutes=-2)
            start_at = datetime.datetime.strptime(start_at, "%Y-%m-%d %H:%M:%S")

            window.window_end = start_at
            endo = window.window_end
            window_duration = datetime.datetime.strptime(str(window.window_end), FMT) - datetime.datetime.strptime(str(window.window_start), FMT)
            window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
            window_duration = window_duration.strftime('%H%M%S00')
            window.window_duration = window_duration
            window.save()
            print(window)
            start_at =  start_at + datetime.timedelta(minutes=15)
            # start_at = datetime.datetime.strptime(start_at, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(minutes=2)

            new_window_duration = datetime.datetime.strptime(str(preview_window_end), FMT) - datetime.datetime.strptime(str(start_at), FMT)
            print("start_at"+str(start_at))
            print("preview_window_end"+str(preview_window_end))
            print("new window duration "+str(new_window_duration))
            new_window_duration = datetime.datetime.strptime(str(new_window_duration), '%H:%M:%S')
            new_window_duration = new_window_duration.strftime('%H%M%S00')
            new_window = Windows(id_playlist_id=window.id_playlist.id_playlist, window_start=start_at, window_end=preview_window_end, window_duration=new_window_duration )
            new_window.save()
            theid_playlist = window.id_playlist.id_playlist
            print(new_window)

            # Get the id of the adbreaks that are not Aired yet
            from django.db import connection
            cursor = connection.cursor()

            broadcastDateForQuery = str(window.id_playlist.broadcastdate).replace("-","")
            id_windowForQuery = window.id_window
            daydate = str(window.id_playlist.broadcastdate)
            daydate_xml = str(window.id_playlist.broadcastdate)
            daydate = daydate.replace("-","")
            # daydate0012 = daydate2

            # queries = """
            #                   SELECT Adspots_in_avail.id_avail FROM Avails
            #                   left join Adspots_in_avail on Adspots_in_avail.id_avail = Avails.id_avail
            #                   left join Verifs on ( Verifs.broadcastDate = %s and Verifs.trafficId = Adspots_in_avail.trafficId )
            #                   where ( Adspots_in_avail.positionInAvail = 1 and Verifs.airStatusCode <> 0001 ) and  Avails.id_window= %s
            #               """

            queries = """
                              SELECT Adspots_in_avail.id_avail FROM Avails
                              left join Adspots_in_avail on Adspots_in_avail.id_avail = Avails.id_avail
                              left join Verifs on ( Verifs.broadcastDate = %s and Verifs.trafficId = Adspots_in_avail.trafficId )
                              where Avails.id_window= %s
                          """

            data_tuple=(broadcastDateForQuery,id_windowForQuery)
            cursor.execute(queries,data_tuple)
            row = cursor.fetchall()
            if new_window:
                for r in row:
                    availoo = r[0]
                    print(r[0])
                    avail = Avails.objects.get(id_avail=r[0])
                    pprint(avail)
                    avail.id_window = new_window
                    windddd = avail.id_window
                    avail.avail_start = new_window.window_start
                    print("the new avail winodws : "+str(avail.avail_start ))
                    avail.save()

            pplay = Playlists.objects.get(id_playlist=theid_playlist)
            pplay.version = int(pplay.version) + 1
            # pplay.version = int(pplay.version)
            pplay.save()

            new_version = str(Playlists.objects.get(id_playlist=theid_playlist).version)
            new_version_draft = str(Playlists.objects.get(id_playlist=theid_playlist).draft_version)
            max_version_draft = new_version_draft
            max_version = new_version
            # new_version = int(max_version)
            # max_version_draft = Playlists.objects.filter(broadcastdate=str(daydate)).aggregate(Max('draft_version')).get('draft_version__max')
            # new_version_draft = int(max_version_draft)
            xmlfilename = GenerateXMLfromDatabase(daydate_xml, id_channel, channel_zone.id_zone_channel, str(new_version), str(max_version_draft))
            path_inftp = my_channel.ftp_channel_name+'/schedules/'+channel_zone.region
            # if(uploadFTP4(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)):
                # update_status = 1


        if(update_status == 1):
            send_msg_telegram2("✅ Playlist updated")
        # if(update_status == 0):
        #     send_msg_telegram2("### Something happened, playlist was NOT updated ###")


def realtime_filter_old(id_channel,start_at,duration, msg):#start_at
    FMT = '%Y-%m-%d %H:%M:%S'
    my_channel = Channel.objects.get(id_channel=id_channel)
    # useraccess = Useraccess.objects.get(id_user=1)
    send_msg_telegram(my_channel.channel_name,start_at,duration, msg)
    if int(duration)<25:
        playlist=Playlists.objects.filter(id_channel=id_channel)
        channel_zone = ChannelZone.objects.get(id_channel=id_channel, zonename="2005")
        window=Windows.objects.filter(window_start__lte=start_at, window_end__gte=start_at).filter(id_playlist__in=playlist).last()
        update_status = -1
        if (window):
            send_msg_telegram2("📣 Short adbreak detected, updating the playlist ...")

            update_status = 0
            print("I'm heeeere")
            print(window.id_playlist.id_playlist)
            preview_window_end = window.window_end
            from datetime import timedelta
            print(start_at)
            #start_at += timedelta(days=0, hours=0, minutes=-2)
            start_at = datetime.datetime.strptime(start_at, "%Y-%m-%d %H:%M:%S")

            window.window_end = start_at
            endo = window.window_end
            window_duration = datetime.datetime.strptime(str(window.window_end), FMT) - datetime.datetime.strptime(str(window.window_start), FMT)
            window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
            window_duration = window_duration.strftime('%H%M%S00')
            window.window_duration = window_duration
            window.save()
            print(window)
            start_at =  start_at + datetime.timedelta(minutes=15)
            # start_at = datetime.datetime.strptime(start_at, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(minutes=2)

            new_window_duration = datetime.datetime.strptime(str(preview_window_end), FMT) - datetime.datetime.strptime(str(start_at), FMT)
            print("start_at"+str(start_at))
            print("preview_window_end"+str(preview_window_end))
            print("new window duration "+str(new_window_duration))
            new_window_duration = datetime.datetime.strptime(str(new_window_duration), '%H:%M:%S')
            new_window_duration = new_window_duration.strftime('%H%M%S00')
            new_window = Windows(id_playlist_id=window.id_playlist.id_playlist, window_start=start_at, window_end=preview_window_end, window_duration=new_window_duration )
            new_window.save()
            theid_playlist = window.id_playlist.id_playlist
            print(new_window)

            # Get the id of the adbreaks that are not Aired yet
            from django.db import connection
            cursor = connection.cursor()

            broadcastDateForQuery = str(window.id_playlist.broadcastdate).replace("-","")
            id_windowForQuery = window.id_window
            daydate = str(window.id_playlist.broadcastdate)
            daydate_xml = str(window.id_playlist.broadcastdate)
            daydate = daydate.replace("-","")
            # daydate0012 = daydate2

            # queries = """
            #                   SELECT Adspots_in_avail.id_avail FROM Avails
            #                   left join Adspots_in_avail on Adspots_in_avail.id_avail = Avails.id_avail
            #                   left join Verifs on ( Verifs.broadcastDate = %s and Verifs.trafficId = Adspots_in_avail.trafficId )
            #                   where ( Adspots_in_avail.positionInAvail = 1 and Verifs.airStatusCode <> 0001 ) and  Avails.id_window= %s
            #               """

            queries = """
                              SELECT Adspots_in_avail.id_avail FROM Avails
                              left join Adspots_in_avail on Adspots_in_avail.id_avail = Avails.id_avail
                              left join Verifs on ( Verifs.broadcastDate = %s and Verifs.trafficId = Adspots_in_avail.trafficId )
                              where Avails.id_window= %s
                          """

            data_tuple=(broadcastDateForQuery,id_windowForQuery)
            cursor.execute(queries,data_tuple)
            row = cursor.fetchall()
            if new_window:
                for r in row:
                    availoo = r[0]
                    print(r[0])
                    avail = Avails.objects.get(id_avail=r[0])
                    pprint(avail)
                    avail.id_window = new_window
                    windddd = avail.id_window
                    avail.avail_start = new_window.window_start
                    print("the new avail winodws : "+str(avail.avail_start ))
                    avail.save()


            new_version = str(Playlists.objects.get(id_playlist=theid_playlist).version)
            new_version_draft = str(Playlists.objects.get(id_playlist=theid_playlist).draft_version)
            max_version_draft = new_version_draft
            max_version = new_version
            # new_version = int(max_version)
            # max_version_draft = Playlists.objects.filter(broadcastdate=str(daydate)).aggregate(Max('draft_version')).get('draft_version__max')
            # new_version_draft = int(max_version_draft)
            xmlfilename = GenerateXMLfromDatabase(daydate_xml, id_channel, channel_zone.id_zone_channel, str(new_version), str(max_version_draft))
            path_inftp = my_channel.ftp_channel_name+'/schedules/'+channel_zone.region
            # if(uploadFTP4(useraccess.ftp_server, useraccess.ftp_port, useraccess.ftp_user, useraccess.ftp_password, xmlfilename , path_inftp)):
                # update_status = 1


        if(update_status == 1):
            send_msg_telegram2("✅ Playlist updated")
        # if(update_status == 0):
        #     send_msg_telegram2("### Something happened, playlist was NOT updated ###")


######################### Amine_section
def get_info_from_vast_file(url,duration):
    from bs4 import BeautifulSoup
    import concurrent.futures
    #dict_info={"Advertiser":"","Creative_id":"","Duration":"","MediaFile":{"id":"","delivery":"","type":"","width":"","height":"",
           # "scalable":"","maintainAspectRatio":"","url":""},"networkID":"","templateID":"","advertiserID":"","campaignID":"","insertionID":"",
        #  "siteID":"","pageID":"","formatID":""}
    list_id=[]
    result=int(duration)
    dict_all={}
    cte=0

    url = "http://ads.stickyadstv.com/www/delivery/swfIndex.php?reqType=AdsSetup&protocolVersion=2.0&zoneId=33011444&playerSize=720x576&_fw_gdpr=0&_fw_us_privacy=1---&_fw_did_idfv=8D9E1F6C-5A2B-7143-9038-62471DC58C24&_fw_atts=0&ltlg=48.856,2.352&_fw_deviceMake=settopbox&_fw_devicemodel=set-top_box&_fw_content_genre=generalist&_fw_content_rating=+14&_fw_is_lat=1&_fw_coppa=0&withOMSDK=false&_fw_gdpr=0&_fw_gdpr_consent=0&_fw_gdpr_consented_providers=0"
    print(url)
    my_headers = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 "}
    # page = requests.get(url,headers=my_headers)
    # soup = BeautifulSoup(page.content, "xml")
    # send_msg_telegram3(str(soup))

    #
    # url = 'http://207.180.254.4/vast.xml'
    # my_headers = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 "}

    # now1 = datetime.datetime.now()

    count = 0
    # page = requests.get(url)
    # soup = BeautifulSoup(page.content, "lxml")
    # start of 10k 10000 requests

    # while count<500:
    #     page = requests.get(url)
    #     # media = soup.find("MediaFile").text
    #     # print(soup)
    #     count = count + 1
    #     if count < 500:
    #         if soup == BeautifulSoup(page.content, "xml"):
    #             print ("same page")
    #         else:
    #             print(BeautifulSoup(page.content, "xml"))
    #             send_msg_telegram3(str(BeautifulSoup(page.content, "xml")))
    #
    #         soup = BeautifulSoup(page.content, "xml")
    #     print("running VAST request number: "+str(count))
    #
    # def request_url(url, req_num):
    #     response = requests.get(url)
    #     print(f'Request number : {req_num}')
    #     return response
    #
    # with concurrent.futures.ThreadPoolExecutor() as executor:
    #     results = [executor.submit(request_url, url, i) for i in range(1, 9500)]
    #     for f in concurrent.futures.as_completed(results):
    #         # count += 1
    #         try:
    #             print(f.result())
    #         # soup = BeautifulSoup(results[count].content, "lxml")
    #         except Exception as e:
    #             print(f'Error: {e}')
    # end of 10k 10000 requests

    # while result>3 and cte<5:
    # while false:
    #     #print('11111111111111')
    #     c=0
    #     print(list_id)
    #     url = "http://ads.stickyadstv.com/www/delivery/swfIndex.php?reqType=AdsSetup&protocolVersion=2.0&zoneId=33011444"
    #     # url="https://videoapi.smartadserver.com/ac?siteid=385419&pgid=1633029&fmtid=92859&ab=1&tgt=&oc=1&out=vast3&ps=1&pb=0&visit=S&vcn=s&vph=%5BplayerHeight%5D&vpw=%5BplayerWidth%5D&vpmt=%5BplaybackMethod%5D&skip=&mabd="+str(result)+"&ctd=%5BcontentDuration%5D&tmstp=%5Btimestamp%5D&cklb=1"
    #     print(url)
    #     my_headers = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 "}
    #     page = requests.get(url,headers=my_headers)
    #     # send_msg_telegram3(str(page))
    #     soup = BeautifulSoup(page.content, "xml")
    #     # send_msg_telegram3(str(soup))
    #
    #     try:
    #         dict_info={"Advertiser":"","Creative_id":"","Duration":"","MediaFile":{"id":"","delivery":"","type":"","width":"","height":"",
    #         "scalable":"","maintainAspectRatio":"","url":""},"networkID":"","templateID":"","advertiserID":"","campaignID":"","insertionID":"",
    #       "siteID":"","pageID":"","formatID":""}
    #
    #         dict_info['Advertiser']=soup.find("Advertiser").text
    #         dict_info['Creative_id']=soup.find("insertionID").text
    #         dict_info['Duration']=soup.find("Duration").text
    #         dict_info['MediaFile']['url']=soup.find("MediaFile").text
    #         dict_info['networkID']=soup.find_all('networkID')[0].text
    #         dict_info['templateID']=soup.find_all('templateID')[0].text
    #         dict_info['advertiserID']=soup.find_all('advertiserID')[0].text
    #         dict_info['campaignID']=soup.find_all('campaignID')[0].text
    #         dict_info['insertionID']=soup.find_all('insertionID')[0].text
    #         dict_info['siteID']=soup.find_all('siteID')[0].text
    #         dict_info['pageID']=soup.find_all('pageID')[0].text
    #         dict_info['formatID']=soup.find_all('formatID')[0].text
    #
    #         c=int(dict_info['Duration'].split(':')[-1].split('.')[0])
    #         print(c)
    #
    #         if dict_info['Creative_id'] not in list_id:# and result >c:
    #             list_id.append(dict_info['Creative_id'])
    #             dict_all['dict'+dict_info['Creative_id']]=dict_info
    #             result=result-c
    #         else:
    #             result=result
    #             cte=cte+1
    #         print('result!!!!!!!!',result)
    #         print(cte)
    #
    #     except :
    #         print(f'the url {url} is empty',url)
    #         cte=cte+1
    return dict_all

 
def task(request, url,duration,id_channel):
    #get the today date
    channel_id = id_channel
    channeldata = Channel.objects.get(id_channel=channel_id)
    # useraccess = Useraccess.objects.get(id_user=request.session['id_user'])
    os.system("echo 'inside the task function' > a_log/log.txt")
    to_day_date=datetime.datetime.now().strftime('%Y-%m-%d')
    start_date=datetime.datetime.strptime(to_day_date+' 00:01:00', "%Y-%m-%d %H:%M:%S")
    end_date=datetime.datetime.strptime(to_day_date+' 23:59:00', "%Y-%m-%d %H:%M:%S")
    now=datetime.datetime.now()
    now_str=str(now).split('.')[0]

    now_minus2=datetime.datetime.now() - datetime.timedelta(minutes=2)
    now_minus2=str(now_minus2).split('.')[0]

    now_plus10=datetime.datetime.now() + datetime.timedelta(minutes=7)
    now_plus10=str(now_plus10).split('.')[0]


    #check in playlist table if today_date exists
    check_value = Playlists.objects.filter(broadcastdate=to_day_date)
    #if not exist.
    if check_value:
        #if there is a playlist = get the max version of today (v) and
        #call to duplicate function
        Playlist = Playlists.objects.filter(broadcastdate=to_day_date).order_by('-version')[0]
        max_version = Playlist.version
        # max_version = Playlists.objects.filter(broadcastdate=to_day_date).aggregate(Max('version')).get('version__max')
        new_version = int(max_version)+1
        Playlist.version = new_version
        Playlist.save()
        current_traffic_total = 0
        all_windows = Windows.objects.filter(id_playlist=Playlist)
        for wind in all_windows:
            all_avails = Avails.objects.filter(id_window=wind.id_window)
            for av in all_avails:
                all_spots = AdspotsInAvail.objects.filter(id_avail=av.id_avail)
                for ad in all_spots:
                    current_traffic_total+=1


        #update it with (v+1) in the same line

        try:
            window=Windows.objects.get(id_playlist=Playlist, window_start__lte=now_str, window_end__gte=now_str)
        except Windows.DoesNotExist:
            window=Windows.objects.filter(id_playlist=Playlist, window_start__lte=now_str, window_end__gte=now_str)

        # window=Windows.objects.get(id_playlist=Playlist, window_start__lte=now_str, window_end__gte=now_str)
        if window:
            id_window=window.id_window
            avail_start = window.window_start
            numberofavails = Avails.objects.filter(id_window=window.id_window).count()
            availinwindow = int(numberofavails) + 1
            FMT = '%Y-%m-%d %H:%M:%S'
            window_duration = datetime.datetime.strptime(str(window.window_end), FMT) - datetime.datetime.strptime(str(window.window_start), FMT)
            window_duration = datetime.datetime.strptime(str(window_duration), '%H:%M:%S')
            window_duration = window_duration.strftime('%H%M%S00')

        else:
            #creation of window,
            #checking if there is a window before 2 minutes:
            try:
                prev_window=Windows.objects.get(id_playlist=Playlist, window_start__lte=now_minus2, window_end__gte=now_minus2)
            except Windows.DoesNotExist:
                prev_window=Windows.objects.filter(id_playlist=Playlist, window_start__lte=now_minus2, window_end__gte=now_minus2)

            if prev_window:
                new_widdow_start = prev_window.window_end
            else:
                new_widdow_start = now_minus2

            #checking if there is a window after 10 minutes:
            try:
                next_window=Windows.objects.get(id_playlist=Playlist, window_start__lte=now_plus10, window_end__gte=now_plus10)
            except Windows.DoesNotExist:
                next_window=Windows.objects.filter(id_playlist=Playlist, window_start__lte=now_plus10, window_end__gte=now_plus10)
            if next_window:
                new_widdow_end = next_window.window_start
            else:
                new_widdow_end = now_plus10
            window_duration = '00120000'




            #calcul of window end - window start
            #creation of the window:
            new_window = Windows(id_playlist_id=Playlist.id_playlist, window_start=new_widdow_start, window_end=new_widdow_end, window_duration=window_duration )
            new_window.save()
            id_window=new_window.id_window
            avail_start = new_window.window_start
            availinwindow = 1

            #avail creation
        Avail = Avails(id_window_id=id_window, avail_start=avail_start, availinwindow=availinwindow, datetime=now )
        Avail.save()


    if not check_value:
        #if there is no playlist, create a new one with version = 1
        Playlist = Playlists(id_channel_id=id_channel ,version=1, broadcastdate=to_day_date, start_date=start_date, end_date=end_date, creation_datetime=now, id_zone_channel_id=1,is_draft='0',draft_version='0')
        Playlist.save()
        #-- create one big window of 24h interval
        Window = Windows(id_playlist_id=Playlist.id_playlist, window_start=str(start_date), window_end=str(end_date), window_duration='23580000' )
        Window.save()
        new_version = 1
        #-- create avail
        current_traffic_total = 0
        id_window=Window.id_window
        avail_start = Window.window_start
        Avail = Avails(id_window_id=id_window, avail_start=avail_start, availinwindow=1, datetime=now )
        Avail.save()

    dict_all=get_info_from_vast_file(url,duration)
    positioninavail = 0
    for key,value in dict_all.items():
        positioninavail+=1
        # Creative_id=value['Creative_id']
        Creative_url=value['MediaFile']['url']
        Creative_url = Creative_url.replace(" ","")
        try:
            adpost=Adspots.objects.get(url_from_vast=Creative_url)
        except Adspots.DoesNotExist:
            adpost=Adspots.objects.filter(url_from_vast=Creative_url)

        if adpost:
            current_traffic_total += 1
            AdspotsInAv = AdspotsInAvail(id_avail_id=Avail.id_avail, id_adspot_id=adpost.id_adpost, positioninavail=positioninavail, trafficid=current_traffic_total)
            AdspotsInAv.save()

        else:
            creative_id = value['Creative_id']
            url=value['MediaFile']['url']
            if not Pending.objects.filter(creative_id=creative_id,url=url).exists():
                panding=Pending(creative_id=creative_id,url=url)
                panding.save()
                send_msg_telegram("New Creative Detected in VAST <a href='"+url+"'>(Video_link)</a>")


    #hard-coded to France / 2005
    zonename = "2005"
    channel_zone = ChannelZone.objects.get(id_channel=channel_id, zonename=zonename)
    # file generation + uploadFTP
    xmlfilename = GenerateXMLfromDatabase(to_day_date, channel_id, channel_zone.id_zone_channel, str(new_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)

 
def loop_vast(request, url,duration,id_channel):

    #     import urllib
    #
    # # link = "http://www.somesite.com/details.pl?urn=2344"
    #     f = urllib.urlopen(url)
    #     myfile = f.read()
    #     send_msg_telegram2("Vast content:"+str(myfile))



    dict_all=get_info_from_vast_file(url,duration)
    positioninavail = 0
    for key,value in dict_all.items():
        creative_id = value['Creative_id']
        url=value['MediaFile']['url']
        if not Pending.objects.filter(creative_id=creative_id,url=url).exists():
            panding=Pending(creative_id=creative_id,url=url)
            panding.save()
            send_msg_telegram2("New Creative Detected in VAST <a href='"+url+"'>(Video_link)</a>")

########################################################### End amine section
 
def send_adspot(DST_FOLDER ,SRC_FILEPATH , ) :
    import os
    import ftplib
    FTP_ADDR = "uk06.tmd.cloud"
    USERNAME = "testftp@epgsano.com"
    PASSWORD = "I?#=s3FfnSu_"

    """Transfer file to FTP."""

    # Connect
    print("Connecting to FTP...")
    session = ftplib.FTP(FTP_ADDR, USERNAME, PASSWORD)


    # Change to target dir
    chdir(session, dirpath=DST_FOLDER)

    # Transfer file
    print("Transferring %s and storing as %s..." % (os.path.basename(SRC_FILEPATH), SRC_FILEPATH))
    with open(SRC_FILEPATH, "rb") as file:
        session.storbinary('STOR %s' % os.path.basename(SRC_FILEPATH), file)

    print("Closing session.")
    # Close session
    session.quit()


def chdir(session, dirpath):
    """Change to directory."""
    if directory_exists(session, dirpath) is False: # (or negate, whatever you prefer for readability)
        print("Creating folder %s..." % dirpath)
        folders = dirpath.split('/')

        session.mkd(folders[0])
        session.mkd(folders[0]+'/'+folders[1])

    print("Changing to directory %s..." % dirpath)
    session.cwd(dirpath)


def directory_exists(session, dirpath):
    """Check if remote directory exists."""
    filelist = []
    session.retrlines('LIST',filelist.append)
    for f in filelist:
        if f.split()[-1] == dirpath and f.upper().startswith('D'):
            return True
    return False
 

def send_msg_telegram(channel_name,start_at,duration, msg):
    message = """
    ====================
    New Adbreak Detected: ["""+msg+"""]
    - channel: """+channel_name+"""
    - Time: ["""+start_at+"""]
    - Duration : ["""+duration+"""]
    ====================
    """
    telegram_settings = settings.TELEGRAM
    bot = telegram.Bot(token=telegram_settings['bot_token'])
    bot.send_message(chat_id="@%s" % telegram_settings['channel_name'],
    # bot.send_message(chat_id=telegram_settings['chat_id'],
        text=message, parse_mode=telegram.ParseMode.HTML)
 

def send_msg_telegram2(msg):
    message = """
    ["""+msg+"""]
    """
    telegram_settings = settings.TELEGRAM
    bot = telegram.Bot(token=telegram_settings['bot_token'])
    bot.send_message(chat_id="@%s" % telegram_settings['channel_name'],
        text=message, parse_mode=telegram.ParseMode.HTML)


def send_msg_telegram3(msg):
    message = """
    ["""+msg+"""]
    """
    telegram_settings = settings.TELEGRAM
    bot = telegram.Bot(token=telegram_settings['bot_token'])
    bot.send_message(chat_id="@%s" % telegram_settings['channel_name'],
        text=message)


def send_ad_telegram(start_at, adspot):
    message = """
    ====================
    Adspot detected: """+adspot+"""
    - Time: ["""+start_at+"""]
    ====================
    """
    telegram_settings = settings.TELEGRAM
    bot = telegram.Bot(token=telegram_settings['bot_token'])
    bot.send_message(chat_id="@%s" % telegram_settings['channel_name'],
        text=message, parse_mode=telegram.ParseMode.HTML)


def directory_exists(session, dirpath):
    """Check if remote directory exists."""
    filelist = []
    session.retrlines('LIST',filelist.append)
    for f in filelist:
        if f.split()[-1] == dirpath and f.upper().startswith('D'):
            return True
    return False


def ads_brand(session):
    from django.db.models import Count
    import random
    channel = Channel.objects.filter(id_user=session)
    ads = Adspots.objects.filter(id_channel__in = channel).values('id_brand').annotate(count = Count('id_brand')).order_by('-count')
    chars = '0123456789ABCDEF'
    color = ['#'+''.join(random.sample(chars,6)) for i in range(len(ads))]
    label = []
    data = []

    for ad in list(ads ):
        label.append(Brand.objects.get(pk=ad['id_brand']).brand_name)
        data.append(round(ad['count'] * 100 / 23,2 ))

    brand  =     verifs = {  'label' : label ,
                'data'  : data ,
                'color' : color
            }

    return brand


def campaign_pacing(request):
    pacing = Campaigns.objects.filter(id_user=1).values_list('pacing')
    pacing = [p[0] for p in pacing ]

    result = { 'true'  : pacing.count(True) ,
               'false' : pacing.count(False) ,
                'purcent' : pacing.count(True) * 100 / len(pacing)
            }
    return result


def campaign_avtive(request):
    from datetime import datetime
    import random
    etat = Campaigns.objects.filter(id_user = request.session['id_user'] ).exclude(start_day__exact='' ).exclude(end_day__exact='').values_list('start_day','end_day' )

    etat = [(datetime.strptime(date[0], '%Y-%m-%d'),datetime.strptime(date[1], '%Y-%m-%d')) for date in etat ]
    now = datetime.now()
    finished =0
    not_start = 0
    start = 0
    for date in etat :
        if now < date[0]:
            not_start += 1
        elif now < date[0] :
            start += 1
        else :
            finished += 1
    data = [finished , start , not_start ]
    chars = '0123456789ABCDEF'
    color = ['#'+''.join(random.sample(chars,6)) for i in range(3)]
    label = ['Finished' , 'In progress' , 'Not started']

    result = {
        'label' : label ,
        'data'  : data ,
        'color' : color
    }

    return result


def campign_brand(request):
    from django.db.models import Count
    import random

    brand = Campaigns.objects.filter(id_user=request.session['id_user']).values('id_brand').annotate(dcount=Count("id_brand")).order_by('-dcount')
    data = []
    label = []
    chars = '0123456789ABCDEF'
    color = ['#'+''.join(random.sample(chars,6)) for i in range(len(brand))]


    for i in brand :
        label.append(Brand.objects.get(pk=i['id_brand']).brand_name)
        data.append(i['dcount'])

    result = {
        'label' : label ,
        'data'  : data ,
        'color' : color
    }

    return result


def channels_ads(request):
    from django.db.models import Count
    import random
    channels = Channel.objects.filter(id_user=request.session['id_user'])
    ads = Adspots.objects.filter(id_channel__in = channels).values('id_channel').annotate(dcount=Count('id_channel')).order_by('-dcount')
    chars = '0123456789ABCDEF'
    color = ['#'+''.join(random.sample(chars,6)) for i in range(len(ads))]
    label= []
    data=[]
    for ad in ads :
        label.append(Channel.objects.get(id_channel=ad['id_channel']).channel_name)
        data.append(ad['dcount'])

    result={
        'label' : label ,
        'data'  : data ,
        'color' : color
    }

    return result


def channels_adbreak(request):
    import random
    import pandas as pd
    from django.db.models import Count
    channels = Channel.objects.filter(id_user=request.session['id_user']).values_list('channel_name')
    channels = [channel[0] for channel in channels]
    data = AdbreakHistory.objects.filter(channel_name__in=channels).values_list('channel_name','day','time')
    df = pd.DataFrame(data,columns=['Channel' , 'Day' ,'Time'])

    label = []
    data = []
    channels = list(set(df['Channel']))
    chars = '0123456789ABCDEF'
    color = ['#'+''.join(random.sample(chars,6)) for i in range(len(channels))]
    for channel in channels :
        df2 = df.loc[df['Channel']==channel].groupby(by=['Channel','Day']).count()
        data.append(min(df2['Time']))
        label.append(channel)
    result={
        'label' : label ,
        'data'  : data ,
        'color' : color
    }

    return result


def channels_sfr(request):
    import random
    import pandas as pd

    channels = Channel.objects.filter(user=request.user).values_list('sfr_channel_name')
    channels = [channel[0] for channel in channels]

    sfr = SfrAnalytics.objects.filter(sfr_channel_name__in = channels).values_list('sfr_channel_name' , 'purcent')

    df = pd.DataFrame(sfr,columns=['Channel','Purcent'])
    purcent  = [float(i) for i in df['Purcent']]
    df['Purcent'] = purcent
    total_users = int(Impressions.objects.get(pk=2).total_users)
    market_share_purcent = float(Impressions.objects.get(pk=2).market_share_purcent)

    df2 =  df.groupby(by=['Channel']).mean()
    label = list(df2.index)
    data = [i[0]*total_users*market_share_purcent for i in df2.values ]

    chars = '0123456789ABCDEF'
    color = ['#'+''.join(random.sample(chars,6)) for i in range(len(data))]
    result={
        'label' : label ,
        'data'  : data ,
        'color' : color
    }

    return result


def charts_test(request):
    channels = Channel.objects.filter(user=request.user)
    return render(request,'core/charts.html',{'channels':channels})


def load_charts(request):

    channel_id = request.GET.get('channel')
    region = request.GET.get('region')
    daydate = request.GET.get('daydate')
    print("load_charts ====== " , daydate  )
    # ====================================
    # ====================================
    #code from index to clean
    if (daydate != None):
        day = daydate
        day = datetime.datetime.strptime(day, '%Y-%m-%d')
        dayformat = day.strftime('%Y-%m-%d')

    else:
        day =  datetime.datetime.now()
        dayformat = day.strftime('%Y-%m-%d')

    if (region != None):
        zonename = ChannelZone.objects.filter(zonename__contains=region)[0].region
        print(zonename)
    else:
        zonename = "France"

    # day = datetime.datetime.strptime(day, '%Y-%m-%d')
    # dayformat = day.strftime('%Y-%m-%d')
    #user = 1 ==> make it dynamique
    if (channel_id != None):
        channels_sfr = list(Channel.objects.filter(user=request.user, id_channel = channel_id).values_list("sfr_channel_name",flat=True))
    else:
        Channel_sfr = list(Channels.objects.filter(user=request.user).values_list("sfr_channel_name",flat=True))

    val = Analytics.objects.filter(sfr_channel_name__in=channels_sfr, region=zonename ,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 = Channel.objects.filter(user=request.user).values_list('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 = ChannelZone.objects.filter(zonename =line.zonename)[0]
            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 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'] = '-'

            elif str(line.airStatuscode) == '1005':
                p['status'] = 'Not aired yet'
                p['nb_wach'] = '-'
                p['color'] = '#c7c7c7b3'


            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 = Channel.objects.filter(id_user=request.session['id_user'])
    #activites = []
    print("end of loadchart")
    return JsonResponse({'labels': labels, 'result':result, 'channels_sfr':channel_sfr,'color':color})
    # return render(request, "core/load_charts.html", {'labels': labels, 'result':result ,
    #                                                         'channels_sfr':channel_sfr,'color':color})

    #this function should verify the objext we create


def insertion_verifs(request):
    #playlist = Playlists.objects.get(pk=id_playlist)
    channels = Channel.objects.filter(id_user=request.session['id_user'])
    #region = ChannelZone.objects.get(id_zone_channel=playlist.id_zone_channel.id_zone_channel)
    region ='2005'
    ftp_channel_name = channels.ftp_channel_name
    networkname = channels.networkname
    zonename = region
    broadcastdate = datetime.strftime(datetime.now() , '%Y%m%d')
    result = Verifs.objects.filter(networkname=networkname,zonename=zonename,broadcastDate=broadcastdate).last()
    #d = playlist.broadcastdate
    broadcastDate_verif = broadcastdate
    #win = Windows.objects.filter(id_playlist=playlist.id_playlist).values_list('id_window', flat=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()


def verifs_timer_insert(request):
    import sched, time
    s = sched.scheduler(time.time, time.sleep)
    s.enter(300, 1, insertion_verifs, (request,))
    s.run()


def fetch_playlist_data(url):
    from datetime import datetime, timedelta
    response = requests.get(url)
    if response.status_code == 200:
        head_data = response.json()[0]
        playlist_data = response.json()[0]['data']
        # return head_data['id']
        processed_data = [
            {
                **item,
                'head':head_data['id'],
                'date':head_data['id'],
                'id_start_combined': f"{head_data['id']} {item.get('start', '')}",
                'start_minus_one_week': (datetime.strptime(f"{head_data['id']} {item.get('start', '')}", '%Y-%m-%d %H:%M:%S.%f') - timedelta(weeks=1)).strftime('%Y-%m-%d %H:%M:%S.%f')
                }
            for item in playlist_data if "isPub" in item and item["isPub"] == '1'
        ]
        return processed_data
    else:
        return None


def create_playlist_xml(data):
    import xml.etree.ElementTree as ET
    from datetime import datetime
    import uuid
    import random
    import ast
    # print("Playlist Data: ",data)
    # Create the root element
    playlist = ET.Element("playlist")
    # print("PLAY LIST INFORMATIONS: ",data)
    # Add attributes to the root element
    playlist_date = data["date"]
    print("Date: ",playlist_date)
    synthesia_id = data['id'][0]
    synthesia_sub_id = data["subId"][0]

    playlist.set("playlistDate", playlist_date)
    playlist.set("synthesiaId", synthesia_id)
    playlist.set("synthesiaSubId", synthesia_sub_id)

    # Create the "data" element
    data_element = ET.SubElement(playlist, "data")
    # Generate random videos for replacement
    # video_list = ['ISLA_30s_RAMADAN3.mp4','LEGO_minecraft.mp4','LEGO_starwars.mp4','Lego_1house.mp4','out_Zakia_new_v3.mp4']


    # auto fill xml
    # Loop through the provided data and add each item to the XML
    total_duration = 0
    alma_replacement_ads = AlmaAds.objects.filter(name="TGTG_30_16x9.mp4")
    print(alma_replacement_ads.count())
    
    # print(alma_replacement_ads)
    for video in alma_replacement_ads:
        
        # check if ads will fill in alma ad interval
        #! This comparison should be bitween video duration and the most used video in our api
        # print("Duration type : ", int(data['duration'][0]))
        print(total_duration)
        print(video.duration)
        if total_duration + int(video.duration) <= int(data['duration'][0]):
            print("we Have new Ad :", int(data['duration'][0]))
            media_element = ET.SubElement(data_element, "media")
            media_element.set("id", str(video.id))   # uniquly generated id
            media_element.set("path", f"{video.ads_path}")  # replacement ad path
            media_element.set("duration", str(video.duration)) # ad duration
            print("insert ad: ",video.name)
            total_duration += video.duration #update total duration
            print(f"We still have :{int(data['duration'][0]) - total_duration} Empty")
        else:
            
            print(f"Done and we have  :{int(data['duration'][0]) - total_duration} Empty")
            # insert filler
   
    # # Create the XML string
    xml_declaration = '<?xml version="1.0" encoding="UTF-8"?>\n'
    xml_string = xml_declaration + ET.tostring(playlist, encoding="utf-8").decode()

    base_dir = "/var/www/html/DAI27/Adtlas_DAI/files/vast/pitchon"
    # Get current date for folder name
    today = datetime.now()
    date_folder = today.strftime("%Y-%m-%d")
    # Create full path including date folder
    folder_path = os.path.join(base_dir, date_folder)
    os.makedirs(folder_path, exist_ok=True)

    # Generate unique filename with timestamp and UUID
    filename = f"{str(datetime.now()).replace(' ','_').replace(':','_')}_{str(uuid.uuid4())}.xml"
    file_path = os.path.join(folder_path, filename)

    # Write the XML to a file
    # file_path = f"/var/www/html/DAI27/Adtlas_DAI/playlists/new/pitchon/{str(datetime.now()).replace(' ','_').replace(':','_')}_{str(uuid.uuid4())}.xml"
    with open(file_path, "w",encoding='utf-8') as xml_file:
        xml_file.write(xml_string)

    print("Uploading to FTP...")
    # ftp_server = 'almatv-stor.vizionr.fr'
    # username = 'almatv'
    # password = 'fs!z_Df$35-dF'

    remote_dir = '/PLAYLIST'
    # port=10120
    ftp_server = "tvpitchoun-stor.easytools.tv"
    username = "advmanager"
    password = "DFG$_Rv!934"
    port = 21


    # upload XML file to FTP
    ftp_client = FTPClient(ftp_server=ftp_server, port=port, username=username, password=password)
    ftp_client.upload_file(file_path,remote_dir)
    total_duration = 0 #set total duration 0 for next iteration



# ============================================================================
# Error Views
# ============================================================================

# Utility Functions
def handler404(request, exception):
    """
    Custom 404 error handler.
    
    Args:
        request: HTTP request object
        exception: Exception that caused 404
        
    Returns:
        HttpResponse: 404 error page
    """
    # Check if the request is an AJAX request
    if is_ajax_request(request):
        return JsonResponse({
            'success': False,
            'type': 'error',
            'message': _('Page not found'),
            'title': 'Not Found'
        }, status=404)
    # render 404 page
    return render(request, "errors/404.html", status=404)


def handler500(request):
    """
    Custom 500 error handler.
    
    Args:
        request: HTTP request object
        
    Returns:
        HttpResponse: 500 error page
    """
    # Check if the request is an AJAX request
    if is_ajax_request(request):
        return JsonResponse({
            'success': False,
            'type': 'error',
            'message': _('Internal server error'),
            'title': 'Server Error'
        }, status=500)
    # render 500 page
    return render(request, "errors/500.html", status=500)


def handler403(request, exception):
    """
    Custom 403 error handler.
    
    Args:
        request: HTTP request object
        exception: Exception that caused 403
        
    Returns:
        HttpResponse: 403 error page
    """
    # Check if the request is an AJAX request
    if is_ajax_request(request):
        return JsonResponse({
            'success': False,
            'type': 'error',
            'message': _('Forbidden'),
            'title': 'Access Denied'
        }, status=403)
    # render 403 page
    return render(request, "errors/403.html", status=403)


def handler400(request, exception):
    """
    Custom 400 error handler.
    
    Args:
        request: HTTP request object
        exception: Exception that caused 400
        
    Returns:
        HttpResponse: 400 error page
    """
    # Check if the request is an AJAX request
    if is_ajax_request(request):
        return JsonResponse({
            'success': False,
            'type': 'error',
            'message': _('Bad request'),
            'title': 'Bad Request'
        }, status=400)
    # render 400 page
    return render(request, "errors/400.html", status=400)
