/// <summary>
        /// Initializes a new instance of the class.
        /// </summary>
        public EventWorkbookBuilder(ConfigDatabase configDatabase, ScadaClient scadaClient, string templateDir)
        {
            this.configDatabase        = configDatabase ?? throw new ArgumentNullException(nameof(configDatabase));
            this.scadaClient           = scadaClient ?? throw new ArgumentNullException(nameof(scadaClient));
            templateFilePath           = Path.Combine(templateDir, TemplateFileName);
            renderer                   = new WorkbookRenderer();
            renderer.BeforeProcessing += Renderer_BeforeProcessing;
            renderer.AfterProcessing  += Renderer_AfterProcessing;
            renderer.DirectiveFound   += Renderer_DirectiveFound;
            dict = Locale.GetDictionary("Scada.Web.Plugins.PlgMain.Code.EventWorkbookBuilder");

            workbookArgs     = null;
            archiveEntity    = null;
            eventRowTemplate = null;
            currentEventF    = null;

            GenerateTime = DateTime.MinValue;
        }
        /// <summary>
        /// Generates a workbook to the output stream.
        /// </summary>
        public void Generate(EventWorkbookArgs args, Stream outStream)
        {
            workbookArgs = args ?? throw new ArgumentNullException(nameof(args));
            workbookArgs.Validate();
            ArgumentNullException.ThrowIfNull(outStream, nameof(outStream));

            string archiveCode = string.IsNullOrEmpty(args.ArchiveCode) ? DefaultEventArchiveCode : args.ArchiveCode;

            archiveEntity = configDatabase.ArchiveTable.SelectFirst(new TableFilter("Code", archiveCode));

            if (archiveEntity == null)
            {
                throw new ScadaException(Locale.IsRussian ?
                                         "Архив не найдён в базе конфигурации." :
                                         "Archive not found in the configuration database.");
            }

            renderer.Render(templateFilePath, outStream);
        }