#ifndef COMPILER_H
#define COMPILER_H

#include "probe.h"
#include "typecheck.h"

typedef struct {
  char** argv;
  size_t argc;
  const char* subtitle_output;
  bool clip_subtitles;
  double clip_duration;
  const char* concat_list;
  const char* concat_left;
  const char* concat_right;
} StagedCommand;

typedef struct {
  Arena arena;
  char** argv;
  size_t argc;
  StagedCommand* stages;
  size_t stage_count;
  size_t stage_capacity;
  const char** temporary_paths;
  size_t temporary_count;
  size_t temporary_capacity;
  const char** temporary_directories;
  size_t temporary_directory_count;
  size_t temporary_directory_capacity;
  const char* executable_path;
  const char* filter_complex;
  const char* shell_command;
} CompiledCommand;

bool compile_program(const Program* program, const TypedProgram* typed, ProbeCache* probes,
                     const char* output_path, CompiledCommand* out, Error* error);
bool compile_program_with_ffmpeg_args(const Program* program, const TypedProgram* typed,
                                      ProbeCache* probes, const char* output_path,
                                      size_t ffmpeg_argument_count,
                                      const char* const* ffmpeg_arguments,
                                      CompiledCommand* out, Error* error);
void compiled_command_destroy(CompiledCommand* command);
bool execute_command(const CompiledCommand* command, int* exit_code, Error* error);
bool subtitle_clip_file(const char* path, double duration, Error* error);
bool subtitle_write_concat_list(const char* path, const char* left, const char* right, Error* error);
bool write_generated_file(const char* path, const char* contents, Error* error);
bool copy_generated_file(const char* source, const char* destination, Error* error);
bool ensure_generated_directory(const char* path, Error* error);

#endif