from django.shortcuts import render, redirect, HttpResponse
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
import json
from .models import Userdata, ip_address
import threading
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.core.mail import send_mail
import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import requests
import geocoder
import folium
from oauth2client import client
gauth = GoogleAuth()
content = os.environ.get('token')
gauth.credentials = client.Credentials.new_from_json(content)
if gauth.access_token_expired:
    # Refresh them if expired
    gauth.Refresh()
else:
    gauth.Authorize()
DRIVE = GoogleDrive(gauth)


def torrentDownloader(link):
    print(link)


@csrf_exempt
def movieDownloader(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        movie = data['movie']
        tmdbId = data['tmdbId']
        torrentLink = data['torrentLink']
        print(movie,tmdbId)
        try:
            t1 = threading.Thread(target=torrentDownloader, args=(torrentLink,))
            t1.start()
        except:
            pass
        return HttpResponse(json.dumps({'status': 'success'}), content_type='application/json')


@csrf_exempt
def index(request):
    context = {
        'user': request.user
    }
    return render(request, 'index.html', context=context)


@csrf_exempt
def user_login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            messages.success(request, ('You have been logged in!'))
            # print('logged in')
            return redirect('index')
        else:
            messages.success(request, ('Error logging in - please try again.'))
            # print('error logging in')
            return render(request, 'login.html')
    return render(request, 'login.html')


@csrf_exempt
def sign_up(request):
    if request.method == 'POST':
        name = request.POST['name']
        email = request.POST['email']
        password = request.POST['password']
        password2 = request.POST['password1']
        user = authenticate(request, email=email, password=password)
        if user is not None and password == password2:
            login(request, user)
            messages.success(request, ('You have been logged in!'))
            # print('logged in')
            return redirect('index')
        elif user is None and password == password2:
            user = User.objects.create_user(username=email, email=email, password=password, first_name=name)
            user.save()
            messages.success(request, ('Created new user!'))
            login(request, user)
            folder = '1N3uD81zuXY_23esOFWRvN2Fp4zEbCrzy'
            new_folder = DRIVE.CreateFile({'title': name, 'mimeType': 'application/vnd.google-apps.folder', 'parents': [{'id': folder}]})
            new_folder.Upload()
            new_folder.InsertPermission({'type': 'user', 'value': email, 'role': 'writer'})
            dataObj = Userdata(user_id=request.user, folder=new_folder['id'])
            dataObj.save()
            # print('new user created')
            return redirect('index')
        else:
            pass
    return render(request, 'signup.html')


@csrf_exempt
@login_required
def user_logout(request):
    logout(request)
    messages.success(request, ('You have been logged out!'))
    # print('logged out')
    return redirect('index')


@csrf_exempt
@login_required
def upload(request):
    return render(request, 'upload.html')


@csrf_exempt
@login_required
def uploader(request):
    if request.method == 'POST':
        folder = 'files/'
        file = request.FILES['file']
        title = request.POST['title']
        if title == '':
            title = file.name
        if file.name == '':
            return redirect('/upload/')
        folder_id = Userdata.objects.get(user_id=request.user).folder
        thread = threading.Thread(target=GoogleDriveUpload, args=(title, folder_id, file))
        thread.start()
        thread.join()
        return redirect('/upload/')


@csrf_exempt
@login_required
def list(request):
    files = []
    folders = []
    folder_id = Userdata.objects.get(user_id=request.user).folder
    list_files = DRIVE.ListFile({'q': "'%s' in parents and trashed=false" % folder_id}).GetList()
    for file in list_files:
        if file['title'] != 'Deleted' and file['title'] != 'DeletedFile' and file['mimeType'] != 'application/vnd.google-apps.folder':
            files.append([file['title'], file['embedLink'], file['id'], file["iconLink"].replace("/16/", "/32/"), file["webContentLink"]])
        elif file['mimeType'] == 'application/vnd.google-apps.folder':
            folders.append([file['title'], "/list/"+file['id'][::-1]])
        else:
            pass
    context = {'files': files, 'folders': folders, 'back': False}
    return render(request, 'list.html', context=context)


@csrf_exempt
@login_required
def folder_list(request, id):
    files = []
    folders = []
    folder_id = id[::-1]  # Userdata.objects.get(user_id=request.user).folder
    list_files = DRIVE.ListFile({'q': "'%s' in parents and trashed=false" % folder_id}).GetList()
    for file in list_files:
        if file['title'] != 'Deleted' and file['mimeType'] != 'application/vnd.google-apps.folder':
            files.append([file['title'], file['embedLink'], file['id'], file["iconLink"].replace("/16/", "/32/"), file["webContentLink"]])
        elif file['mimeType'] == 'application/vnd.google-apps.folder':
            folders.append([file['title'], "/list/"+file['id'][::-1]])
        else:
            pass
    context = {'files': files, 'folders': folders, 'back': True}
    return render(request, 'list.html', context=context)


@csrf_exempt
@login_required
def deleteFile(request):
    if request.method == 'POST':
        file_id = json.loads(request.body)['file_id']
        file = DRIVE.CreateFile({'id': file_id})
        file.Trash()
        return HttpResponse(json.dumps({'status': 'success'}), content_type='application/json')


@csrf_exempt
@login_required
def renameFile(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        file_id = data['file_id']
        new_name = data['new_name']
        file = DRIVE.CreateFile({'id': file_id})
        file.FetchMetadata(fields="title")
        file['title'] = new_name
        file.Upload()
        return HttpResponse(json.dumps({'status': 'success'}), content_type='application/json')


def ipGetter(request):
    ip = request.GET.get('ip', '')
    ipIn = ip_address.objects.filter(ip=ip).first()
    if ipIn is None:
        new_entry = ip_address(ip=ip)
        new_entry.save()
    return HttpResponse(json.dumps({'status': 'success'}), content_type='application/json')


@login_required
def godMode(request):
    if request.user.is_superuser:
        ips = ip_address.objects.all()
        ipF = ips[0].ip
        g = geocoder.ip(ipF)
        myAddress = g.latlng
        my_map1 = folium.Map(location=myAddress, zoom_start=12)
        for ip in ips:
            g = geocoder.ip(ip.ip)
            myAddress = g.latlng
            folium.Marker(myAddress).add_to(my_map1)
        my_map1.save('templates/godMode.html')
        return render(request, 'godMode.html')