// 
// 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 System.Diagnostics;
using System.IO;

namespace operador.utiles
{
    public class SieteZipWraper
    {
        public bool disponible = false;
        string path7z = null;
        string ficheroZip = null;
        Process p7z = null;
        List<string> listado;

        public SieteZipWraper(string ficheroZip) {
            this.ficheroZip = ficheroZip;
            buscarPath7z();
        }

        void buscarPath7z() {
             path7z = (string)Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\7-Zip", "Path", @"C:\Archivos de programa\7-Zip");
            path7z += "\\7z.exe";
            if (File.Exists(path7z)) {
                disponible = true;
            }
        }

        void ejecutar(bool redireccSalida, string argumentos) {
            p7z = new Process();
            p7z.StartInfo.UseShellExecute = false;
            p7z.StartInfo.RedirectStandardOutput = redireccSalida;
            p7z.StartInfo.FileName = path7z;
            p7z.StartInfo.CreateNoWindow = true;
            p7z.StartInfo.Arguments = argumentos;
            p7z.Start();
            if (redireccSalida) {
                string linea;
                listado = new List<string>(500);
                while ((linea = p7z.StandardOutput.ReadLine()) != null) {
                    listado.Add(linea);
                }
            } else {
                p7z.WaitForExit();
            }
        }

        public void procesar(string destino) {
            string parDirSalida = "";
            if (destino != "") {
                parDirSalida = " -o\"" + destino + "\" ";
            }
            ejecutar(false, "e -y " + parDirSalida + ficheroZip);
            File.Delete(destino + "manifiesto");
        }

        public ManifiestoZip extraerManifiesto() {
            ejecutar(true, "e -y " + ficheroZip + " manifiesto");
            ManifiestoZip mani = new ManifiestoZip();
            if (!listado.Contains("No files to process")) {
                using (StreamReader sr = new StreamReader("manifiesto", Encoding.Default)) {
                    string linea;
                    while ((linea = sr.ReadLine()) != null) {
                        string[] lp = linea.Split('=');
                        lp[0] = lp[0].Trim();
                        if (lp.Length > 1) lp[1] = lp[1].Trim();
                        if (lp[0] == "autorun") mani.autoRun = lp[1];
                        if (lp[0] == "raiz") {
                            if (lp.Length == 1 || lp[1] == ".\\") {
                                mani.raizZip = "";
                            } else {
                                mani.raizZip = lp[1];
                                if (!mani.raizZip.EndsWith("\\")) {
                                    mani.raizZip += "\\";
                                }
                            }
                        }
                    }
                }
            }
            File.Delete("manifiesto");
            return mani;
        }
    }

    public class ManifiestoZip
    {
        public string raizZip = "";
        public string autoRun = "";
    }
}
