from django.shortcuts import render
from django.contrib.auth.hashers import make_password
from django.contrib.auth import logout

from asset_management_app import models
from asset_management_app import serializers

from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import GenericAPIView
from rest_framework.parsers import FileUploadParser,MultiPartParser, FormParser
from rest_framework.response import Response
from rest_framework import generics, permissions

from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.db import connection
from django.db.models import Q

import os
import math
import random
import json
import pgeocode
import pandas as pd

class uploadImageAPIView(GenericAPIView):
    parser_classes = (MultiPartParser, FileUploadParser, FormParser)

    def post(self, request, format=None):
        # Validate required fields

        if "folder_type" not in request.data:
            return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Please send folder type"})
        
        if "email" not in request.data:
            return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Please send email"})

        folder_type = request.data['folder_type']
        email = request.data['email']

        if "email" not  in request.data:
            return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Please send email"})

        if "folder_type" not in request.data:
            return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Please send folder_type"})

        if folder_type == "customer":
            if models.users.objects.filter(login = email).exists():
                qs_customer_info = models.users.objects.get(login = email)
                customer_id = str (qs_customer_info.customer_id)
                if customer_id == "0":
                    return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Mismatch customer id"})
            else:
                return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Id doe's not exists"})
                    
            asset_image = request.data.get('asset_image')
            mp3_file = request.data.get('asset_mp3_file')
            mp4_file = request.data.get('asset_mp4_file')
            try:
                response = {}
                media_folder = getattr(settings, "MEDIA_ROOT", None)
                if media_folder:
                    image_path = os.path.join(media_folder, folder_type, customer_id, "images")
                    mp3_path = os.path.join(media_folder, folder_type, customer_id, "mp3")
                    mp4_path = os.path.join(media_folder, folder_type, customer_id, "mp4")

                    os.makedirs(image_path, exist_ok=True)
                    os.makedirs(mp3_path, exist_ok=True)
                    os.makedirs(mp4_path, exist_ok=True)

                    if 'asset_image' in request.data:
                        img_name, img_ext = os.path.splitext(asset_image.name)
                        img_name_hashed = make_password(img_name).replace("/", "").replace("\\", "").replace(":", "") + img_ext
                        fs = FileSystemStorage(location=image_path)
                        fs.save(img_name_hashed, asset_image)
                        response['asset_image'] = os.path.join("media", folder_type, customer_id, "images", img_name_hashed)
                        return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})

                    if "asset_mp3_file" in request.data:
                        mp3_name, mp3_ext = os.path.splitext(mp3_file.name)
                        mp3_name_hashed = make_password(mp3_name).replace("/", "").replace("\\", "").replace(":", "") + mp3_ext
                        fs = FileSystemStorage(location=mp3_path)
                        fs.save(mp3_name_hashed, mp3_file)
                        response['mp3_file'] = os.path.join("media", folder_type, customer_id, "mp3", mp3_name_hashed)
                        return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})

                    if "asset_mp4_file" in request.data:
                        mp4_name, mp4_ext = os.path.splitext(mp4_file.name)
                        mp4_name_hashed = make_password(mp4_name).replace("/", "").replace("\\", "").replace(":", "") + mp4_ext
                        fs = FileSystemStorage(location=mp4_path)
                        fs.save(mp4_name_hashed, mp4_file)
                        response['mp4_file'] = os.path.join("media", folder_type, customer_id, "mp4", mp4_name_hashed)
                        return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})
                    
            except Exception as e:
                return Response({"statusCode": "0", "statusMessage": "Document not uploaded", "error": str(e)})
        
        elif folder_type == "technician":
            if models.users.objects.filter(login = email).exists():
                qs_technician_info = models.users.objects.get(login = email)
                technician_id = qs_technician_info.technician_id 
                print(technician_id)
                if  technician_id == "0":
                         return Response({"statusCode": "0", "statusMessage": "Failed", "error": "mismatch technician id"})
            else:
                return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Id doe's not exists"})
                    
            
            asset_image = request.data.get('asset_image')
            mp3_file = request.data.get('asset_mp3_file')
            mp4_file = request.data.get('asset_mp4_file')

            try:
                response = {}
                media_folder = getattr(settings, "MEDIA_ROOT", None)
                if media_folder:
                    image_path = os.path.join(media_folder, folder_type, technician_id, "images")
                    mp3_path = os.path.join(media_folder, folder_type, technician_id, "mp3")
                    mp4_path = os.path.join(media_folder, folder_type, technician_id, "mp4")

                    os.makedirs(image_path, exist_ok=True)
                    os.makedirs(mp3_path, exist_ok=True)
                    os.makedirs(mp4_path, exist_ok=True)

                    if 'asset_image' in request.data:
                        img_name, img_ext = os.path.splitext(asset_image.name)
                        img_name_hashed = make_password(img_name).replace("/", "").replace("\\", "").replace(":", "") + img_ext
                        fs = FileSystemStorage(location=image_path)
                        fs.save(img_name_hashed, asset_image)
                        response['asset_image'] = os.path.join("media", folder_type, technician_id, "images", img_name_hashed)
                        return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})

                    if "asset_mp3_file" in request.data:
                        mp3_name, mp3_ext = os.path.splitext(mp3_file.name)
                        mp3_name_hashed = make_password(mp3_name).replace("/", "").replace("\\", "").replace(":", "") + mp3_ext
                        fs = FileSystemStorage(location=mp3_path)
                        fs.save(mp3_name_hashed, mp3_file)
                        response['mp3_file'] = os.path.join("media", folder_type, technician_id, "mp3", mp3_name_hashed)
                        return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})

                    
                    if "asset_mp4_file" in request.data:
                        mp4_name, mp4_ext = os.path.splitext(mp4_file.name)
                        mp4_name_hashed = make_password(mp4_name).replace("/", "").replace("\\", "").replace(":", "") + mp4_ext
                        fs = FileSystemStorage(location=mp4_path)
                        fs.save(mp4_name_hashed, mp4_file)
                        response['mp4_file'] = os.path.join("media", folder_type, technician_id, "mp4", mp4_name_hashed)
                        return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})
                    
            except Exception as e:
                return Response({"statusCode": "0", "statusMessage": "Document not uploaded", "error": str(e)})
        
        elif folder_type == "admin":
            print("enter")
            if models.adminRegistration.objects.filter(user_email = email).exists():
                    qs_customer_info = models.adminRegistration.objects.get(user_email = email)
                    print(qs_customer_info)
                    print("customer_id")
                    customer_id = str (qs_customer_info.id)
                    if customer_id == "0":
                         return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Mismatch customer id"})
            else:
                return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Id doe's not exists"})
                    
            
            asset_image = request.data.get('asset_image')
            mp3_file = request.data.get('asset_mp3_file')
            mp4_file = request.data.get('asset_mp4_file')

            try:
                response = {}
                media_folder = getattr(settings, "MEDIA_ROOT", None)
                if media_folder:
                    image_path = os.path.join(media_folder, folder_type, customer_id, "images")
                    mp3_path = os.path.join(media_folder, folder_type, customer_id, "mp3")
                    mp4_path = os.path.join(media_folder, folder_type, customer_id, "mp4")

                    os.makedirs(image_path, exist_ok=True)
                    os.makedirs(mp3_path, exist_ok=True)
                    os.makedirs(mp4_path, exist_ok=True)

                    if 'asset_image' in request.data:
                        img_name, img_ext = os.path.splitext(asset_image.name)
                        img_name_hashed = make_password(img_name).replace("/", "").replace("\\", "").replace(":", "") + img_ext
                        fs = FileSystemStorage(location=image_path)
                        fs.save(img_name_hashed, asset_image)
                        response['asset'] = os.path.join("media", folder_type, customer_id, "images", img_name_hashed)
                        return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})

                    if "asset_mp3_file" in request.data:
                        mp3_name, mp3_ext = os.path.splitext(mp3_file.name)
                        mp3_name_hashed = make_password(mp3_name).replace("/", "").replace("\\", "").replace(":", "") + mp3_ext
                        fs = FileSystemStorage(location=mp3_path)
                        fs.save(mp3_name_hashed, mp3_file)
                        response['asset'] = os.path.join("media", folder_type, customer_id, "mp3", mp3_name_hashed)
                        return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})

                    
                    if "asset_mp4_file" in request.data:
                        mp4_name, mp4_ext = os.path.splitext(mp4_file.name)
                        mp4_name_hashed = make_password(mp4_name).replace("/", "").replace("\\", "").replace(":", "") + mp4_ext
                        fs = FileSystemStorage(location=mp4_path)
                        fs.save(mp4_name_hashed, mp4_file)
                        response['asset'] = os.path.join("media", folder_type, customer_id, "mp4", mp4_name_hashed)
                        return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})
                    
            except Exception as e:
                return Response({"statusCode": "0", "statusMessage": "Document not uploaded", "error": str(e)})
        
        else:
            return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Please send folder_type"})

class uploadAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    parser_classes = (MultiPartParser, FileUploadParser, FormParser)
    def post(self, request, format=None):
        try:
            response = []
            if "folder_type" not in request.data:
                return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Please send folder type"})

            folder_type = request.data['folder_type']
            media_folder = getattr(settings, "MEDIA_ROOT", None)
            if media_folder:
                path = os.path.join(media_folder, folder_type)
                if not os.path.exists(path):
                    os.makedirs(path)

                for f in request.FILES.getlist('files'):
                    filename = str(f)
                    file_path = os.path.join(path, filename)
                    fs = FileSystemStorage(location=path)
                    if os.path.isfile(file_path):
                        filename = fs.save(filename, f)
                    else:
                        fs.save(filename, f)

                    return_media_path = os.path.join(settings.MEDIA_URL, folder_type)
                    return_media_path = return_media_path.replace('/media', 'media')
                    success_image_url = return_media_path + '/' + str(filename)
                    response.append(success_image_url)

            return Response({"statusCode": "1", "statusMessage": "Files uploaded successfully", "data": response})
        except Exception as e:
            return Response({"statusCode": "0", "statusMessage": "Failed", "error": str(e)})




 