from django.shortcuts import render
import requests
from http.client import HTTPResponse
from scipy.interpolate import make_interp_spline
from matplotlib.dates import DayLocator, HourLocator, DateFormatter, drange
import numpy as np
import datetime
import pandas as pd
from django.core.files.storage import FileSystemStorage
from .models import Project, Campaign
from tablib import Dataset
from .utils import get_plot
from .resources import ProjectResource
from django.core.paginator import Paginator
from .filters import ProjectFilter
from django.views.generic import TemplateView
from chartjs.views.lines import BaseLineChartView
from django.db.models import Sum
from .forms import SubmissionForm
from django.core.mail import send_mail


    
class LineChartJSONView(BaseLineChartView):
    
    def get_labels(self):
        r=requests.get('http://api.igadgetshub.com/api/'+project_slug)
        results=r.json()
        """Return 7 labels for the x-axis."""
        return [results[0]['launched-at'],results[0]['state-changed-at'],results[0]['deadline']]

    def get_providers(self):
        """Return names of datasets."""
        return ["Central", "Eastside"]

    def get_data(self):
        """Return 3 datasets to plot."""

        return [[75, 44, 92, 11, 44, 95, 35],
                [41, 92, 18, 3, 73, 87, 92]]


line_chart = TemplateView.as_view(template_name='project-details.html')
line_chart_json = LineChartJSONView.as_view()



# Create your views here.
def home(request):
    subscribed_projects=Project.objects.filter().order_by('-id')[:6]
    message=""
    if request.method == 'GET': 
        submission_form = SubmissionForm()
        total_funds = 8411428
        total_pledges = 84925
    else:
        submission_form = SubmissionForm(request.POST)
        if submission_form.is_valid():
            subject = "Project name: "+submission_form.cleaned_data['projectname']
            message = "Creator's name: "+submission_form.cleaned_data['name']+"\n"+"Project Name: "+submission_form.cleaned_data['projectname']+"\n"+"url: "+submission_form.cleaned_data['url']+"\n"+"Know igadgets from: "+submission_form.cleaned_data['social']
            sender = submission_form.cleaned_data['email']

            recipients = ['team@igadgetshub.com']
            send_mail(subject, message, sender, recipients)
            creator = submission_form.save()
            message="Your project was successfully saved, We will contact you soon"
        
    return render(request, 'projects/homepage.html', {
                "projects":subscribed_projects,
                "total_funds":total_funds,
                "total_pledges":total_pledges,
                "form":submission_form,
                "message":message
                })



# Create your views here.
def index(request):
    subscribed_projects=Project.objects.all()    
    project_filter = ProjectFilter(request.GET, queryset=subscribed_projects)
    paginator = Paginator(project_filter.qs, 24)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context={
        'filter' : project_filter,
        'page_obj': page_obj
    }
    return render(request, 'projects/index.html',context)

    
def project_details(request, project_slug):
        r=requests.get('http://api.igadgetshub.com/api/'+project_slug)
        results=r.json()
        df = pd.DataFrame(results)
        x=np.array([results[0]['launched-at'],results[0]['state-changed-at'],results[0]['deadline']])
        y=np.array([0,results[0]['goal'],results[0]['pledged']])
       
        chart=get_plot(x,y)
        analysis=df.to_html()
        return render(request, 'projects/project-details.html', {
             "project_slug":project_slug, 'results':results, 'analysis':analysis, 'chart':chart
            })
    
def search(request):
    
    search_term = request.GET.get('q')
    if "http" in search_term:
        list=search_term.split('/')
        search_term=list[5]
         
    for x in range(1,6):
        r=requests.get('http://api.igadgetshub.com/api/'+search_term+'&page='+str(x))
        status=r.raise_for_status()
        if r.status_code != 204:
            results=r.json()
            
            
            
    for i in results:
            resultdata = Campaign(
                projectid = i['id'],
                name = i['name'],
                slug = i['slug'],
                blurb = i['blurb'],
                category = i['category'],
                pledged = i['pledged'],
                goal = i['goal'],
                currency = i['currency'],
                backers = i['backers'],
                image = i['image'],
                location = i['location'],
                creator = i['creator'],
                status = i['status'],
                deadline = i['deadline'],
                statechengedat = i['state-changed-at'],
                launchedat = i['launched-at'],
                url = i['url']
            )
            resultdata.save()
            all_campaigns = Campaign.objects.all().order_by('-id')
    
    return render(request, 'projects/search.html',{'results':all_campaigns, 'status':status, 'term':search_term})



def Import_Excel_pandas(request):
     
    if request.method == 'POST' and request.FILES['myfile']:      
        myfile = request.FILES['myfile']
        fs = FileSystemStorage()
        filename = fs.save(myfile.name, myfile)
        uploaded_file_url = fs.url(filename)              
        empexceldata = pd.read_excel(filename)        
        dbframe = empexceldata
        for dbframe in dbframe.itertuples():
            obj = Project.objects.create(projectid=dbframe.projectid,image=dbframe.image, projectname=dbframe.projectname,
                                            slug=dbframe.slug, projectlink=dbframe.projectlink, status=dbframe.status, nobackers=dbframe.nobackers,
                                            pledged=dbframe.pledged, category=dbframe.category, platform=dbframe.platform)           
            obj.save()
        return render(request, 'projects/import_excel_db.html', {
            'uploaded_file_url': uploaded_file_url
        })   
    return render(request, 'projects/import_excel_db.html',{})


def Import_excel(request):
    if request.method == 'POST' :
        Project =ProjectResource()
        dataset = Dataset()
        new_project = request.FILES['myfile']
        data_import = dataset.load(new_project.read())
        result = ProjectResource.import_data(dataset,dry_run=True)
        if not result.has_errors():
            ProjectResource.import_data(dataset,dry_run=False)        
    return render(request, 'projects/import_excel_db.html',{})



#from typing_extensions import dataclass_transform
def get_projects(project_slug):
   url = 'http://api.igadgetshub.com/api/{project_slug}'.format(
        project_slug=project_slug)
   resp = requests.get(url)
   resp.raise_for_status()
   data = resp.json()
   df = pd.DataFrame(data, columns=[
        'name', 'category', 'pledged', 'goal', 'backers', 'state-changed-at', 'launched-at'
   ])
   df['state-changed-at'] = pd.to_datetime(df['state-changed-at'], unit='s')
   df['launched-at'] = pd.to_datetime(df['launched-at'], unit='s')
   df.set_index('state-changed-at', inplace=True)
   return df


def analysis(request):
    labels = []
    data = []

    queryset = Campaign.objects.values('status').annotate(Sum('pledged'))
    for campaign in queryset:
        labels.append(campaign['status'])
        data.append(campaign['pledged__sum'])
    
    return render(request, 'projects/pie_chart.html', {
        'labels': labels,
        'data':data,
    })