from django.conf import settings
import requests, json, mimetypes, os
from xmlrpc.client import Transport, ProtocolError
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost, EditPost, DeletePost
from wordpress_xmlrpc.methods import taxonomies, media
from fmls_api.management.fmlsUpdater.setWordpressData import *
from wordpress_xmlrpc.compat import xmlrpc_client
from fmls_api.models import DataMap, Data
from fmls_api.management.fmlsUpdater import bridgeApi

class SpecialTransport(Transport):
    user_agent = 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31'

def wordpressConnection():
    try:
        # Use the verbose flag for debugging
        wp = Client('https://leftminds.com/gahouse/xmlrpc.php', 'aman', '$Gahouse111', transport=SpecialTransport())
        return wp
        
    except ProtocolError as err:
        print("A protocol error occurred")
        print("URL: %s" % err.url)
        print("HTTP/HTTPS headers: %s" % err.headers)
        print("Error code: %d" % err.errcode)
        print("Error message: %s" % err.errmsg)

def deleteWPKeys(postID, keys):
    apiUrl = "https://leftminds.com/gahouse/wp-json/wp/v2/properties/"+str(postID)+"/meta"
    payload = json.dumps({"keys": keys}, indent = 4)
    getResult = bridgeApi._get_forecast_json("DELETE", apiUrl, payload)
    if(getResult.status_code==200):
        return True
    else:
        return False

def createProperty(wp, wpData):
    post = WordPressPost()
    post.title = wpData['post']['title']
    post.content = wpData['post']['content']
    post.post_status = 'publish'
    post.post_type = 'property'
    post.custom_fields = []
    for the_key, the_value in wpData['postMeta'].items():
        post.custom_fields.append({'key': the_key, 'value': str(the_value) })
    
    wpMedia = downloadUploadMedia(wp, wpData['media'])
    if wpMedia:
        post.custom_fields.append({'key': 'thumbnail_id', 'value': wpMedia[0]})    #thumbnail
        for mediaId in wpMedia:
            post.custom_fields.append({'key': 'fave_property_images', 'value': mediaId})    #multiple images
    else:
        post.custom_fields.append({'key': 'thumbnail_id', 'value': '511'})    #thumbnail when we don't have an image
                   
                  
    post.terms_names = wpData['postTerms']
    postID = wp.call(NewPost(post))
    obj, created = DataMap.objects.update_or_create(fmls_api_data_id=wpData['post']['fmls_api_data'], defaults={'fmls_api_data_id': wpData['post']['fmls_api_data'], 'wp_id':postID, 'media_id':str(wpMedia)})
    print(postID)

def downloadUploadMedia(wp, urls):
    media = []
    folderPath = settings.STATIC_ROOT
    
    for url in urls:
        imageName = url.rsplit('/',1)[1]
        imageAbsPath = folderPath+imageName
        response = requests.get(url)
        with open(imageAbsPath, "wb") as f:
            f.write(response.content)

        media.append(uploadMedia(wp, imageAbsPath, imageName))

    return media    

def uploadMedia(wp, filename, imageName):
    # prepare metadata
    data = {
            'name': imageName,
            'type': mimetypes.guess_type(filename)[0],  # mimetype
            }
    
    # read the binary file and let the XMLRPC library encode it into base64
    with open(filename, 'rb') as img:
        data['bits'] = xmlrpc_client.Binary(img.read())
    
    response = wp.call(media.UploadFile(data))

    #remove file after successfully upload on the server
    if response:
        os.remove(filename)
    return response['id']

def updateProperty(wp, wpData, postID):
    post = WordPressPost()
    post.title = wpData['post']['title']
    post.content = wpData['post']['content']
    post.post_status = 'publish'
    post.post_type = 'property'
    post.custom_fields = []
    deleteKeys = []
    for the_key, the_value in wpData['postMeta'].items():
        post.custom_fields.append({'key': the_key, 'value': str(the_value) })        
        deleteKeys.append(the_key)        

    getStatus = deleteWPKeys(postID, deleteKeys)    #Delete information from the server
    if(getStatus):                 
        post.terms_names = wpData['postTerms']
        wp.call(EditPost(postID, post))
        print(postID)
    
def checkRecord(fmls_data_id):
    try:
        return DataMap.objects.get(fmls_api_data_id=fmls_data_id)
    except DataMap.DoesNotExist:
        return False

def _push_wordpress_data():
    wordpress = wordpressConnection()
    getActiveProperties = Data.objects.all().filter(address_display=True, listing_display=True)

    for getActiveProperty in getActiveProperties:
        wpObj = SetWordpressData(getActiveProperty.id)
        getWpData = wpObj.setData()
        getCheckResult = checkRecord(getActiveProperty.id)
        
        if(getCheckResult):
            updateProperty(wordpress, getWpData, getCheckResult.wp_id)
        else:
            createProperty(wordpress, getWpData)