from django.shortcuts import render_to_response
from django.template import RequestContext
from django.shortcuts import redirect, render, get_object_or_404
from django.contrib import messages

from apps.main.models import Device
from apps.main.views import sidebar

from .models import JARSConfiguration, JARSfilter
from .forms import JARSConfigurationForm, JARSfilterForm, JARSImportForm
# Create your views here.

def jars_conf(request, id_conf):
    
    conf = get_object_or_404(JARSConfiguration, pk=id_conf)
    
    ip=conf.device.ip_address
    port=conf.device.port_address
    
    kwargs = {}
    kwargs['status'] = conf.device.get_status_display()
    
    
    kwargs['dev_conf'] = conf
    kwargs['dev_conf_keys'] = ['name',
                               'cards_number', 'channels_number', 'channels',
                               'rd_directory', 'pd_directory',  
                               'data_type',
                               'acq_profiles', 'profiles_block', 'ftp_interval', 'fftpoints',
                               'cohe_integr_str',
                               'incohe_integr', 'cohe_integr', 'filter', 'spectral_number',
                               'spectral', 'create_directory', 'include_expname',
                               'save_ch_dc', 'save_data']
    
    kwargs['title'] = 'JARS Configuration'
    kwargs['suptitle'] = 'Details'
    
    kwargs['button'] = 'Edit Configuration'
    
    #kwargs['no_play'] = True
    
    kwargs['only_stop'] = True
    
    ###### SIDEBAR ######
    kwargs.update(sidebar(conf=conf))
    
    return render(request, 'jars_conf.html', kwargs)

def jars_conf_edit(request, id_conf):
    
    conf = get_object_or_404(JARSConfiguration, pk=id_conf)
    
    if request.method=='GET':
        form = JARSConfigurationForm(instance=conf)
        
    if request.method=='POST':
        form = JARSConfigurationForm(request.POST, instance=conf)
        
        if form.is_valid():
            conf = form.save(commit=False)
            conf.save()
            return redirect('url_jars_conf', id_conf=conf.id)
            
            ##ERRORS
        
    kwargs = {}
    
    kwargs['filter_id'] = conf.filter.id
    kwargs['id_dev'] = conf.id
    kwargs['form'] = form
    kwargs['title'] = 'Device Configuration'
    kwargs['suptitle'] = 'Edit'
    kwargs['button'] = 'Save'
    
    return render(request, 'jars_conf_edit.html', kwargs)

def import_file(request, conf_id):
    
    conf = get_object_or_404(JARSConfiguration, pk=conf_id)
    if request.method=='POST':
        form = JARSImportForm(request.POST, request.FILES)
        if form.is_valid():            
            try:
                parms = conf.import_from_file(request.FILES['file_name'])
            
                if parms:
                    conf.update_from_file(parms)
                    messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
                    return redirect(conf.get_absolute_url_edit())
            
            except Exception as e:    
                messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], e))
        
    else:
        messages.warning(request, 'Your current configuration will be replaced')
        form = JARSImportForm() 
    
    kwargs = {}
    kwargs['form'] = form
    kwargs['title'] = 'JARS Configuration'
    kwargs['suptitle'] = 'Import file'
    kwargs['button'] = 'Upload'
    kwargs['previous'] = conf.get_absolute_url()
    
    return render(request, 'jars_import.html', kwargs)

def read_conf(request, conf_id):
    
    conf   = get_object_or_404(JARSConfiguration, pk=conf_id)
    #filter = get_object_or_404(JARSfilter, pk=filter_id)
    
    if request.method=='GET':
        
        parms = conf.read_device()
        conf.status_device()
        
        if not parms:
            messages.error(request, conf.message)
            return redirect(conf.get_absolute_url())
        
        form = JARSConfigurationForm(initial=parms, instance=conf)
    
    if request.method=='POST':
        form = JARSConfigurationForm(request.POST, instance=conf)
        
        if form.is_valid():
            form.save()
            return redirect(conf.get_absolute_url())
        
        messages.error(request, "Parameters could not be saved")
        
    kwargs = {}
    kwargs['id_dev'] = conf.id
    kwargs['filter_id'] = conf.filter.id
    kwargs['form'] = form
    kwargs['title'] = 'Device Configuration'
    kwargs['suptitle'] = 'Parameters read from device'
    kwargs['button'] = 'Save'
    
    ###### SIDEBAR ######
    kwargs.update(sidebar(conf=conf))
    
    return render(request, 'jars_conf_edit.html', kwargs)

def view_filter(request, conf_id, filter_id):
    
    conf = get_object_or_404(JARSConfiguration, pk=conf_id)
    filter = get_object_or_404(JARSfilter, pk=filter_id)
    
    filter_parms       = eval(conf.filter_parms)
    filter.name        = filter_parms['name']
    filter.clock       = filter_parms['clock']
    filter.mult        = filter_parms['mult']
    filter.fch         = filter_parms['fch']
    filter.fch_decimal = filter_parms['fch_decimal']
    filter.filter_fir  = filter_parms['filter_fir']
    filter.filter_2    = filter_parms['filter_2']
    filter.filter_5    = filter_parms['filter_5']
    filter.speed       = filter_parms['speed']
    
    kwargs = {}
    kwargs['conf']          = conf
    kwargs['filter']        = filter
    kwargs['dev_conf']      = filter
    kwargs['dev_conf_keys'] = ['name', 'clock',
                               'mult', 'fch', 'fch_decimal',
                               'filter_fir', 'filter_2',
                               'filter_5', 'speed']
    
    kwargs['title']         = 'Filter View'
    kwargs['suptitle']      = 'Details'
    kwargs['button']        = 'SI'
    kwargs['edit_button']   = 'Edit Filter'
    kwargs['add_button']    = 'New Filter'
    
    return render(request, 'jars_filter.html', kwargs)

def edit_filter(request, conf_id, filter_id):
    
    conf = get_object_or_404(JARSConfiguration, pk=conf_id)
    filter_parms = eval(conf.filter_parms)
    
    if filter_id:
        filter = get_object_or_404(JARSfilter, pk=filter_id)
    
    if request.method=='GET':
        form = JARSfilterForm(initial=filter_parms)
        
    if request.method=='POST':
        parms = {}
        parms['name']        = request.POST['name']
        parms['clock']       = request.POST['clock']
        parms['mult']        = request.POST['mult']
        parms['fch']         = request.POST['fch']
        parms['fch_decimal'] = request.POST['fch_decimal']
        parms['filter_fir'] = request.POST['filter_fir']
        parms['filter_2']   = request.POST['filter_2']
        parms['filter_5']   = request.POST['filter_5']
        parms['speed']      = request.POST['speed']
        
        conf.filter_parms = parms
        conf.save()
        
        #form = JARSfilterForm(request.POST)
        #form = JARSfilterForm(request.POST, instance=filter)
        #if form.is_valid():
            #form.save()
        #    messages.success(request, 'JARS Filter successfully updated')
        #    return redirect('url_jars_filter', conf.id, filter.id)
        return redirect('url_jars_filter', conf.id, filter.id)
          
    kwargs = {}
    kwargs['form'] = form
    kwargs['title'] = conf.name
    kwargs['suptitle'] = 'Edit Filter'
    kwargs['button'] = 'Save'
   # kwargs['previous'] = conf.get_absolute_url_edit()
    kwargs['dev_conf'] = conf
    
    return render(request, 'jars_filter_edit.html', kwargs)

def new_filter(request, conf_id):
    
    conf = get_object_or_404(JARSConfiguration, pk=conf_id)
    
    if request.method=='GET':
        form = JARSfilterForm()
        
    if request.method=='POST':
        form = JARSfilterForm(request.POST)
        if form.is_valid():
            form.save()
            new_filter  = get_object_or_404(JARSfilter, name=request.POST['name'])
            conf.filter = new_filter
            conf.add_parms_to_filter()
            messages.success(request, 'New JARS Filter successfully created')
            return redirect('url_edit_jars_conf', id_conf=conf.id)
          
    kwargs = {}
    kwargs['form'] = form
    kwargs['title'] = 'New Filter'
    kwargs['suptitle'] = ''
    kwargs['button'] = 'Create'
   # kwargs['previous'] = conf.get_absolute_url_edit()
    kwargs['dev_conf'] = conf
    
    return render(request, 'jars_new_filter.html', kwargs)