
import ast
import json
from itertools import chain

from django import forms
from django.utils.safestring import mark_safe
from django.utils.encoding import force_unicode
from django.utils.html import conditional_escape
     

class SpectralWidget(forms.widgets.TextInput):
    
    def render(self, label, value, attrs=None):
        
        disabled = 'disabled' if attrs.get('disabled', False) else ''
        name = attrs.get('name', label)
        if '[' in value:
            if value[len(value)-1] == ",":
                value = ast.literal_eval(value)
            else:
                value = value + ","
                value = ast.literal_eval(value)
        
        codes = value
        if not isinstance(value, list):
            text=''
            #lista = []
            #if len(value) > 1:
            for val in value:
                text = text+str(val)+','
                #lista.append(val)
            codes=text
        else:
            codes=''
                
        html = '''<textarea rows="5" {0} class="form-control" id="id_{1}" name="{2}" style="white-space:nowrap; overflow:scroll;">{3}</textarea>
                  <input type="text" class="col-md-1 col-no-padding" id="num1" value=0>
                  <input type="text" class="col-md-1 col-no-padding" id="num2" value=0>
                  <button type="button" class="button" id="add_spectral_button"> Add </button>
                  <button type="button" class="button" id="delete_spectral_button"> Delete </button>
                  <button type="button" class="button pull-right" id="cross_spectral_button"> Cross </button>
                  <button type="button" class="button pull-right" id="self_spectral_button"> Self </button>
                  <button type="button" class="button pull-right" id="all_spectral_button"> All </button>
                  '''.format(disabled, label, name, codes)
        
        script = '''
                <script type="text/javascript"> 
                $(document).ready(function () {{
                
                    var spectral_number1 = $("#num1").val();
                    var spectral_number2 = $("#num2").val();
                    
                    
                    $("#all_spectral_button").click(function(){{
                        var sequence1 = selfSpectral()
                        var sequence2 = crossSpectral()
                        $("#id_spectral").val(sequence1+sequence2)
                        updateSpectralNumber()
                    }});
                    
                    
                    $("#add_spectral_button").click(function(){{
                        var spectral_comb = $("#id_spectral").val();
                        var spectral_number1 = $("#num1").val();
                        var spectral_number2 = $("#num2").val();
                        var str = spectral_number1+", "+spectral_number2;
                        //not to duplicate
                        var n = spectral_comb.search(str);
                        if (n==-1){
                            $("#id_spectral").val(spectral_comb+"["+$("#num1").val()+", "+$("#num2").val()+"],")   
                        }
                        updateSpectralNumber()                     
                    }});
                    
                    
                    $("#self_spectral_button").click(function(){{
                        var sequence = selfSpectral()
                        $("#id_spectral").val(sequence)
                        
                        updateSpectralNumber()
                    }});
                    
                    $("#cross_spectral_button").click(function(){{
                        var sequence = crossSpectral()
                        $("#id_spectral").val(sequence)
                        
                        updateSpectralNumber()
                    }});
                    
                    
                    function selfSpectral() {
                        var channels = $("#id_channels").val();
                        var n = (channels.length)-1;
                        var num = parseInt(channels[n]);
                        sequence = ""
                        for (i = 0; i < num; i++) {
                            sequence = sequence + "[" + i.toString() + ", " + i.toString() + "],"
                        }
                        return sequence
                    }
                    
                    
                    function crossSpectral() {
                        var channels = $("#id_channels").val();
                        var n = (channels.length)-1;
                        var num = parseInt(channels[n]);
                        sequence = ""
                        for (i = 0; i < num; i++) {
                            for (j = i+1; j < num; j++) {
                            sequence = sequence + "[" + i.toString() + ", " + j.toString() + "],"
                            }
                        }
                        return sequence
                    }
                    
                    
                    function updateSpectralNumber(){
                        var spectral_comb = $("#id_spectral").val();
                        var num = spectral_comb.length;
                        var cont = 0
                        for (i = 0; i < num; i++) {
                            if (spectral_comb[i] == "]"){
                                cont = cont + 1
                            }
                        }
                        $("#id_spectral_number").val(cont)
                    }
                    
                    
                    $("#delete_spectral_button").click(function(){{
                        var spectral_comb = $("#id_spectral").val();
                        var spectral_number1 = $("#num1").val();
                        var spectral_number2 = $("#num2").val();
                        var str = spectral_number1+", "+spectral_number2;
                        var n = spectral_comb.search(str);
                        if (n==-1){
                            
                        }
                        else {
                            n= spectral_comb.length;
                            if (n<8){
                                var tuple = "["+$("#num1").val()+", "+$("#num2").val()+"],"
                                var txt = spectral_comb.replace(tuple,'');
                            }
                            else {
                                var tuple = ",["+$("#num1").val()+", "+$("#num2").val()+"]"
                                var txt = spectral_comb.replace(tuple,'');
                            }
                            $("#id_spectral").val(txt)
                            
                            var tuple = "["+$("#num1").val()+", "+$("#num2").val()+"],"
                            var txt = spectral_comb.replace(tuple,'');
                            $("#id_spectral").val(txt)
                        }
                        updateSpectralNumber()                     
                    }});
                    
                    
                }});
                </script>
                '''
        
        return mark_safe(html+script)