// 
// 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.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Management;
using System.Diagnostics;
using System.Data.SqlClient;

namespace InstaladorATENEO
{
    public partial class FAdjuntar : Form
    {
      // string patOriginal = "";
        string patDestino = "";
        string patDestinoUNC = "";
        string nuevaPass = "";
        string nombrefichero = "";
        string nombreficheroCorto = "";
        DataTable dt;

        public FAdjuntar(string nuevapass)
        {
            InitializeComponent();
            nuevaPass = nuevapass;
            dt = new DataTable();
           
        }
       
        string sutituirLetra(string letra)
        {
            if (letra.StartsWith("\\")) return letra;
            string recurso = "";
            string cadnueva = "";
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_MappedLogicalDisk WHERE Name = '" + letra.Substring(0, 1) + ":'");

            foreach (ManagementObject queryObj in searcher.Get())
            {

                recurso = queryObj["ProviderName"].ToString();
                if (recurso.Length > 2)
                {
                    cadnueva = letra.Trim().Substring(2);
                    cadnueva = recurso + cadnueva;
                    //label3.Text = cadnueva;
                    //label2.Text = cadnueva;
                    return cadnueva;
                }
                else
                {
                  // label2.Text = "No hay disco en red";
                    return letra;
                }

            }
            return letra;
        }

        void adjuntarAteneo()
        {
            darPermisos(patDestino,nombreficheroCorto);
            crearAccionesAdjuntar(nombrefichero);
        //    bdAteneoFichero();


        }
        void crearAccionesAdjuntar(string nombref)
        {

            System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("OSQL.exe", @"-Usa -P" + nuevaPass + " -Slocalhost\\Ateneo");
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardInput = true;
            psi.RedirectStandardError = true;
            psi.UseShellExecute = false;
            psi.CreateNoWindow = true;
            System.Diagnostics.Process proc = System.Diagnostics.Process.Start(psi);

            proc.StandardInput.WriteLine(@"sp_detach_db '" + nombreficheroCorto + "'");
            // proc.StandardInput.WriteLine(@"sp_addsrvrolemember 'ServidorAteneo', 'sysadmin'");
            proc.StandardInput.WriteLine(@"GO");
            proc.StandardInput.WriteLine(@"DBCC TRACEON(1807,-1)");
            proc.StandardInput.WriteLine(@"GO");
            lMensa.Text = "Adjuntando";
            Application.DoEvents();
            //        sqlout += proc.StandardOutput.ReadToEnd();
            string lineac = "CREATE DATABASE "+nombreficheroCorto+ " ON (FILENAME ='" + patDestino + nombref+"'),(FILENAME = '" + patDestino +nombreficheroCorto+"_log.ldf') FOR ATTACH";
            proc.StandardInput.WriteLine(@"CREATE DATABASE " + nombreficheroCorto + " ON (FILENAME ='" + patDestino + nombref + "'),(FILENAME = '" + patDestino + nombreficheroCorto + "_log.ldf') FOR ATTACH");
            proc.StandardInput.WriteLine(@"GO");
            proc.StandardInput.WriteLine(@"EXIT");
            string lines = "";
            while (!proc.StandardOutput.EndOfStream)
            {
                string line = proc.StandardOutput.ReadLine();
                lines = lines + line;
            }
            proc.Close();
            //      MessageBox.Show(lines);
            if (lines.IndexOf("5133,") > 0)
            {
                lMensa.Text = "Error en cuenta del Servicio SQLSERVER(ATENEO)";
                MessageBox.Show(lines + "\n\nComprobar punto 1º", "Error en adjuntar");

                return;
            }
            lMensa.Text = "Preparando Servicio";
            Application.DoEvents();
            serviceController1.Stop();
            while (serviceController1.Status.ToString() != "Stopped")
            {
                System.Threading.Thread.Sleep(2000);
                serviceController1.Refresh();
            }
            label1.Text = serviceController1.Status.ToString();
            Application.DoEvents();

            darPermisos(patDestino,nombreficheroCorto);
            lMensa.Text = "Actualizando permisos";
            Application.DoEvents();
            // copiarFicheros();
            serviceController1.Start();
            while (serviceController1.Status.ToString() != "Running")
            {
                System.Threading.Thread.Sleep(2000);
                serviceController1.Refresh();
            }
              string sCnn;
              sCnn = "data source =localhost\\Ateneo; initial catalog = Master; user id = sa; password =" + nuevaPass;
            string sSel = "select Name,Filename,cmptlevel,crdate from master.dbo.sysdatabases WHERE name  =  '"+nombreficheroCorto+ "'";

            SqlDataAdapter da;
          
            dt.Clear();
            try
            {
                da = new SqlDataAdapter(sSel, sCnn);

                da.Fill(dt);
                if (dt.Rows.Count == 0)
                {
                    DataRow row1 = dt.Rows[0];

                    label1.Text = "No se pudo adjuntar";
                    lMensa.Text = "Proceso finalizado error";

                    return;
                }

                if (dt.Rows.Count == 1)
                {
                    DataRow row1 = dt.Rows[0];
                   
                    label1.Text =row1["Filename"].ToString();
                    MessageBox.Show("Proceso finalizado");
                    lMensa.Text = "Proceso finalizado Ok";

                    return;
                }

                
            }
            catch (Exception ex)
            {
                // LabelInfo.Text = "Error: " + ex.Message;
            }
       
        }
        void darPermisos(string pat,string nombref)
        {
            string maquina = Environment.MachineName;
            string comando = "icacls " + pat + " /grant " + maquina + ":(F) /T";
            string nomcomputer = System.Environment.UserDomainName + "\\" + System.Environment.MachineName;

            string cadena = pat + nombref+"*.* /grant " + nomcomputer + "$:(F)";
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(@"icacls.exe");
            startInfo.WorkingDirectory = pat;
            startInfo.Arguments = nombref+"*.* /T /grant " + nomcomputer + "$:(F)";
            Process.Start(startInfo);

        }
        void ExecuteCommand(string _Command)
        {
            Cursor.Current = Cursors.WaitCursor;

            //Indicamos que deseamos inicializar el proceso cmd.exe junto a un comando de arranque.             //(/C, le indicamos al proceso cmd que deseamos que cuando termine la tarea asignada se cierre el proceso).            //Para mas informacion consulte la ayuda de la consola con cmd.exe /?    
            System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + _Command);
            // Indicamos que la salida del proceso se redireccione en un Stream 
            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;
            //Indica que el proceso no despliegue una pantalla negra (El proceso se ejecuta en background)     
            // procStartInfo.CreateNoWindow = true;
            //Inicializa el proceso          
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo = procStartInfo;
            proc.Start();
            proc.WaitForExit();
            //Consigue la salida de la Consola(Stream) y devuelve una cadena de texto
            //  string result = proc.StandardOutput.ReadToEnd();
           // Cursor.Current = Cursors.Default;

        }

        private void FAdjuntar_Shown(object sender, EventArgs e)
        {
            this.openFileDialog1.Filter = "mdf files (*.mdf)|*.mdf";
            this.openFileDialog1.InitialDirectory = Environment.SpecialFolder.ProgramFiles.ToString();
         
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                Cursor.Current = Cursors.WaitCursor;
                patDestino = openFileDialog1.FileName;
                nombrefichero = openFileDialog1.SafeFileName;
                nombreficheroCorto = nombrefichero.Substring(0, nombrefichero.Length - 4);
                patDestino = patDestino.Substring(0, patDestino.Length - nombrefichero.Length);
                patDestinoUNC = sutituirLetra(patDestino);
                label2.Text = patDestinoUNC;
                adjuntarAteneo();
                Cursor.Current = Cursors.Default;

            }
            else
            {
                this.Close();
            }
        }
    }
}
