/*---------------------------------------------------------------------------*\
  ==  == ====== ====   ====    |
                    \\     ||  | Multiphase Code Repository by HZDR
  ======   //   ||  || ===//   | Website: https://doi.org/10.14278/rodare.767
  ||  ||  //    ||  // || \\   | License: GPL-3.0-or-later
  ==  == ====== ====   ==  ==  |
-------------------------------------------------------------------------------
License
    This file is part of the Multiphase Code Repository by HZDR.

    Copyright (C) 2025 by Helmholtz-Zentrum Dresden-Rossendorf e.V. (HZDR),
    Website: https://hzdr.de

    Multiphase Code Repository by HZDR is based on the free software for
    computational fluid dynamics (CFD) from the OpenFOAM Foundation.
    Copyright (C) 2025 by OpenFOAM Foundation, Website: https://openfoam.org

    If you are interested in which files are original OpenFOAM Foundation
    files, which OpenFOAM Foundation files were modified, and which files were
    newly created, see FILES.md.

    Multiphase Code Repository by HZDR is free software: you can redistribute
    it and/or modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    Multiphase Code Repository by HZDR is distributed in the hope that it will
    be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
    Public License for more details.

    You should have received a copy of the GNU General Public License along
    with the Multiphase Code Repository by HZDR. If not, see
    <http://www.gnu.org/licenses/>.

Class
    Foam::functionObjects::writeAtFile

Description
    Writes current results when the specified file is created in the case
    directory.

    The default name of the trigger file is \c $FOAM_CASE/<name> where \c
    <name> is the name of the functionObject entry.

    Examples of function object specification:
    \verbatim
    write
    {
        type            writeAtFile;

        libs            ("libaddonUtilityFunctionObjects.so");
        file            "$FOAM_CASE/write";
    }
    \endverbatim
    will write after the file "write" is created in the case directory.

Usage
    \table
        Property | Description            | Required | Default value
        type     | type name: writeAtFile | yes      |
        file     | Trigger file path name | no       | $FOAM_CASE/<name>
    \endtable

SourceFiles
    writeAtFile.C

\*---------------------------------------------------------------------------*/

#ifndef functionObjects_writeAtFile_H
#define functionObjects_writeAtFile_H

#include "functionObject.H"
#include "NamedEnum.H"

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

namespace Foam
{
namespace functionObjects
{

/*---------------------------------------------------------------------------*\
                         Class writeAtFile Declaration
\*---------------------------------------------------------------------------*/

class writeAtFile
:
    public functionObject
{
    // Private Data

        //- The fully-qualified name of the writeAtFile file
        fileName writeAtFileFile_;


    // Private Member Functions

        //- Remove writeAtFile file.
        void removeFile() const;

        //- Return true when the stop condition is achieved
        virtual bool condition() const;
public:

    //- Runtime type information
    TypeName("writeAtFile");


    // Constructors

        //- Construct from Time and dictionary
        writeAtFile
        (
            const word& name,
            const Time& runTime,
            const dictionary&
        );

        //- Disallow default bitwise copy construction
        writeAtFile(const writeAtFile&) = delete;


    //- Destructor
    virtual ~writeAtFile();


    // Member Functions

        //- Read the dictionary settings
        virtual bool read(const dictionary&);

        //- Return the list of fields required
        virtual wordList fields() const
        {
            return wordList::null();
        }

        //- Execute, check existence of writeAt file and take action
        virtual bool execute();

        //- Execute, check existence of writeAt file and take action
        virtual bool write();

        //- Execute at the final time-loop, used for cleanup
        virtual bool end();


    // Member Operators

        //- Disallow default bitwise assignment
        void operator=(const writeAtFile&) = delete;
};


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

} // End namespace functionObjects
} // End namespace Foam

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

#endif

// ************************************************************************* //
