using SteamWare;
using System;
using System.IO;

namespace NKC_WF.WebUserContols
{
    public class FileUploadEventArgs : EventArgs
    {
        /// <summary>
        /// Evento con argomenti soppevato post fileUpload
        /// </summary>
        /// <param name="localPath"></param>
        /// <param name="fileName"></param>
        /// <param name="batchName"></param>
        public FileUploadEventArgs(string localPath, string fileName, string batchName)
        {
            _localPath = localPath;
            _fileName = fileName;
            _batchName = batchName;
        }
        private string _localPath;
        private string _fileName;
        private string _batchName;

        public string LocalPath
        {
            get { return _localPath; }
            set { _localPath = value; }
        }
        public string FileName
        {
            get { return _fileName; }
            set { _fileName = value; }
        }
        public string BatchName
        {
            get { return _batchName; }
            set { _batchName = value; }
        }
    }


    public partial class cmp_fileUpload : BaseUserControl
    {
        /// <summary>
        /// Evento upload e salvataggio su server IIS del file...
        /// </summary>
        public event EventHandler<FileUploadEventArgs> eh_FileUploaded;
        /// <summary>
        /// Solelva evento salvataggio file con messaggio path/nome
        /// </summary>
        /// <param name="localPath"></param>
        /// <param name="fileName"></param>
        public void reportFileUploaded(FileUploadEventArgs e)
        {
            EventHandler<FileUploadEventArgs> handler = eh_FileUploaded;
            if (handler != null)
            {
                handler(this, e);
            }
        }

        /// <summary>
        /// Folder di upload temporaneo files
        /// </summary>
        protected string _tempUploadDir = memLayer.ML.CRS("_tempUploadDir");
        /// <summary>
        /// Folder REMOTA x copia verso SQL
        /// </summary>
        protected string _SqlCopyDir = memLayer.ML.CRS("_SqlCopyDir");
        /// <summary>
        /// Folder x SQL import
        /// </summary>
        protected string _SqlImportDir = memLayer.ML.CRS("_SqlImportDir");


        /// <summary>
        /// permesso scrittura SE E' abilitato a partire dalla tab diritti...
        /// </summary>
        public bool userIsAuth
        {
            get
            {
                return true;
                //return (idxAmm + idxFornitore > 0);
            }
        }
        public bool isWriteEnabled
        {
            get
            {
                bool answ = false;
                bool.TryParse(hfWriteEnabled.Value, out answ);
                return answ;
            }
            set
            {
                hfWriteEnabled.Value = value.ToString();
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                fisVisFU(false);
                deleteOldFiles();
            }
            divNewEdit.Visible = userIsAuth && isWriteEnabled;
        }
        /// <summary>
        ///  Procedee a bonificare la cartella di upload dei files + vecchi di 3 mesi
        /// </summary>
        private void deleteOldFiles()
        {
            string dirPath = Server.MapPath(_tempUploadDir);
            // elenco files nella directory
            string[] files = Directory.GetFiles(dirPath);
            // li guardo tutti e se vecchi li elimino...
            foreach (string file in files)
            {
                FileInfo fi = new FileInfo(file);
                if (fi.LastAccessTime < DateTime.Now.AddMonths(-3))
                    fi.Delete();
            }
        }

        protected void Upload(object sender, EventArgs e)
        {
            string csvFileName = "";
            string uploadedFilename = "";
            string batchName = "";
            string savedFilename = "";
            string contentType = "";
            DateTime adesso = DateTime.Now;
            string dirFrom = Server.MapPath(_tempUploadDir);
            // se c'è un file
            if (FileUpload1.PostedFile != null)
            {
                uploadedFilename = Path.GetFileName(FileUpload1.PostedFile.FileName.Replace(" ", "_"));
                csvFileName = $"{adesso.ToString("dd-HHmmss")}_{uploadedFilename}";
                batchName = uploadedFilename.ToLower().Replace(".csv", "").Replace("cnc", "").Replace("kit", "");
                savedFilename = Server.MapPath($"{_tempUploadDir}{csvFileName}");
                contentType = FileUpload1.PostedFile.ContentType;
                // accedo allo stream del file allegato
                using (Stream fs = FileUpload1.PostedFile.InputStream)
                {
                    // scrivo su file
                    FileStream file = new FileStream(savedFilename, FileMode.Create, FileAccess.Write);
                    fs.CopyTo(file);
                    file.Close();
                }
                // segnaloc he ho CARICATO IN LOCALE il file
                reportFileUploaded(new FileUploadEventArgs(dirFrom, csvFileName, batchName));
            }
            if (forceRedirect)
            {
                Response.Redirect(Request.RawUrl);
            }
        }
        /// <summary>
        /// Indica se fare redirect post upload
        /// </summary>
        public bool forceRedirect
        {
            get
            {
                bool answ = true;
                bool.TryParse(hfForceRedirect.Value, out answ);
                return answ;
            }
            set
            {
                hfForceRedirect.Value = value.ToString();
            }
        }

        protected void btnAdd_Click(object sender, EventArgs e)
        {
            fisVisFU(true);
            lbtUpload.Text = traduci("AddNew");
        }
        /// <summary>
        /// fix visibilità controllo file upload
        /// </summary>
        /// <param name="showAdd">mostra controlli add=true oppure nasconde = false</param>
        private void fisVisFU(bool showAdd)
        {
            divFileUpl.Visible = showAdd;
            btnAdd.Visible = !showAdd;
            lbtCancel.Visible = showAdd;
        }

        protected void btnCancel_Click(object sender, EventArgs e)
        {
            //fisVisFU(false);
            Response.Redirect(Request.RawUrl);
        }

    }
}