var msg = ''
var tb_options = null
var tb_sat = null


var controllers = {
    init: function(){
        //~ Admin
        $$('menu_user').attachEvent('onMenuItemClick', menu_user_click)
        $$('multi_admin').attachEvent('onViewChange', multi_admin_change)
        //~ Emisor
        $$('cmd_save_emisor').attachEvent('onItemClick', cmd_save_emisor_click)
        $$('emisor_cp').attachEvent('onKeyPress', emisor_postal_code_key_press)
        $$('emisor_cp').attachEvent('onTimedKeyPress', emisor_postal_code_key_up)
        $$('chk_escuela').attachEvent('onChange', chk_escuela_change)
        $$('chk_ong').attachEvent('onChange', chk_ong_change)
        $$('cmd_subir_certificado').attachEvent('onItemClick', cmd_subir_certificado_click)
        $$('up_cert').attachEvent('onUploadComplete', up_cert_upload_complete)
        $$('cmd_agregar_serie').attachEvent('onItemClick', cmd_agregar_serie_click)
        $$('grid_folios').attachEvent('onItemClick', grid_folios_click)
        $$('cmd_probar_correo').attachEvent('onItemClick', cmd_probar_correo_click)
        $$('cmd_guardar_correo').attachEvent('onItemClick', cmd_guardar_correo_click)
        $$('emisor_logo').attachEvent('onItemClick', emisor_logo_click)
        //~ SAT
        tb_sat = $$('tab_sat').getTabbar()
        tb_sat.attachEvent('onChange', tab_sat_change)
        $$('grid_admin_taxes').attachEvent('onCheck', grid_admin_taxes_on_check)
        $$('grid_admin_monedas').attachEvent('onCheck', grid_admin_monedas_on_check)
        //~ Opciones
        tb_options = $$('tab_options').getTabbar()
        tb_options.attachEvent('onChange', tab_options_change)
        $$('txt_plantilla_factura_33').attachEvent('onItemClick', txt_plantilla_factura_33_click)
    }
}


function menu_user_click(id, e, node){
    if (id == 1){
        window.location = '/logout'
        return
    }
}


function cmd_home_click(){
    window.location = '/main'
}


function cmd_save_emisor_click(){
    var valid_cp = false
    var form = $$('form_emisor')

    if (!form.validate()){
        msg = 'Valores inválidos'
        msg_error(msg)
        return
    }

    var values = form.getValues()

    var ids = $$('lst_emisor_regimen').getSelectedId()
    if(!ids){
        msg = 'Selecciona al menos un Regimen Fiscal'
        msg_error(msg)
        return
    }
    if(values.emisor_cp && values.emisor_cp.length != 5){
        msg = 'Longitud inválida del C.P.'
        msg_error(msg)
        return
    }
    if(values.emisor_cp2 && values.emisor_cp2.length != 5){
        msg = 'Longitud inválida del C.P. de Expedición'
        msg_error(msg)
        return
    }else if(values.emisor_cp2){
        webix.ajax().sync().get('/values/cp', {cp: values.emisor_cp2}, {
            error: function(text, data, xhr) {
                msg = 'Error al consultar el C.P. de Expedición'
                msg_error(msg)
            },
            success: function(text, data, xhr) {
                var values = data.json();
                if (values.estado == undefined){
                    msg = 'No se encontró el C.P., asegurate de que sea correcto'
                    msg_error(msg)
                }else{
                    valid_cp = true
                }
            }
        })
    }
    if(!valid_cp){
        return
    }

    if(values.es_ong){
        if(!values.ong_autorizacion){
            msg = 'Si es ONG, el Número de Autorización del SAT es requerido'
            msg_error(msg)
            return
        }
        if(!values.ong_fecha){
            msg = 'Si es ONG, la Fecha de Autorización del SAT es requerida'
            msg_error(msg)
            return
        }
        if(!values.ong_fecha_dof){
            msg = 'Si es ONG, la Fecha de Publicación en DOF es requerida'
            msg_error(msg)
            return
        }
    }


    values['regimenes'] = ids
    webix.ajax().post('/emisor', values, {
        error:function(text, data, XmlHttpRequest){
            msg = 'Ocurrio un error, consulta a soporte técnico'
            msg_error(msg)
        },
        success:function(text, data, XmlHttpRequest){
            var values = data.json()
            if(values.ok){
                msg_sucess('Emisor guardado correctamente')
            }else{
                msg_error(values.msg)
            }
        }
    })

}


function get_emisor(){
    var form = $$('form_emisor')

    webix.ajax().get("/emisor", {}, {
        error: function(text, data, xhr) {
            msg = 'Error al consultar'
            msg_error(msg)
        },
        success: function(text, data, xhr) {
            var values = data.json()
            if (values.ok){
                var emisor = values.row.emisor
                $$('lst_emisor_regimen').parse(values.row.regimenes)
                form.setValues(emisor, true)
                if(emisor.regimenes){
                    $$('lst_emisor_regimen').select(emisor.regimenes)
                }
            }else{
                msg_error(values.msg)
            }
        }
    })

}


function get_certificado(){
    var form = $$('form_cert')

    webix.ajax().get("/values/cert", {}, {
        error: function(text, data, xhr) {
            msg = 'Error al consultar'
            msg_error(msg)
        },
        success: function(text, data, xhr) {
            var values = data.json()
            form.setValues(values)
        }
    })

}


function get_table_folios(){
    webix.ajax().get("/folios", {}, {
        error: function(text, data, xhr) {
            msg = 'Error al consultar'
            msg_error(msg)
        },
        success: function(text, data, xhr) {
            var values = data.json()
            $$('grid_folios').parse(values)
        }
    })

}


function get_config_correo(){
    var form = $$('form_correo')
    var fields = form.getValues()

    webix.ajax().get('/config', {'fields': 'correo'}, {
        error: function(text, data, xhr) {
            msg = 'Error al consultar'
            msg_error(msg)
        },
        success: function(text, data, xhr) {
            var values = data.json()
            form.setValues(values)
        }
    })
}


function get_admin_impuestos(){
    webix.ajax().sync().get('/values/alltaxes', function(text, data){
        var values = data.json()
        $$('grid_admin_taxes').clearAll()
        $$('grid_admin_taxes').parse(values, 'json')
    })
}

function get_admin_monedas(){
    webix.ajax().sync().get('/values/allcurrencies', function(text, data){
        var values = data.json()
        $$('grid_admin_monedas').clearAll()
        $$('grid_admin_monedas').parse(values, 'json')
    })
}


function get_config_values(opt){
    if(opt == undefined){
        return
    }

    webix.ajax().get('/config', {'fields': opt}, {
        error: function(text, data, xhr) {
            msg = 'Error al consultar'
            msg_error(msg)
        },
        success: function(text, data, xhr) {
            var values = data.json()
            Object.keys(values).forEach(function(key){
                $$(key).setValue(values[key])
            })
        }
    })
}


function multi_admin_change(prevID, nextID){
    //~ webix.message(nextID)
    if(nextID == 'app_emisor'){
        $$('tab_emisor').setValue('Datos Fiscales')
        get_emisor()
        get_certificado()
        return
    }

    if(nextID == 'app_folios'){
        get_table_folios()
        return
    }

    if(nextID == 'app_correo'){
        get_config_correo()
        return
    }

    if(nextID == 'app_sat'){
        get_admin_impuestos()
        return
    }

    if(nextID == 'app_options'){
        get_config_values('templates')
        return
    }
}


function emisor_postal_code_key_up(){
    var value = this.getValue()

    if( value.length == 5 ){
        webix.ajax().get('/values/cp', {cp: value}, {
            error: function(text, data, xhr) {
                msg = 'Error al consultar el C.P.'
                msg_error(msg)
            },
            success: function(text, data, xhr) {
                var values = data.json();
                if (values.estado == undefined){
                    msg = 'No se encontró el C.P., asegurate de que sea correcto'
                    msg_error(msg)
                } else {
                    $$('form_emisor').setValues({
                        emisor_cp2: value,
                        emisor_estado: values.estado,
                        emisor_municipio: values.municipio,
                        emisor_colonia: ''}, true)
                    $$('emisor_colonia').define('suggest', [])
                    if (webix.isArray(values.colonia)){
                        $$('emisor_colonia').define('suggest', values.colonia)
                    }else{
                        $$('form_emisor').setValues(
                            {emisor_colonia: values.colonia}, true)
                    }
                    $$('emisor_colonia').refresh()
                }
            }
        })
    }
}


function emisor_postal_code_key_press(code, e){
    var data = [8, 9, 37, 39, 46]
    if ( data.indexOf(code) >= 0 ){
        return true;
    }

    if ( code < 48 || code > 57){
        return false;
    }
}


function chk_escuela_change(new_value, old_value){
    var value = Boolean(new_value)
    if (value){
        $$('cmd_niveles').enable()
    } else {
        $$('cmd_niveles').disable()
    }
}


function chk_ong_change(new_value, old_value){
    var value = Boolean(new_value)
    if (value){
        $$('ong_autorizacion').enable()
        $$('ong_fecha').enable()
        $$('ong_fecha_dof').enable()
    } else {
        $$('ong_autorizacion').disable()
        $$('ong_fecha').disable()
        $$('ong_fecha_dof').disable()
    }
}


function cmd_subir_certificado_click(){
    var form = $$('form_upload')

    if (!form.validate()){
        msg = 'Valores inválidos'
        msg_error(msg)
        return
    }

    var values = form.getValues()

    if(!values.contra.trim()){
        msg = 'La contraseña no puede estar vacía'
        msg_error(msg)
        return
    }

    if($$('lst_cert').count() < 2){
        msg = 'Selecciona al menos dos archivos: CER y KEY del certificado.'
        msg_error(msg)
        return
    }

    if($$('lst_cert').count() > 2){
        msg = 'Selecciona solo dos archivos: CER y KEY del certificado.'
        msg_error(msg)
        return
    }

    var fo1 = $$('up_cert').files.getItem($$('up_cert').files.getFirstId())
    var fo2 = $$('up_cert').files.getItem($$('up_cert').files.getLastId())

    var ext = ['key', 'cer']
    if(ext.indexOf(fo1.type.toLowerCase()) == -1 || ext.indexOf(fo2.type.toLowerCase()) == -1){
        msg = 'Archivos inválidos, se requiere un archivo CER y un KEY.'
        msg_error(msg)
        return
    }

    if(fo1.type == fo2.type && fo1.size == fo2.size){
        msg = 'Selecciona archivos diferentes: un archivo CER y un KEY.'
        msg_error(msg)
        return
    }

    var rfc = $$('form_cert').getValues()['cert_rfc']

    if(rfc){
        msg = 'Ya existe un certificado guardado<BR><BR>¿Deseas reemplazarlo?'
        webix.confirm({
            title: 'Certificado Existente',
            ok: 'Si',
            cancel: 'No',
            type: 'confirm-error',
            text: msg,
            callback:function(result){
                if(result){
                    $$('up_cert').send()
                }
            }
        })
    }else{
        $$('up_cert').send()
    }
}


function up_cert_upload_complete(response){
    if(response.status != 'server'){
        msg = 'Ocurrio un error al subir los archivos'
        msg_error(msg)
        return
    }

    msg = 'Archivos subidos correctamente. Esperando validación'
    msg_sucess(msg)

    var values = $$('form_upload').getValues()
    $$('form_upload').setValues({})
    $$('up_cert').files.data.clearAll()

    webix.ajax().post('/values/cert', values, {
        error:function(text, data, XmlHttpRequest){
            msg = 'Ocurrio un error, consulta a soporte técnico'
            msg_error(msg)
        },
        success:function(text, data, XmlHttpRequest){
            var values = data.json()
            if(values.ok){
                $$('form_cert').setValues(values.data)
                msg_sucess(values.msg)
            }else{
                msg_error(values.msg)
            }
        }
    })
}


function cmd_agregar_serie_click(){
    var form = $$('form_folios')
    var grid = $$('grid_folios')

    if (!form.validate()){
        msg = 'Valores inválidos'
        msg_error(msg)
        return
    }

    var values = form.getValues()

    var reg = /^[a-z]+$/i
    if(!reg.test(values.folio_serie)){
        msg = 'Introduce una serie válida. Solo letras.'
        msg_error(msg)
        return
    }

    var pre = '1'
    if(grid.count() > 0){
        pre = ''
    }

    var usarcon = ''
    if(values.folio_usarcon != 'S'){
        usarcon = values.folio_usarcon
    }

    var values = {
        serie: values.folio_serie.trim().toUpperCase(),
        inicio: values.folio_inicio,
        usarcon: usarcon,
        default: pre,
    }

    webix.ajax().post('/folios', values, {
        error:function(text, data, XmlHttpRequest){
            msg = 'Ocurrio un error, consulta a soporte técnico'
            msg_error(msg)
        },
        success:function(text, data, XmlHttpRequest){
            var values = data.json()
            if(values.ok){
                form.setValues(
                    {folio_serie: '', folio_inicio: 1, folio_usarcon: 'S'})
                grid.add(values.row)
                msg = 'Serie agregada correctamente'
                msg_sucess(msg)
            }else{
                msg_error(values.msg)
            }
        }
    })
}


function grid_folios_click(id, e, node){
    if(id.column != 'delete'){
        return
    }

    msg = '¿Estás seguro de borrar esta serie?<BR><BR>ESTA ACCIÓN NO SE PUEDE DESHACER'
    webix.confirm({
        title: 'Borrar Serie',
        ok: 'Si',
        cancel: 'No',
        type: 'confirm-error',
        text: msg,
        callback:function(result){
            if(result){
                webix.ajax().del('/folios', {id: id.row}, function(text, xml, xhr){
                    msg = 'Serie eliminada correctamente'
                    if(xhr.status == 200){
                        $$('grid_folios').remove(id.row)
                        msg_sucess(msg)
                    }else{
                        msg = 'No se pudo eliminar'
                        msg_error(msg)
                    }
                })
            }
        }
    })
}


function validar_correo(values){

    if(!values.correo_servidor.trim()){
        msg = 'El servidor de salida no puede estar vacío'
        msg_error(msg)
        return false
    }
    if(!values.correo_puerto){
        msg = 'El puerto no puede ser cero'
        msg_error(msg)
        return false
    }
    if(!values.correo_usuario.trim()){
        msg = 'El nombre de usuario no puede estar vacío'
        msg_error(msg)
        return false
    }
    if(!values.correo_contra.trim()){
        msg = 'La contraseña no puede estar vacía'
        msg_error(msg)
        return false
    }
    if(!values.correo_asunto.trim()){
        msg = 'El asunto del correo no puede estar vacío'
        msg_error(msg)
        return false
    }
    if(!values.correo_mensaje.trim()){
        msg = 'El mensaje del correo no puede estar vacío'
        msg_error(msg)
        return false
    }

    return true
}


function cmd_probar_correo_click(){
    var form = $$('form_correo')
    var values = form.getValues()

    if(!validar_correo(values)){
        return
    }

    webix.ajax().sync().post('/values/correo', values, {
        error: function(text, data, xhr) {
            msg = 'Error al probar el correo'
            msg_error(msg)
        },
        success: function(text, data, xhr) {
            var values = data.json();
            if (values.ok){
                msg = 'Correo de prueba enviado correctamente. Ya puedes \
                    guardar esta configuración'
                msg_sucess(msg)
            }else{
                msg_error(values.msg)
            }
        }
    })

}


function save_config_mail(values){

    webix.ajax().sync().post('/config', values, {
        error: function(text, data, xhr) {
            msg = 'Error al guardar la configuración'
            msg_error(msg)
        },
        success: function(text, data, xhr) {
            var values = data.json();
            if (values.ok){
                msg = 'Configuración guardada correctamente'
                msg_sucess(msg)
            }else{
                msg_error(values.msg)
            }
        }
    })

}


function cmd_guardar_correo_click(){
    var form = $$('form_correo')
    var values = form.getValues()

    if(!validar_correo(values)){
        return
    }

    msg = 'Asegurate de haber probado la configuración<BR><BR>\
        ¿Estás seguro de guardar estos datos?'
    webix.confirm({
        title: 'Configuración de correo',
        ok: 'Si',
        cancel: 'No',
        type: 'confirm-error',
        text: msg,
        callback:function(result){
            if(result){
                save_config_mail(values)
            }
        }
    })
}


function emisor_logo_click(id, e){

    var w = webix.ui({
        view: 'window',
        id: 'win_emisor_logo',
        modal: true,
        position: 'center',
        head: 'Subir logotipo',
        body: {
            view: 'form',
            elements: body_win_emisor_logo,
        }
    })

    w.show()

    $$('up_emisor_logo').attachEvent('onUploadComplete', function(response){
        $$('emisor_logo').setValue(response.name)
        msg_sucess('Logotipo cargado correctamente')
    })

}


function txt_plantilla_factura_33_click(e){

    var body_elements = [
        {cols: [{width: 100}, {view: 'uploader', id: 'up_template', autosend: true, link: 'lst_files',
            value: 'Seleccionar archivo', upload: '/files/txt_plantilla_factura_33',
            width: 200}, {width: 100}]},
        {view: 'list',  id: 'lst_files', type: 'uploader', autoheight:true,
            borderless: true},
        {},
        {cols: [{}, {view: 'button', label: 'Cerrar', autowidth: true,
            click:("$$('win_template').close();")}, {}]}
    ]

    var w = webix.ui({
        view: 'window',
        id: 'win_template',
        modal: true,
        position: 'center',
        head: 'Subir Plantilla',
        body: {
            view: 'form',
            elements: body_elements,
        }
    })

    w.show()

    $$('up_template').attachEvent('onUploadComplete', function(response){
        if(response.ok){
            $$('txt_plantilla_factura_33').setValue(response.name)
            msg_sucess('Plantilla cargada correctamente')
        }else{
            msg_error(response.name)
        }
    })
}


function tab_options_change(nv, ov){
    var cv = {
        Plantillas: 'templates',
    }
    get_config_values(cv[nv])
}


function tab_sat_change(nv, ov){
    //~ show(nv)
    if(nv = 'Monedas'){
        get_admin_monedas()
        return
    }
}


function grid_admin_taxes_on_check(row, column, state){

    var values = {
        id: row,
        field: column,
        value: state,
    }
    webix.ajax().get('/values/taxupdate', values, {
        error: function(text, data, xhr) {
        },
        success: function(text, data, xhr) {
        }
    })
}


function grid_admin_monedas_on_check(row, column, state){

    var values = {
        id: row,
        field: column,
        value: state,
    }
    webix.ajax().get('/values/currencyupdate', values, {
        error: function(text, data, xhr) {
        },
        success: function(text, data, xhr) {
        }
    })
}
