/* 
* 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.
*/ 


package servidor.datos;

import java.sql.*;
import javax.swing.JOptionPane;


import servidor.utiles.*;

public class BaseDatos {
   
   Connection conexion;
   static BaseDatos yo = null;
   
   public static BaseDatos bd() {
	  if(yo == null) {
		 yo = new BaseDatos();
		 if(! yo.abrir()) {
			yo = null;
		 }
	  }
	  return yo;
   }
   
   protected BaseDatos() {
   }
   
   public Connection getConnection() {
	  return conexion;
   }
   boolean abrir() {
	   
       conexion = abrirBD();
       if(conexion == null) {
    	   conexion = abrirBD();
    	   if (conexion==null) return false;
       }
       Inicializar_BD();
       return true;
   }
   Connection abrirBD() {
       // Primero cargamos el driver JDBC
       try {
           Class.forName("net.sourceforge.jtds.jdbc.Driver");
          // CreaLoginServidorAteneo();
       } catch(java.lang.ClassNotFoundException e)  {
           System.err.println("ClassNotFoundException: " + e.getMessage());
           return null;
       }
       // ahora intantamos la conexion
       Connection con = abrirConPasswordNormal();
       if(con == null) {
           //con = abrirConPasswordAlternativa();
    	  mensaje_Arranca_servidor();
       }
       return con;
   }
   
   public void cerrar() {
	  try {
		 // Esto asegura el cierre correcto de HSQLdb
		 //Statement stmt = conexion.createStatement();
		 //stmt.executeUpdate("SHUTDOWN");
		 conexion.close();
	  } catch(Exception e) {
		  Global.log.warning("Error al cerrar la Base de Datos");
	  }
   }
   
   public Tabla_Base tablabase(String tabla) {
	  return new Tabla_Base(conexion, tabla);
   }
   
   public TablaOperadores tablaOperadores() {
		  return new TablaOperadores(conexion);
	   }
   public TablaPuestos tablaPuestos() {
		  return new TablaPuestos(conexion);
	   }
   public TablaSalasEspera tablaSalasEspera() {
		  return new TablaSalasEspera(conexion);
	   }
   public TablaZonasAtencion tablaZonasAtencion() {
		  return new TablaZonasAtencion(conexion);
	   }
   public TablaServicios tablaServicios() {
		  return new TablaServicios(conexion);
	   }

   public TablaCategorias tablaCategorias() {
		  return new TablaCategorias(conexion);
	   }
   
   public TablaConfiSer tablaConfiSer() {
	   return new TablaConfiSer(conexion);
   }

   
   
   Connection abrirConPasswordNormal() {
	   
      // String url ="";
        String hostSql = resolverNombreServidorSql();
       String baseAte = servidor.Configuracion.getConfiguracion().BaseDatos;
//       url="jdbc:jtds:sqlserver://" + servidor.Configuracion.getConfiguracion().servidorSql +"/ATENEO;instance="+baseAte +
//            ";user=ServidorAteneo;password=oenetA";
         String url = "jdbc:jtds:sqlserver://" + hostSql + "/"+baseAte +
                    ";instance=ATENEO;user=ServidorAteneo;password=oenetA";
       
       Connection con = null;
       try {
           con = DriverManager.getConnection(url);
           
           return con;
       } catch(SQLException e) {
           if(e.getMessage().startsWith("Error de inicio de sesion")) {
               return null;
           }

       }
       return con;
   }
   
   
  
   
   private void Inicializar_BD(){
	 //   ServidorAteneoSysAdmin();
	    comprobarTablaConfiguracion();
	    
	
	}


	private void comprobarTablaConfiguracion() {
		if (numColumnasTabla("candidatos")<20)  {
			mensaje_Arranca_servidor();
		}
	    servidor.Configuracion.getConfiguracion().setTablaConfiguracion(yo.tablaConfiSer());
	    
	 }

//	void CreaLoginServidorAteneo(){
//		Connection con=null;
//		String url = "";
//		
//       if (servidor.Configuracion.getConfiguracion().usarsqlexpress)
//    	   url = "jdbc:jtds:sqlserver://" + servidor.Configuracion.getConfiguracion().servidorSql +";instance=ATENEO" +
//    	   ";user=ServidorAteneo;password=oenetA";
//       else
//    	   url = "jdbc:jtds:sqlserver://" + servidor.Configuracion.getConfiguracion().servidorSql +"/ateneo"+
//    	   ";user=ServidorAteneo;password=oenetA";
//       try {      
//           con = DriverManager.getConnection(url);
//       }
//       catch (Exception exc) {
//           System.out.println("No se pudo conectar con el servidor: "+servidor.Configuracion.getConfiguracion().servidorSql);  
//			JOptionPane.showMessageDialog(null,
//					"No se pudo conectar con el servidor: "+servidor.Configuracion.getConfiguracion().servidorSql,
//					"Conexion BD",JOptionPane.ERROR_MESSAGE);
//       }    
//       try {
//    	   CallableStatement stmt = con.prepareCall("{call sp_addlogin (?,?)}");
//           stmt.setString(1, "ServidorAteneo");
//           stmt.setString(2, "xxx");
//           stmt.execute();
//    	   stmt = con.prepareCall("{call sp_addsrvrolemember (?,?)}");
//           stmt.setString(1, "ServidorAteneo");
//           stmt.setString(2, "sysadmin");
//           stmt.execute();
//    	   stmt = con.prepareCall("{call sp_denylogin (?)}");
//           stmt.setString(1, "BUILTIN\\Administradores");
//           stmt.execute();
//           con.close();
//      
//       
//   }
//    catch (Exception exc) {
//          System.out.println("Login ServidorAteneo ya existia o error al crearlo");
//    
//    }
//	        
//	}
	
	
	

	 void mensaje_Arranca_servidor() {
               String hostSql = resolverNombreServidorSql();
	 String msg = "No se pudo conectar con la Base de Datos "+servidor.Configuracion.getConfiguracion().BaseDatos+ "\n\nen le SERVIDOR  "+hostSql+"\n\n" +
             "1- Edite el fichero configuracionServidor.ini\n" +
             "2- Modifique la clave BaseDatos=\n\n";
     javax.swing.JOptionPane.showMessageDialog(null, msg, "ATENEO", javax.swing.JOptionPane.ERROR_MESSAGE );
     System.exit(-1);
	 }
	 
	 
	 
	 
	/*************************************************
	 *  
	 *  RUTINAS ANTERIORES QUE YA NO UTILIZO.
	 */
	 
	 
	 
	 
	   public void MoverTabla(String Origen , String Destino, String listaCampos) {
			try {
				Statement stmt = conexion.createStatement();
				stmt.executeUpdate("INSERT INTO " + Destino + "(" + listaCampos + ")" +
						" SELECT " + listaCampos + " FROM "+ Origen);
			} catch(Exception exc) {
				 exc.printStackTrace();
				 System.exit(-1);
			}
	   }
	   
	   public void borrarTabla(String tabla) {
		  try {
			 Statement stmt = conexion.createStatement();
			 stmt.executeUpdate("DELETE * FROM " + tabla);
		  } catch(Exception exc) {
			  Global.log.warning("ERROR borrando tabla " + tabla + "\n" + exc.getMessage());
		  }
	   }

	   public void CrearTablaServicios() {
			  try {
				 Statement stmt = conexion.createStatement();
				 String SQLStr="CREATE TABLE [dbo].[Servicios] (  [Codigo] int NOT NULL, [Descripcion] nvarchar(70) " +
				 		"CONSTRAINT [DF_Servicios_Descripcion] DEFAULT '' NULL,[CodigoEstadistico] nvarchar(2) CONSTRAINT " +
				 		"[DF_Servicios_CodigoEstadistico] DEFAULT '' NULL,[Activo] bit CONSTRAINT [DF_Servicios_Activo] " +
				 		"DEFAULT 1 NULL,[ColasAsociadas] nvarchar(50) CONSTRAINT [DF_Servicios_ColasAsociadas] DEFAULT '' " +
				 		"NULL,CONSTRAINT [PK_Servicios] PRIMARY KEY NONCLUSTERED ([Codigo])) ON [PRIMARY]";
				 stmt.executeUpdate(SQLStr);
			  } catch(Exception exc) {
				  Global.log.warning("ERROR creando tabla de Servicios CP \n" + exc.getMessage());
			  }
		   }
	   	 
	 
	void OLDComprbacionTablas(){ 
	 Tabla_Base cates=BaseDatos.bd().tablabase("CategoriasEsta");
		cates.leerDatos();
		if (cates.recordsCount() < 3) {
			try {
				cates.SQL("delete from CategoriasEsta");
				cates.SQL(InsertCategoria_SQLStr(0,"SIN ASIGNAR"));
				cates.SQL(InsertCategoria_SQLStr(1,"GENERAL"));
				cates.SQL(InsertCategoria_SQLStr(2,"OTROS"));			
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
			Tabla_Base colas=BaseDatos.bd().tablabase("Colas");
			colas.leerDatos();
//			if (colas.recordsCount()==0) {
//				try {
//					colas.SQL("INSERT INTO Colas (Cola,Descripcion,Bonificacion,Numero,Activa,Navegar,CodigoEstadistico,CitaPrevia,cerrada,UmbralSuplencia,TiempoMedio,IdSalaEspera)  " +
//							  "VALUES ('A','Cola A',0,0,0,0,'1',1,0,0,0,0)");
//
//
//				} catch (SQLException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//
//			}
			TablaServicios Servicio=BaseDatos.bd().tablaServicios();
			Servicio.leerDatos();
//			if (Servicio.recordsCount()==-1){ //No existe la tabla
//				BaseDatos.bd().CrearTablaServicios();
//			}
			Servicio=BaseDatos.bd().tablaServicios();
			Servicio.leerDatos();		
			if (Servicio.recordsCount()==0) {
	/*			try {
					Servicio.nuevoServicioCP("29", "IRPF REQUER. JUSTIFICANTES/DISCREPANCIAS", "15", "0", "");
					Servicio.nuevoServicioCP("30", "REQUERIMIENTOS ART. 123 IRPF MODULOS", "16", "0", "");
					Servicio.nuevoServicioCP("59", "REQUERIMIENTOS SOL.DOC. Y/O ACLARAC.NO DECL.IVA", "14", "0", "");				
					Servicio.nuevoServicioCP("60", "REQUERIMIENTOS IVA EXPORTADORES", "14", "0", "");
					Servicio.nuevoServicioCP("61", "REQUERIMIENTOS DE I.V.A. (ART. 136)", "14", "0", "");
					Servicio.nuevoServicioCP("62", "REQUERIMIENTOS DE SOCIEDADES (ART. 123)", "13", "0", "");
					Servicio.nuevoServicioCP("63", "REQUERIMIENTOS ART. 123 IRPF", "15", "0", "");
					Servicio.nuevoServicioCP("64", "REQUERIMIENTOS DE I.V.A. (OTRAS DISCREPANCIAS)", "14", "0", "");				
					Servicio.nuevoServicioCP("65", "REQUERIMIENTOS DE SOCIEDADES E IRNR (EP)", "13", "0", "");
					Servicio.nuevoServicioCP("66", "REQUERIMIENTOS SOCIEDADES PATRIMONIALES.", "13", "0", "");
					Servicio.nuevoServicioCP("67", "REQUERIMIENTOS A CONTRIBUYENTES DE ESPECIAL SEGUIMIENTO", "22", "0", "");
					Servicio.nuevoServicioCP("68", "I.V.A. REGIMEN SIMPLIFICADO (INDICES Y MODULOS)", "16", "0", "");
					Servicio.nuevoServicioCP("69", "CONTROL PAGOS FRACCIONADOS 202", "13", "0", "");				
					Servicio.nuevoServicioCP("70", "REQUERIMIENTOS A C.E.S.POR INCUMPLIMIENTOS RELATIVO", "22", "0", "");
					Servicio.nuevoServicioCP("71", "CONTROL INCUMPLIMIENTOS MODULOS (131 - 310)", "16", "0", "");
					Servicio.nuevoServicioCP("72", "ASISTENCIA MODULOS", "16", "0", "");
					Servicio.nuevoServicioCP("74", "RECTIFICACION BORRADOR IRPF.", "15", "0", "");
					Servicio.nuevoServicioCP("75", "PADRE I.R.P.F.", "5", "0", "");				
					Servicio.nuevoServicioCP("76", "PADRE RENTA - ESTIMACION OBJETIVA (MODULOS)", "5", "0", "");
					Servicio.nuevoServicioCP("77", "COMUNICANTES I.R.P.F.", "15", "0", "");	
					Servicio.nuevoServicioCP("78", "I.R.P.F.REQUERIMIENTOS INTERNET", "15", "0", "");
					Servicio.nuevoServicioCP("80", "SERVICIO DE INFORMACION INDIVIDUALIZADA DE RECAUDACION", "18", "0", "");
					Servicio.nuevoServicioCP("81", "CENSOS (DECLARACION MODELO 036)", "8", "0", "");

					
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}*/
			}
	}
	private String InsertCategoria_SQLStr(int codigo,String Descripcion){
		  String salida="INSERT INTO CategoriasEsta (CodigoEstadistico,CategoriaEsta) VALUES (" + codigo + ",'" + Descripcion + "')" ;
		  return salida;
		}

	public int numColumnasTabla(String tabla) {
	    try {
	       Statement stmt = conexion.createStatement();
	       ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM " + tabla);
	       ResultSetMetaData rsmd = rs.getMetaData();
	       int numCampos = rsmd.getColumnCount();
	       stmt.close();
	       return numCampos;
	    } catch (Exception exc) {
	    }
	    return 0;
	 }
		 
	   private int SQL(String sql) throws SQLException {
		   int salida;
			 Statement stmt = conexion.createStatement();
			 salida= stmt.executeUpdate(sql);
			 return salida;
	   }

	   private void renombracodigoservicio() throws SQLException {
		   CallableStatement stmt = conexion.prepareCall("{call sp_rename(?,?,?)}");
           stmt.setString(1, "Colas.[codigoServicio]");
           stmt.setString(2, "UmbralSuplencia");
           stmt.setString(3, "COLUMN");
           stmt.execute();
	   }
           public String resolverNombreServidorSql() {
      String hostSql = servidor.Configuracion.getConfiguracion().servidorSql;
      if (hostSql.equalsIgnoreCase("localhost")) {
         try {
            java.net.InetAddress ie = java.net.InetAddress.getLocalHost();
            hostSql = ie.getHostName();
         } catch (Exception exc) {
            System.err.println(exc.getMessage());
         }
      }
      return hostSql;
   }

	   
	   
	   
	   
	   
	   
}
