<?php

namespace Dpp;

/**
 * Represents a header/cpp generator used to auto-generate cpp/.h files.
 */
interface StructGeneratorInterface
{
    /**
     * Generate the start of the header file
     *
     * @return string header content
     */
    public function generateHeaderStart(): string;

    /**
     * Generate the start of the cpp file
     *
     * @return string cpp content
     */
    public function generateCppStart(): string;

    /**
     * Check if the script should run and re-generate content or not
     *
     * @return string true if the script should run, false to exit
     */
    public function checkForchanges(): bool;

    /**
     * Generate header definition for a function
     *
     * @param string $returnType Return type of function
     * @param string $currentFunction Current function name
     * @param string $parameters Current function parameters with default values
     * @param string $noDefaults Current function parameters without default values
     * @param string $parameterNames Parameter names only
     * @return string header content to append
     */
    public function generateHeaderDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterNames): string;

    /**
     * Generate cpp definition for a function
     *
     * @param string $returnType Return type of function
     * @param string $currentFunction Current function name
     * @param string $parameters Current function parameters with default values
     * @param string $noDefaults Current function parameters without default values
     * @param string $parameterNames Parameter names only
     * @return string cpp content to append
     */
    public function generateCppDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterNames): string;
    
    /**
     * Return comment lines to add to each header definition
     *
     * @return array Comment lines to add
     */
    public function getCommentArray(): array;

    /**
     * Save the .h file
     *
     * @param string $content Content to save
     */
    public function saveHeader(string $content): void;

    /**
     * Save the .cpp file
     *
     * @param string $cppcontent Content to save
     */
    public function saveCpp(string $cppcontent): void;
};