# ##### BEGIN GPL LICENSE BLOCK #####
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software Foundation,
#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####

import imp
import xmlrpc.client
import math
import sys
import traceback

from os.path import join

import bpy

from .ore_session import OreSession
from .exceptions import LoginFailedException

def _write_credentials(hash, user):
    with open(join(bpy.utils.user_resource('CONFIG', 'rffi', True), 'rffi_credentials.py'), 'w') as pwfile:
        pwfile.write('hash=\''+hash+'\'\n')
        pwfile.write('user=\''+user+'\'')


def _read_credentials():
    bpy.rffi_creds_found = False
    bpy.rffi_user = ''
    bpy.rffi_hash = ''

    pwfile = bpy.utils.user_resource('CONFIG', 'rffi', True)
    try:
        pwmod = imp.find_module('rffi_credentials',[pwfile])
    except ImportError as e:
        _write_credentials('', '')
        pwmod = imp.find_module('rffi_credentials',[pwfile])
    try:
        user_creds = imp.load_module('rffi_credentials', pwmod[0], pwmod[1], pwmod[2])
        bpy.rffi_user = user_creds.user
        bpy.rffi_hash = user_creds.hash
        bpy.rffi_creds_found = True
    except ImportError as e:
        # doesn't exist yet, write template
        _write_credentials('', '')
        pwfile = bpy.utils.user_resource('CONFIG', 'rffi', True)
        pwmod = imp.find_module('rffi_credentials',[pwfile])
        try:
            user_creds = imp.load_module('rffi_credentials', pwmod[0], pwmod[1], pwmod[2])
            bpy.rffi_user = user_creds.user
            bpy.rffi_hash = user_creds.hash
            bpy.rffi_creds_found = True
        except Exception as e2:
            print("Couldn't write rffi_credentials.py", e2)
    finally:
        if pwmod and pwmod[0]: pwmod[0].close()

    return bpy.rffi_creds_found


def _xmlsessions_to_oresessions(sessions, stage=None):
    output = []
    for session in sessions:
        s = session['title']
        if stage:
            s = s + ' (' + stage + ')'
        sinfo = OreSession(session['sessionId'], s) 
        if stage in {'Completed', 'Active'}:
            sinfo.frames = session['framesRendered']
        sinfo.startframe = session['startFrame']
        sinfo.endframe = session['endFrame']
        output.append(sinfo)
    return output


def update_session_list(session_list, ore):
    while(len(session_list) > 0):
        session_list.remove(0)
    
    for s in bpy.ore_active_session_queue:
        session_list.add()
        session = session_list[-1]
        session.name = s.title + ' [' + str(s.percentageComplete()) + '% complete]'

def update_complete_session_list(ore):
    all_sessions = []
    
    bpy.ore_active_session_queue = bpy.ore_cancelled_sessions
    update_session_list(ore.rejected_sessions, ore)
    bpy.ore_active_session_queue = bpy.ore_active_sessions
    update_session_list(ore.active_sessions, ore)
    bpy.ore_active_session_queue = bpy.ore_pending_sessions
    update_session_list(ore.pending_sessions, ore)
    bpy.ore_active_session_queue = bpy.ore_completed_sessions
    update_session_list(ore.completed_sessions, ore)
    
    bpy.ore_complete_session_queue = []
    bpy.ore_complete_session_queue.extend(bpy.ore_pending_sessions)
    bpy.ore_complete_session_queue.extend(bpy.ore_active_sessions)
    bpy.ore_complete_session_queue.extend(bpy.ore_completed_sessions)
    bpy.ore_complete_session_queue.extend(bpy.ore_cancelled_sessions)
    
    bpy.ore_active_session_queue = bpy.ore_complete_session_queue
    update_session_list(ore.all_sessions, ore)

def check_status(ore):
    bpy.errors = []
    
    if bpy.rffi_creds_found == False and bpy.rffi_hash == '':
        bpy.errors.append('missing_creds')
    
    if '' in {ore.title, ore.longdesc, ore.shortdesc}:
        bpy.errors.append('missing_desc')
        bpy.infoError = True

    set_status('username', bpy.rffi_hash=='' and ore.username=='')
    set_status('password', bpy.rffi_hash=='' and ore.password=='')
    
    set_status('title', ore.title=='')
    set_status('longdesc', ore.longdesc=='')
    set_status('shortdesc', ore.shortdesc=='')


def set_status(property, status):
    if status:
        bpy.statusMessage[property] = 'ERROR'
    else:
        bpy.statusMessage[property] = 'TRIA_RIGHT'

def show_status(layoutform, property, message):
    if bpy.statusMessage[property] == 'ERROR':
        layoutform.label(text='', icon='ERROR')