// 
// Copyright 2016 Agencia Estatal de Administración Tibutaria
//
// Licencia con arreglo a la EUPL, Versión 1.1 o -en cuanto
// sean aprobadas por la Comisión Europea- versiones
// posteriores de la EUPL (la «Licencia»);
// Solo podrá usarse esta obra si se respeta la Licencia.
// Puede obtenerse una copia de la Licencia en:
//  
// https://joinup.ec.europa.eu/software/page/eupl
//  
// Salvo cuando lo exija la legislación aplicable o se acuerde
// por escrito, el programa distribuido con arreglo a la
// Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
// DE NINGÚN TIPO, ni expresasni implícitas.
//
// Véase la Licencia en el idioma concreto que rige los permisos y 
// limitaciones que establece la Licencia.
// 

using System;
using System.Collections.Generic;
using System.Text;
using mshtml;

namespace operador.iexplorer
{
    public class Tabla
    {
        public HTMLTableClass htab;
        public string id = null;

        public Tabla(HTMLTableClass htmlTable) {
            htab = htmlTable;
            this.id = htmlTable.id;
        }
        public string valorCelda(int f, int c)
        {
            
                try
                {
                    HTMLTableRowClass row = htab.rows.item(f, null) as HTMLTableRowClass;
                    HTMLTableCellClass cell = row.cells.item(c, null) as HTMLTableCellClass;
                    return cell.innerText;
                }
                catch (Exception)
                {
                    return null;
                }
            
        }
        public int existeEnRow(string cadena)
        {
            int n = numColumnas(0);

            for (int i = 0; i < htab.rows.length; i++)
            {
                if (valorCelda(i, 0).Trim() == cadena)
                {
                    return i;

                }
            }
            return -1;


        }
        public int existeEnCabecera(string cadena)
        {
            HTMLTableRowClass row = htab.rows.item(0, null) as HTMLTableRowClass;
            int n = numColumnas(0);

            HTMLTableCellClass cell;
           

            for (int i = 0; i < n; i++)
            {
                cell = row.cells.item(i, null) as HTMLTableCellClass;
                if (cell.innerText.Trim() == cadena)
                {
                    return i;

                }
            }
            return -1;


        }
        public string valorCelda(string cadenaBuscada, int c)
        {

            try
            {
                int p  = existeEnRow(cadenaBuscada);
                if (p < 0) return "";

                HTMLTableRowClass row = htab.rows.item(p, null) as HTMLTableRowClass;
                HTMLTableCellClass cell = row.cells.item(c, null) as HTMLTableCellClass;
                return cell.innerText;
            }
            catch (Exception)
            {
                return null;
            }

        }
        public string clickCeldaCabecera(string cadenaBuscada)        {

            try
            {
                int p = existeEnCabecera(cadenaBuscada);
                if (p < 0) return "";

                HTMLTableRowClass row = htab.rows.item(0, null) as HTMLTableRowClass;
                HTMLTableCellClass cell = row.cells.item(p, null) as HTMLTableCellClass;
                cell.click();
                return cell.innerText;
            }
            catch (Exception)
            {
                return "No encontrado";
            }

        }
        public string valorCelda(string cadenaF, string cadenaC)
        {

            try
            {
                int p = existeEnRow(cadenaF);
                if (p < 0) return "";
                int c = existeEnCabecera(cadenaC);
                if (c < 0) return "";

                HTMLTableRowClass row = htab.rows.item(p, null) as HTMLTableRowClass;
                HTMLTableCellClass cell = row.cells.item(c, null) as HTMLTableCellClass;
                return cell.innerText;
            }
            catch (Exception)
            {
                return null;
            }

        }
        public string devolverFila(string cadena)
        {
            int p = existeEnRow(cadena);
            if (p < 0) return "";
            return devolverFila(p);
        }


         public string devolverFila(int f)
        {
            string cadena = "";
            HTMLTableRowClass row = htab.rows.item(f, null) as HTMLTableRowClass;
            int n = numColumnas(0);
            for (int i = 0; i < numColumnas(f); i++)
            {
                cadena = cadena + valorCelda(f, i)+ "\t"; 
            }
            return cadena;
        }
         public string devolverTabla()
         {
             string cadena = "";
             int f = numFilas;
             int n = numColumnas(0);
             for (int i = 0; i < f; i++)
             {
                 cadena = cadena + devolverFila(i) + "\n";
             }
             return cadena;
         }

        public string devolverCabecera()
        {
            return devolverFila(0);
        }
        private int columna(string nombreC)
        {
            HTMLTableRowClass row = htab.rows.item(0, null) as HTMLTableRowClass;
            int n = numColumnas(0);
            for (int i = 0; i < n ; i++)
            {
                if (valorCelda(0, i) == nombreC)
                {
                    return n;
                }
            }
            return -1;
        }
        //private int devolverFila(string nombreF)
        //{
        //    int p = existeEnRow(nombreF);
        //    if (p < 0) return  -1;
        //    return p;
       
        //}

        public string this[int f, int c] {
            get {
                try {
                    HTMLTableRowClass row = htab.rows.item(f, null) as HTMLTableRowClass;
                    HTMLTableCellClass cell = row.cells.item(c, null) as HTMLTableCellClass;
                    return cell.innerText;
                } catch (Exception) {
                    return null;
                }
            }
        }

        public HTMLTableCellClass celda(int f, int c) {
            try {
                HTMLTableRowClass row = htab.rows.item(f, null) as HTMLTableRowClass;
                HTMLTableCellClass cell = row.cells.item(c, null) as HTMLTableCellClass;
                return cell;
            } catch (Exception) {
                return null;
            }
        }

        public int numFilas {
            get {
                return htab.rows.length;
            }
        }

        public int numColumnas(int f) {
            HTMLTableRowClass fila = htab.rows.item(null, f) as HTMLTableRowClass;
            return fila.cells.length;
        }

        public FilaTabla fila(int n) {
            return new FilaTabla(htab.rows.item(n, null) as HTMLTableRowClass);
        }
    }

    public class FilaTabla
    {
        HTMLTableRowClass fila;
        int _numCeldas;
        public int numCeldas {
            get { return _numCeldas; }
        }

        public FilaTabla(HTMLTableRowClass row) {
            fila = row;
            _numCeldas = fila.cells.length;
        }

        public string this[int c] {
            get {
                HTMLTableCellClass celda = fila.cells.item(c, null) as HTMLTableCellClass;
                return celda.innerText;
            }
        }

        public HTMLTableCellClass celda(int c) {
            try {
                HTMLTableCellClass cell = fila.cells.item(c, null) as HTMLTableCellClass;
                return cell;
            } catch (Exception) {
                return null;
            }
        }

        public Tabla tabla() {
            IHTMLElement e = fila.parentElement;
            while (e.tagName != "TABLE") {
                e = e.parentElement;
            }
            return new Tabla(e as HTMLTableClass);
        }
    }
}
