internal static void GenerateControlFiles(string destinationFilePath, DateTime startDate, DateTime endDate, byte timeStep, UEBPackageRequest uebPkgRequest)
        {
            TimeSeriesFiles timeSeriesFiles = new TimeSeriesFiles();
            //TODO: check the destinationFilePath exists
            // destinationFilePath value should be  E:\CIWaterData\Temp when testing on localhost
            if (Directory.Exists(destinationFilePath) == false)
            {
                string errMsg = destinationFilePath + " was not found for creating UEB control files.";
                _logger.Error(errMsg);
                throw new Exception(errMsg);
            }
            try
            {
                //create the Overallcontrol.dat file
                CreateOverallControlFile(destinationFilePath, uebPkgRequest);

                //create the param.dat file
                //CreateParameterFile(destinationFilePath);

                //create the siteinital.dat file
                CreateSiteInitialFile(destinationFilePath, uebPkgRequest);

                //create the inputcontrol.dat file
                CreateInputControlFile(destinationFilePath, uebPkgRequest, timeSeriesFiles);

                //create the netCDFFileList.dat file
                //CreateNetCCDFFileListFile(destinationFilePath); // due to format change as suggested by Tseganeh

                // create dat files listing each of the timeseries netcdf files
                CreateNetCDFTimeSeriesListFiles(destinationFilePath, uebPkgRequest, timeSeriesFiles);

                //create the outputcontrol.dat file
                //CreateOutputControlFile(destinationFilePath);

                //create the aggregatedoutputcontrol.dat file
                //CreateAggregatedOutputControlFile(destinationFilePath);
            }
            catch (Exception ex)
            {
                string errMsg = "Failed to create UEB control files.\n";
                errMsg += ex.Message;
                _logger.Fatal(errMsg);
                throw new Exception(errMsg);
            }
        }
        private HttpResponseMessage CreateUEBpackageZipFile(string packageID, DateTime startDate, DateTime endDate, byte timeStep, UEBPackageRequest uebPkgRequest)
        {
            HttpResponseMessage response = new HttpResponseMessage();
            try
            {
                if (Directory.Exists(_sourceFilePath) == false)
                {
                    string errMsg = string.Format("UEB package source file path ({0}) doesn't exist.", _sourceFilePath);
                    logger.Error(errMsg);
                    response.StatusCode = HttpStatusCode.NotFound;
                    response.Content = new StringContent(errMsg);
                    return response;
                }
                else if (Directory.GetFiles(_sourceFilePath).Length == 0)
                {
                    string errMsg = string.Format("There are no files to be zipped in the specified directory ({0}).", _sourceFilePath);
                    logger.Error(errMsg);
                    response.StatusCode = HttpStatusCode.NotFound;
                    response.Content = new StringContent(errMsg);
                    return response;
                }

                if (Directory.Exists(_targetPackageDirPath) == false)
                {
                    Directory.CreateDirectory(_targetPackageDirPath);
                }

                if (Directory.Exists(_targetTempPackageFilePath) == false)
                {
                    Directory.CreateDirectory(_targetTempPackageFilePath);
                }
                else
                {
                    DirectoryInfo dir = new DirectoryInfo(_targetTempPackageFilePath);
                    dir.Delete(true);
                    Directory.CreateDirectory(_targetTempPackageFilePath);

                    // create the model output sub directory if necessary
                    SetModelOutputFolder(uebPkgRequest);
                    if (string.IsNullOrEmpty(uebPkgRequest.OutputFolderName) == false)
                    {
                        string modeOutputSubDir = Path.Combine(_targetTempPackageFilePath, uebPkgRequest.OutputFolderName);
                        Directory.CreateDirectory(modeOutputSubDir);
                    }
                }

                // create the control files (.dat files)
                UEBFileManager.GenerateControlFiles(_sourceFilePath, startDate, endDate, timeStep, uebPkgRequest);

                // copy selected files from the source dir to the temp package dir
                DirectoryInfo sourceFilesDir = new DirectoryInfo(_sourceFilePath);

                string[] files = Directory.GetFiles(_sourceFilePath);
                string fileName = string.Empty;
                string destFile = string.Empty;

                foreach (string file in files)
                {
                    if (Path.GetExtension(file) == ".nc" || Path.GetExtension(file) == ".dat")
                    {
                        // Use static Path methods to extract only the file name from the path.
                        fileName = Path.GetFileName(file);
                        destFile = Path.Combine(_targetTempPackageFilePath, fileName);

                        // Copy the file and overwrite destination file if they already exist.
                        File.Copy(file, destFile, true);

                        // delete the file at the source directory
                        File.Delete(file);
                    }
                }

                //create a zip file of all files that are part of the model package
                string zipUEBPackage = Path.Combine(_targetPackageDirPath, _packageZipFileName);

                if (File.Exists(zipUEBPackage))
                {
                    File.Delete(zipUEBPackage);
                }

                ZipFile.CreateFromDirectory(_targetTempPackageFilePath, zipUEBPackage);

            }
            catch (Exception ex)
            {
                logger.Fatal(ex.Message);
                response.StatusCode = HttpStatusCode.InternalServerError;
                response.Content = new StringContent(ex.Message);
                return response;
            }

            string msg = "UEB package creation was successful for job id:" + packageID;
            logger.Info(msg);
            response.StatusCode = HttpStatusCode.OK;
            response.Content = new StringContent(msg);
            return response;
        }
 private void SetModelOutputFolder(UEBPackageRequest uebPkgRequest)
 {
     // TODO: see PK Weekly progress folder in onenote for date5/23/2013
     // the requirements for retrieving folder (inclding subfolder name) for each of the
     // file specified in the outputcontrol file
     // The following logic at this point gets the folder name from the first file specfied it ouputcontrol file
     // and is also not getting any subfolders
     string outputControlFile = Path.Combine(_clientPackageRequestDirPath, uebPkgRequest.OutputControlFileName);
     string data = string.Empty;
     int fileLineCount = 0;
     char[] splitChar = new char[] { '\\' };
     using (StreamReader sr = new StreamReader(outputControlFile))
     {
         while (sr.EndOfStream == false)
         {
             fileLineCount++;
             data = sr.ReadLine();
             if (fileLineCount == 3)
             {
                 string[] splitStrings = data.Split(splitChar);
                 if (splitStrings.Length > 0)
                 {
                     uebPkgRequest.OutputFolderName = splitStrings[0];
                 }
                 break;
             }
         }
     }
 }
        private string ValidateUEBPackageRequest(UEBPackageRequest uebPkgRequest)
        {
            bool isInputError = false;

            // validate simulation start and end dates
            StringBuilder errMsg = new StringBuilder("Invalid UEB Build Request:");
            errMsg.AppendLine();

            if (uebPkgRequest.StartDate > uebPkgRequest.EndDate)
            {
                errMsg.AppendLine("Simulation end date needs to be a date after start date.");
                isInputError = true;
            }

            List<byte> validTimeStepValues = new List<byte> { 1, 2, 3, 4, 6 };
            // validate timeStep
            if (validTimeStepValues.Contains(uebPkgRequest.TimeStep) == false)
            {
                errMsg.AppendLine("Time step needs to be one of the following values:");
                errMsg.AppendLine("1, 2, 3, 4, 6");
                isInputError = true;
            }

            // validate grid cell size
            if (uebPkgRequest.GridCellSize < 100)
            {
                errMsg.AppendLine("Grid cell size must be at least 100 meters.");
                isInputError = true;
            }

            // validate watershed buffer size
            if (uebPkgRequest.BufferSize < 100)
            {
                errMsg.AppendLine("Watershed buffer size must be at least 100 meters.");
                isInputError = true;
            }

            // check the domain file exists
            if(string.IsNullOrEmpty(uebPkgRequest.DomainFileName))
            {
                errMsg.AppendLine("Domain file is missing in the request.");
                isInputError = true;
            }
            else
            {
                string domainFile = Path.Combine(_clientPackageRequestDirPath, uebPkgRequest.DomainFileName);
                if (File.Exists(domainFile) == false)
                {
                    errMsg.AppendLine("Domain file is missing in the request.");
                    isInputError = true;
                }
            }

            // check the parameters file exists
            if (string.IsNullOrEmpty(uebPkgRequest.ModelParametersFileName))
            {
                errMsg.AppendLine("Model parameters file is missing in the request.");
                isInputError = true;
            }
            else
            {
                string paramFile = Path.Combine(_clientPackageRequestDirPath, uebPkgRequest.ModelParametersFileName);
                if (File.Exists(paramFile) == false)
                {
                    errMsg.AppendLine("Model parameters file is missing in the request.");
                    isInputError = true;
                }
            }

            // check the output control file exists
            if (string.IsNullOrEmpty(uebPkgRequest.OutputControlFileName))
            {
                errMsg.AppendLine("Output control file is missing in the request.");
                isInputError = true;
            }
            else
            {
                string outputControlFile = Path.Combine(_clientPackageRequestDirPath, uebPkgRequest.OutputControlFileName);
                if (File.Exists(outputControlFile) == false)
                {
                    errMsg.AppendLine("Output control file is missing in the request.");
                    isInputError = true;
                }
            }

            // check the aggregated output control file exists
            if (string.IsNullOrEmpty(uebPkgRequest.AggregatedOutputControlFileName))
            {
                errMsg.AppendLine("Aggregated output control file is missing in the request.");
                isInputError = true;
            }
            else
            {
                string aggOutputControlFile = Path.Combine(_clientPackageRequestDirPath, uebPkgRequest.AggregatedOutputControlFileName);
                if (File.Exists(aggOutputControlFile) == false)
                {
                    errMsg.AppendLine("Aggregated output control file is missing in the request.");
                    isInputError = true;
                }
            }

            if (isInputError)
            {
                return errMsg.ToString();
            }
            else
            {
                return string.Empty;
            }
        }
        //string destFiePath, DateTime startDate, DateTime endDate, byte timeStep, UEBPackageRequest uebPkgRequest
        private static void CreateInputControlFile(string destFiePath, UEBPackageRequest uebPkgRequest, TimeSeriesFiles timeSeriesFiles)
        {
            // TODO: remove magic strings used in this method
            //create the inputcontrol.dat file
            string fileName = "inputcontrol.dat";
            string fileToWriteTo = Path.Combine(destFiePath, fileName);
            DateTime startDate = uebPkgRequest.StartDate;
            DateTime endDate = uebPkgRequest.EndDate;
            byte timeStep = uebPkgRequest.TimeStep;

            using (StreamWriter sw = new StreamWriter(fileToWriteTo))
            {
                sw.WriteLine("Input Control file");
                string dateFormat = "yyyy MM dd hh.mm";
                sw.WriteLine(startDate.ToString(dateFormat)); // yyyy mm dd hh.mm (starting Date)
                sw.WriteLine(endDate.ToString(dateFormat)); // yyyy mm dd hh.mm (ending Date)
                sw.WriteLine(timeStep); // time step

                //TODO: Check how can we avoid hard coding this UTC time offset value
                sw.WriteLine("6.00"); // UTC time offset

                sw.WriteLine("Ta: Air temperature  (always required)");
                if (uebPkgRequest.TimeSeriesInputs.is_ta_compute)
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine("Talist.dat;X:x;Y:y;time:time;D:T;range:-20,40"); // this is the new format suggested by Tseganeh
                    timeSeriesFiles.TaFileName = "Talist.dat";
                }
                else if(uebPkgRequest.TimeSeriesInputs.is_ta_constant)
                {
                    sw.WriteLine("2"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.TimeSeriesInputs.ta_constant_value); // value of ta variable
                }
                else if (uebPkgRequest.TimeSeriesInputs.ta_grid_file_name.EndsWith(".nc"))
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine("Talist.dat;" + uebPkgRequest.TimeSeriesInputs.ta_grid_file_format + ";range:-20,40");
                    timeSeriesFiles.TaFileName = "Talist.dat";
                }
                else if(string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.ta_text_file_name) == false)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.Write(uebPkgRequest.TimeSeriesInputs.ta_text_file_name);
                }

                sw.WriteLine("Prec: Precipitation  (always required)");
                if (uebPkgRequest.TimeSeriesInputs.is_prec_compute)
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine("Preclist.dat;X:x;Y:y;time:time;D:Prec"); // this is the new format suggested by Tseganeh
                    timeSeriesFiles.PrecFileName = "Preclist.dat";
                }
                else if (uebPkgRequest.TimeSeriesInputs.is_prec_constant)
                {
                    sw.WriteLine("2"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.TimeSeriesInputs.prec_constant_value); // value of prec variable
                }
                else if (uebPkgRequest.TimeSeriesInputs.prec_grid_file_name.EndsWith(".nc"))
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine("Preclist.dat;" + uebPkgRequest.TimeSeriesInputs.prec_grid_file_format);
                    timeSeriesFiles.PrecFileName = "Preclist.dat";
                }
                else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.prec_text_file_name) == false)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.TimeSeriesInputs.prec_text_file_name);
                }

                sw.WriteLine("v: Wind speed (always required)");
                if (uebPkgRequest.TimeSeriesInputs.is_v_compute)
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine("Vlist.dat;X:x;Y:y;time:time;D:V"); // this is the new format suggested by Tseganeh
                    timeSeriesFiles.VFileName = "Vlist.dat";
                }
                else if (uebPkgRequest.TimeSeriesInputs.is_v_constant)
                {
                    sw.WriteLine("2"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.TimeSeriesInputs.v_constant_value); // value of v variable
                }
                else if (uebPkgRequest.TimeSeriesInputs.v_grid_file_name.EndsWith(".nc"))
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine("Vlist.dat;" + uebPkgRequest.TimeSeriesInputs.v_grid_file_format);
                    timeSeriesFiles.VFileName = "Vlist.dat";
                }
                else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.v_text_file_name) == false)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.TimeSeriesInputs.v_text_file_name);
                }

                sw.WriteLine("RH: Relative humidity (always required)");
                if (uebPkgRequest.TimeSeriesInputs.is_rh_compute)
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine("RHlist.dat;X:x;Y:y;time:time;D:rh"); // this is the new format suggested by Tseganeh
                    timeSeriesFiles.RhFileName = "RHlist.dat";
                }
                else if (uebPkgRequest.TimeSeriesInputs.is_rh_constant)
                {
                    sw.WriteLine("2"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.TimeSeriesInputs.rh_constant_value); // value of rh variable
                }
                else if (uebPkgRequest.TimeSeriesInputs.rh_grid_file_name.EndsWith(".nc"))
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine("RHlist.dat;" + uebPkgRequest.TimeSeriesInputs.rh_grid_file_format); // this is the new format suggested by Tseganeh
                    timeSeriesFiles.RhFileName = "RHlist.dat";
                }
                else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.rh_text_file_name) == false)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.TimeSeriesInputs.rh_text_file_name);
                }

                if (uebPkgRequest.TimeSeriesInputs.is_snowalb_compute == false)
                {
                    if (uebPkgRequest.TimeSeriesInputs.is_snowalb_constant)
                    {
                        sw.WriteLine("Snowalb: Snow albedo (0-1).  (only required if ireadalb=1) The albedo of the snow surface to be used when the internal albedo calculations are to be overridden");
                        sw.WriteLine("2"); // variable flag value for SCTC type variable
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.snowalb_constant_value);
                    }
                    else if (uebPkgRequest.TimeSeriesInputs.snowalb_grid_file_name.EndsWith(".nc"))
                    {
                        sw.WriteLine("1"); // variable flag value for SCTC type variable
                        sw.WriteLine("Snowalblist.dat;" + uebPkgRequest.TimeSeriesInputs.snowalb_grid_file_format); // this is the new format suggested by Tseganeh
                        timeSeriesFiles.SnowalbFileName = "Snowalblist.dat";
                    }
                    else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.snowalb_text_file_name) == false)
                    {
                        sw.WriteLine("0"); // variable flag value for SCTC type variable
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.snowalb_text_file_name);
                    }
                }

                if (uebPkgRequest.TimeSeriesInputs.is_qg_constant)
                {
                    sw.WriteLine("Qg: : Ground heat flux   (kJ/m2/hr)");
                    sw.WriteLine("2"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.TimeSeriesInputs.qg_constant_value);
                }
                else if (uebPkgRequest.TimeSeriesInputs.qg_grid_file_name.EndsWith(".nc"))
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine("Qglist.dat;" + uebPkgRequest.TimeSeriesInputs.snowalb_grid_file_format); // this is the new format suggested by Tseganeh
                    timeSeriesFiles.QgFileName = "Qglist.dat";
                }
                else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.qg_text_file_name) == false)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.TimeSeriesInputs.qg_text_file_name);
                }

            }

            _logger.Info(fileName + " file was created.");
        }
        private static void CreateSiteInitialFile(string destFiePath, UEBPackageRequest uebPkgRequest)
        {
            // TODO: remove magic strings used in this method

            //first read the atmos pressure value from the text file
            string fileName = UEB.UEBSettings.WATERSHED_ATMOSPHERIC_PRESSURE_FILE_NAME; // "ws_atom_pres.txt";
            float atomPresValue;
            string fileToReadFrom =Path.Combine(destFiePath, fileName);
            using (StreamReader sr = new StreamReader(fileToReadFrom))
            {
                //read the one line of text in this file
                string data = sr.ReadLine();
                bool success = float.TryParse(data, out atomPresValue);

                if (success == false)
                {
                    atomPresValue = 74051; // default value
                }
            }

            fileName = "siteinitial.dat";
            string fileToWriteTo = Path.Combine(destFiePath, fileName);
            using (StreamWriter sw = new StreamWriter(fileToWriteTo))
            {
                sw.WriteLine("Site and Initial Condition Input Variables");

                sw.WriteLine("USic: Energy content initial condition (kg m-3)");
                if (uebPkgRequest.SiteInitialConditions.is_usic_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.usic_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.usic_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.usic_grid_file_format);
                }

                sw.WriteLine("WSis: Snow water equivalent initial condition (m)");
                if (uebPkgRequest.SiteInitialConditions.is_wsis_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.wsis_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.wsis_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.wsis_grid_file_format);
                }

                sw.WriteLine("Tic: Surface dimensionless age initial condition");
                if (uebPkgRequest.SiteInitialConditions.is_tic_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.tic_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.tic_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.tic_grid_file_format);
                }

                sw.WriteLine("WCic: Snow water equivalent dimensionless age initial condition (m) ");
                if (uebPkgRequest.SiteInitialConditions.is_wcic_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.wcic_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.wcic_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.wcic_grid_file_format);
                }

                sw.WriteLine("df: Drift factor multiplier");
                if (uebPkgRequest.SiteInitialConditions.is_df_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.df_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.df_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.df_grid_file_format);
                }

                sw.WriteLine("apr: Average atmospheric pressure");
                if (uebPkgRequest.SiteInitialConditions.is_apr_derive_from_elevation)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(atomPresValue);
                }
                else if(uebPkgRequest.SiteInitialConditions.is_apr_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.apr_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.apr_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.apr_grid_file_format);
                }

                sw.WriteLine("Aep: Albedo extinction coefficient");
                if (uebPkgRequest.SiteInitialConditions.is_aep_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.aep_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.aep_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.aep_grid_file_format);
                }

                sw.WriteLine("cc: Canopy coverage fraction");
                if (uebPkgRequest.SiteInitialConditions.is_cc_derive_from_NLCD)
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(UEB.UEBSettings.WATERSHED_NLCD_CC_NETCDF_FILE_NAME + ";X:x;Y:y;D:cc"); //netcdf file taht contains data for cc
                }
                else if (uebPkgRequest.SiteInitialConditions.is_cc_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.cc_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.cc_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.cc_grid_file_format);
                }

                sw.WriteLine("hcan: Canopy height");
                if (uebPkgRequest.SiteInitialConditions.is_hcan_derive_from_NLCD)
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(UEB.UEBSettings.WATERSHED_NLCD_HC_NETCDF_FILE_NAME + ";X:x;Y:y;D:hcan"); //netcdf file that contains data for hcan
                }
                else if (uebPkgRequest.SiteInitialConditions.is_hcan_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.hcan_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.hcan_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.hcan_grid_file_format);
                }

                sw.WriteLine("lai: Leaf area index");
                if (uebPkgRequest.SiteInitialConditions.is_lai_derive_from_NLCD)
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(UEB.UEBSettings.WATERSHED_NLCD_LAI_NETCDF_FILE_NAME + ";X:x;Y:y;D:lai"); //netcdf file that contains data for lai
                }
                else if (uebPkgRequest.SiteInitialConditions.is_lai_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.lai_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.lai_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.lai_grid_file_format);
                }

                sw.WriteLine("ycage: Forest age flag for wind speed profile parameterization");
                if (uebPkgRequest.SiteInitialConditions.is_ycage_derive_from_NLCD)
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(UEB.UEBSettings.WATERSHED_NLCD_YCAGE_NETCDF_FILE_NAME + ";X:x;Y:y;D:ycage"); //netcdf file that contains data for ycage
                }
                else if (uebPkgRequest.SiteInitialConditions.is_ycage_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.ycage_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.ycage_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.ycage_grid_file_format);
                }

                sw.WriteLine("Sbar: Maximum snow load held per unit branch area");
                if (uebPkgRequest.SiteInitialConditions.is_sbar_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.sbar_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.sbar_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.sbar_grid_file_format);
                }

                sw.WriteLine("slope: A 2-D grid that contains the slope at each grid point");
                if (uebPkgRequest.SiteInitialConditions.is_slope_derive_from_elevation)
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(UEB.UEBSettings.WATERSHED_SLOPE_NETCDF_FILE_NAME + ";X:x;Y:y;D:slope"); //netcdf file that contains data for slope
                }
                else if (uebPkgRequest.SiteInitialConditions.is_slope_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.slope_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.slope_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.slope_grid_file_format);
                }

                sw.WriteLine("aspect: A 2-D grid that contains the aspect at each grid point");
                if (uebPkgRequest.SiteInitialConditions.is_aspect_derive_from_elevation)
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(UEB.UEBSettings.WATERSHED_ASPECT_NETCDF_FILE_NAME + ";X:x;Y:y;D:aspect"); //netcdf file that contains data for aspect
                }
                else if (uebPkgRequest.SiteInitialConditions.is_aspect_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.aspect_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.aspect_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.aspect_grid_file_format);
                }

                if (uebPkgRequest.SiteInitialConditions.is_latitude_derive_from_projection)
                {
                    // There may not be lat gridded file in which case there
                    // would be ws-lat.txt file that contains a single value for the whole ws grid
                    // so we need to process that and write to the file in three line format with
                    // variable type = 0
                    fileName = UEB.UEBSettings.WATERSHED_LATITUDE_FILE_NAME_WITHOUT_EXTENSION + ".nc";
                    string fileToCheck = destFiePath + @"\" + fileName;
                    if (File.Exists(fileToCheck))
                    {
                        sw.WriteLine("latitude: A 2-D grid that contains the latitude at each grid point");
                        sw.WriteLine("1"); // variable flag value for SVTC type variable
                        sw.WriteLine(fileName + ";X:x;Y:y;D:latitude"); //netcdf file that contains data for latitude
                    }
                    else
                    {
                        fileName = "lat.txt";
                        fileToReadFrom = destFiePath + @"\" + fileName;
                        string data = GetSingleDataValueInFile(fileToReadFrom);
                        float latitude;
                        bool success = float.TryParse(data, out latitude);
                        if (!success)
                        {
                            string errMsg = "No valid latitude data for the watershed was found: " + data;
                            _logger.Fatal("errMsg");
                            throw new Exception(errMsg);
                        }
                        else
                        {
                            sw.WriteLine("latitude: Latidue of the watershed at grid mid point");
                            sw.WriteLine("0"); // variable flag value for SCTC type variable
                            sw.WriteLine(latitude); // value of latitude variable
                        }
                    }
                }
                else if (uebPkgRequest.SiteInitialConditions.is_latitude_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.latitude_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.latitude_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.latitude_grid_file_format);
                }

                sw.WriteLine("subalb: Albedo (fraction 0-1) of the substrate beneath the snow (ground, or glacier)");
                if (uebPkgRequest.SiteInitialConditions.is_subalb_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.subalb_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.subalb_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.subalb_grid_file_format);
                }

                sw.WriteLine("subtype: Type of beneath snow substrate encoded as (0 = Ground/Non Glacier, 1=Clean Ice/glacier, 2= Debris covered ice/glacier, 3= Glacier snow accumulation zone)");
                if (uebPkgRequest.SiteInitialConditions.is_subtype_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    //sw.WriteLine("0"); //default value, later need to get this value form a user uploaded siteinitial input file
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.subtype_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.subtype_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.subtype_grid_file_format);
                }

                sw.WriteLine("gsurf: The fraction of surface melt that runs off (e.g. from a glacier)");
                if (uebPkgRequest.SiteInitialConditions.is_gsurf_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.gsurf_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.gsurf_grid_file_name + ";" + uebPkgRequest.SiteInitialConditions.gsurf_grid_file_format);
                }

                sw.WriteLine("b01: Bristow-Campbell B for January (1)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b01);

                sw.WriteLine("b02: Bristow-Campbell B for Feb (2)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b02);

                sw.WriteLine("b03: Bristow-Campbell B for Mar (3)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b03);

                sw.WriteLine("b04: Bristow-Campbell B for Apr (4)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b04);

                sw.WriteLine("b05: Bristow-Campbell B for May (5)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b05);

                sw.WriteLine("b06: Bristow-Campbell B for June (6)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b06);

                sw.WriteLine("b07: Bristow-Campbell B for July (7)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b07);

                sw.WriteLine("b08: Bristow-Campbell B for Aug (8)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b08);

                sw.WriteLine("b09: Bristow-Campbell B for Sep (9)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b09);

                sw.WriteLine("b10: Bristow-Campbell B for Oct (10)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b10);

                sw.WriteLine("b11: Bristow-Campbell B for Nov (11)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b11);

                sw.WriteLine("b12: Bristow-Campbell B for Dec (12)");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.BristowCambellBValues.b12);

                sw.WriteLine("ts_last: degree celcius");
                sw.WriteLine("0"); // variable flag value for SCTC type variable
                sw.WriteLine(uebPkgRequest.SiteInitialConditions.ts_last_constant_value);

                if (uebPkgRequest.SiteInitialConditions.is_longitude_derive_from_projection)
                {
                    // there may not be lon gridded file in which case there
                    // would be ws-lon.txt file that contains a single value for the whole ws grid
                    // so we need to process that and write to the file in three line format with
                    // variable type = 0
                    fileName = UEB.UEBSettings.WATERSHED_LONGITIDUE_FILE_NAME_WITHOUT_EXTENSION + ".nc";
                    string fileToCheck = Path.Combine(destFiePath, fileName);
                    if (File.Exists(fileToCheck))
                    {
                        sw.WriteLine("longitude: A 2-D grid that contains the longitude at each grid point");
                        sw.WriteLine("1"); // variable flag value for SVTC type variable
                        sw.WriteLine(fileName + ";X:x;Y:y;D:longitude"); //netcdf file that contains data for lon
                    }
                    else
                    {
                        fileName = "lon.txt";
                        fileToReadFrom = Path.Combine(destFiePath, fileName);
                        string data = GetSingleDataValueInFile(fileToReadFrom);
                        float longitidue;
                        bool success = float.TryParse(data, out longitidue);
                        if (!success)
                        {
                            string errMsg = "No valid longitidue data for the watershed was found: " + data;
                            _logger.Fatal("errMsg");
                            throw new Exception(errMsg);
                        }
                        else
                        {
                            sw.WriteLine("longitidue: Longitidue of the watershed at grid mid point");
                            sw.WriteLine("0"); // variable flag value for SCTC type variable
                            sw.WriteLine(longitidue); // value of latitude variable
                        }
                    }
                }
                else if (uebPkgRequest.SiteInitialConditions.is_longitude_constant)
                {
                    sw.WriteLine("0"); // variable flag value for SCTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.longitude_constant_value);
                }
                else
                {
                    sw.WriteLine("1"); // variable flag value for SVTC type variable
                    sw.WriteLine(uebPkgRequest.SiteInitialConditions.longitude_grid_file_name + uebPkgRequest.SiteInitialConditions.longitude_grid_file_format);
                }
            }
            _logger.Info(fileName + " file was created.");
        }
        private static void CreateOverallControlFile(string destFiePath, UEBPackageRequest uebPkgrequest)
        {
            // TODO: remove magic strings used in thei method
            string fileName = "Overallcontrol.dat";
            string fileToWriteTo = Path.Combine(destFiePath, fileName);
            using (StreamWriter sw = new StreamWriter(fileToWriteTo))
            {
                sw.WriteLine("UEBGrid Model Driver");
                sw.WriteLine(uebPkgrequest.ModelParametersFileName);
                sw.WriteLine("siteinitial.dat");
                sw.WriteLine("inputcontrol.dat");
                sw.WriteLine(uebPkgrequest.OutputControlFileName);
                if (uebPkgrequest.DomainFileName.EndsWith(".nc"))
                {
                    sw.WriteLine(uebPkgrequest.DomainFileName + ";" + uebPkgrequest.DomainGridFileFormat);
                }
                else
                {
                    sw.WriteLine(UEB.UEBSettings.WATERSHED_NETCDF_FILE_NAME + ";X:x;Y:y;D:watershed"); // this file is part of the UEB pacakge creation
                }

                sw.WriteLine(uebPkgrequest.AggregatedOutputControlFileName);
                sw.WriteLine(UEB.UEBSettings.MODEL_OUTPUT_FOLDER_NAME + @"\AggregatedOutput.dat"); // this is where the UEB output will be written. no need for us to generate this file
            }

            _logger.Info(fileName + " file was created.");
        }
        private static void CreateNetCDFTimeSeriesListFiles(string destFiePath, UEBPackageRequest uebPkgRequest, TimeSeriesFiles timeSeriesFiles)
        {
            string fileToWriteTo = string.Empty;

            if (string.IsNullOrEmpty(timeSeriesFiles.TaFileName) == false)
            {
                fileToWriteTo = Path.Combine(destFiePath, timeSeriesFiles.TaFileName);
                using (StreamWriter sw = new StreamWriter(fileToWriteTo))
                {
                    if (uebPkgRequest.TimeSeriesInputs.is_ta_compute)
                    {
                        sw.WriteLine(UEB.UEBSettings.WATERSHED_MULTIPLE_TEMP_NETCDF_FILE_NAME);
                    }
                    else if (uebPkgRequest.TimeSeriesInputs.ta_grid_file_name.EndsWith(".nc"))
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.ta_grid_file_name);
                    }
                    else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.ta_text_file_name) == false)
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.ta_text_file_name);
                    }
                }

                _logger.Info(timeSeriesFiles.TaFileName + " file was created.");
            }

            if (string.IsNullOrEmpty(timeSeriesFiles.PrecFileName) == false)
            {
                fileToWriteTo = Path.Combine(destFiePath, timeSeriesFiles.PrecFileName);
                using (StreamWriter sw = new StreamWriter(fileToWriteTo))
                {
                    if (uebPkgRequest.TimeSeriesInputs.is_prec_compute)
                    {
                        sw.WriteLine(UEB.UEBSettings.WATERSHED_MULTIPLE_PRECP_NETCDF_FILE_NAME);
                    }
                    else if (uebPkgRequest.TimeSeriesInputs.prec_grid_file_name.EndsWith(".nc"))
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.prec_grid_file_name);
                    }
                    else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.prec_text_file_name) == false)
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.prec_text_file_name);
                    }
                }

                _logger.Info(timeSeriesFiles.PrecFileName + " file was created.");
            }

            if (string.IsNullOrEmpty(timeSeriesFiles.VFileName) == false)
            {
                fileToWriteTo = Path.Combine(destFiePath, timeSeriesFiles.VFileName);
                using (StreamWriter sw = new StreamWriter(fileToWriteTo))
                {
                    if (uebPkgRequest.TimeSeriesInputs.is_v_compute)
                    {
                        sw.WriteLine(UEB.UEBSettings.WATERSHED_MULTIPLE_WIND_NETCDF_FILE_NAME);
                    }
                    else if (uebPkgRequest.TimeSeriesInputs.v_grid_file_name.EndsWith(".nc"))
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.v_grid_file_name);
                    }
                    else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.v_text_file_name) == false)
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.v_text_file_name);
                    }
                }

                _logger.Info(timeSeriesFiles.VFileName + " file was created.");
            }

            if (string.IsNullOrEmpty(timeSeriesFiles.RhFileName) == false)
            {
                fileToWriteTo = Path.Combine(destFiePath, timeSeriesFiles.RhFileName);
                using (StreamWriter sw = new StreamWriter(fileToWriteTo))
                {
                    if (uebPkgRequest.TimeSeriesInputs.is_rh_compute)
                    {
                        sw.WriteLine(UEB.UEBSettings.WATERSHED_MULTIPLE_RH_NETCDF_FILE_NAME);
                    }
                    else if (uebPkgRequest.TimeSeriesInputs.rh_grid_file_name.EndsWith(".nc"))
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.rh_grid_file_name);
                    }
                    else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.rh_text_file_name) == false)
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.rh_text_file_name);
                    }
                }

                _logger.Info(timeSeriesFiles.RhFileName + " file was created.");
            }

            if (string.IsNullOrEmpty(timeSeriesFiles.SnowalbFileName) == false)
            {
                fileToWriteTo = Path.Combine(destFiePath, timeSeriesFiles.SnowalbFileName);
                using (StreamWriter sw = new StreamWriter(fileToWriteTo))
                {
                    if (uebPkgRequest.TimeSeriesInputs.snowalb_grid_file_name.EndsWith(".nc"))
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.snowalb_grid_file_name);
                    }
                    else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.snowalb_text_file_name) == false)
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.snowalb_text_file_name);
                    }
                }

                _logger.Info(timeSeriesFiles.SnowalbFileName + " file was created.");
            }

            if (string.IsNullOrEmpty(timeSeriesFiles.QgFileName) == false)
            {
                fileToWriteTo = Path.Combine(destFiePath, timeSeriesFiles.QgFileName);
                using (StreamWriter sw = new StreamWriter(fileToWriteTo))
                {
                    if (uebPkgRequest.TimeSeriesInputs.qg_grid_file_name.EndsWith(".nc"))
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.qg_grid_file_name);
                    }
                    else if (string.IsNullOrEmpty(uebPkgRequest.TimeSeriesInputs.qg_text_file_name) == false)
                    {
                        sw.WriteLine(uebPkgRequest.TimeSeriesInputs.qg_text_file_name);
                    }
                }

                _logger.Info(timeSeriesFiles.QgFileName + " file was created.");
            }
        }