import cheerio from 'cheerio';
import { Dictionary } from 'typescript-collections';
import { IParseHtml } from './parseHtml.interface';
import { Departamento } from './departamento'
import { Direccion } from './direccion';
import { RazonSocial } from './razonSocial';

export class ParseHtml implements IParseHtml 
{
    /**
     * 
     * @param string dato 
     * @return RazonSocial
     * 
     */
    getRazonSocial(dato: string): RazonSocial{
        const razonSocial = new RazonSocial();
        let _dato: string[] = dato.split('-').map((dato: string) => dato.trim());
        let _rs: string;
        if (_dato.length === 3){
            _rs = `${_dato[1]} - ${_dato[2]}`;
        }else{
            _rs = _dato[1];
        }
        razonSocial.Ruc = _dato[0];
        razonSocial.RazonSocial = _rs;
        return razonSocial;
    }

    /**
     * 
     * @param string departamento 
     * @return Departamento
     * 
     */
    getDepartamento(departamento: string): Departamento{
        const _departamento = new Departamento();
        switch(departamento.toUpperCase()){
            case 'DIOS':
                _departamento.Departamento = 'MADRE DE DIOS';
                _departamento.Cantidad = 3;
            break;
            case 'MARTIN':
                _departamento.Departamento = 'SAN MARTIN';
                _departamento.Cantidad = 2;
            break;
            case 'LIBERTAD':
                _departamento.Departamento = 'LA LIBERTAD';
                _departamento.Cantidad = 2;
            break; 
            default:
                _departamento.Departamento = departamento;
                _departamento.Cantidad = 1;
            break;
        }
        return _departamento;
    }

    /**
     * 
     * @param string direccionCompleta 
     * @return Direccion
     * 
     */
    getDireccion(direccionCompleta: string): Direccion{
        const direccion = new Direccion();
        let _direccion: string[] = direccionCompleta.split('-').map((dato: string) => dato.trim());
        let _direccionCompleta: string[] = direccionCompleta.split('-').map((dato: string) => dato.trim());
        let _ultimoElemento: string;
        let _docimilio: string;
        let _splitDomicilio: string[]
        if (_direccionCompleta.length != 3){
            _direccionCompleta.splice(2);
            _docimilio = _direccionCompleta.join(' ');
           _splitDomicilio = _docimilio.split(' ');
            _ultimoElemento = _splitDomicilio[_splitDomicilio.length -1];
        }else{
            _docimilio = _direccionCompleta[_direccionCompleta.length - 3];
            _splitDomicilio = _docimilio.split(' ');
            _ultimoElemento = _splitDomicilio[_splitDomicilio.length-1];
        }
        let { Cantidad, Departamento } = this.getDepartamento(_ultimoElemento);
        _splitDomicilio.splice(-1*Cantidad);
        direccion.Departamento = Departamento;
        direccion.Provincia = _direccion[_direccion.length - 1];
        direccion.Distrito = _direccion[_direccion.length - 2]
        direccion.Domicilio = _splitDomicilio.join(' ')
        return direccion;
    }

    /**
     * 
     * @param string pagina 
     * @return Dictionary<string,any>
     * 
     */
    parseHtml(pagina: string): Dictionary<string,any>{
        const respuesta = new Dictionary<string, any>();
        const $ = cheerio.load(pagina);
        const table = $('.form-table').eq(2).find('tbody');
        const html = table.first().children("tr").find("td[class=bg]").html();
        if(!html){
            respuesta.setValue('ERROR', {
                Estado      : 'ERROR',
                Respuesta   : $('.form-table').eq(1).children('tbody').find('tr .bg').text()
            })
            return respuesta;
        }
        table.find('tr .bg').each((i, el)=>{
            let value:string[] = $(el).text().split('\n').map<string>((elemento: any) => {
                                        if(elemento.trim() != '')
                                            return elemento.replace(/[ \n\t]+/g, " ").trim()
                                    }).filter((elemento: any) => {
                                        return elemento !== undefined
                                    });
            let key: string     = $(el).prev().text().replace(/[ :\n\t]+/g, " ").trim();
            let vl: any         = value.length <=1  ? value.join() : value;
            respuesta.setValue(key, vl);
        });
        return respuesta;
    }
}