#!/bin/sh


prefix=gst
templatedir=element-templates

while [ "$1" ] ; do
  case $1 in
    --help)
      cat <<-EOF
Usage: $(basename "$0") [OPTIONS] PROJECT_NAME
Create an autotools project based on GStreamer from a template.
Options:
  --help             Print this information
  --prefix PREFIX    Use PREFIX instead of "gst"
Example: '$(basename "$0") my_project' will create the project gst-my-project.
EOF
      exit 0
      ;;
    --prefix)
      shift
      prefix=$1
      ;;
    -*)
      echo Unknown option: $1
      exit 1
      ;;
    *)
      if [ "$name" = "" ]; then
        name=$1
      else
        echo Ignored: $1
      fi
  esac
  shift
done

if [ "$name" = "" ] ; then
  echo "Usage: $(basename "$0") [OPTIONS] PROJECT_NAME"
  exit 1
fi


PREFIX=$(echo $prefix | sed -e 's/\(.*\)/\U\1/')
NAME=$(echo $name | sed -e 's/\(.*\)/\U\1/')
Prefix=$(echo $prefix | sed -e 's/_\(.\)/\U\1/g' -e 's/^\(.\)/\U\1/')
Name=$(echo $name | sed -e 's/_\(.\)/\U\1/g' -e 's/^\(.\)/\U\1/')

if [ "$prefix" != "gst" ] ; then
  cmdline_prefix="--prefix $prefix"
else
  cmdline_prefix=""
fi

GST_IS_REPLACE=${PREFIX}_IS_${NAME}
GST_REPLACE=${PREFIX}_${NAME}
GST_TYPE_REPLACE=${PREFIX}_TYPE_${NAME}
GstReplace=${Prefix}${Name}
gst_replace=${prefix}_${name}
gst__replace=${prefix}-${name}
gstreplace=${prefix}$(echo $name | sed -e 's/_//g')
replace=$(echo $name | sed -e 's/_//g')

if [ "$REAL_NAME" = "" ] ; then
  REAL_NAME=FIXME
fi
if [ "$EMAIL_ADDRESS" = "" ] ; then
  EMAIL_ADDRESS=fixme@example.com
fi



basedir=`pwd`/$gst__replace

rm -rf $basedir
mkdir $basedir

cat >$basedir/AUTHORS <<EOF
$REAL_NAME <$EMAIL_ADDRESS>
EOF

cat >$basedir/COPYING <<EOF
Put your license here.
EOF

cat >$basedir/ChangeLog <<EOF
Put your changelog here.
EOF

cat >$basedir/NEWS <<EOF
News about your project.
EOF

cat >$basedir/README <<EOF
README for your project.

NOTE:
plugins can be installed locally by using "\$HOME" as prefix:

  $ meson --prefix="\$HOME" build/
  $ ninja -C build/ install

However be advised that the automatic scan of plugins in the user home
directory won't work under gst-build devenv.
EOF

cat >$basedir/meson.build <<EOF
project('${gst__replace}', 'c',
  version : '0.1.0',
  default_options : [ 'warning_level=1',
                      'buildtype=debugoptimized' ])

core_conf = configuration_data()
core_conf.set('PACKAGE', '"@0@"'.format(meson.project_name()))
core_conf.set('VERSION', '"@0@"'.format(meson.project_version()))

configure_file(output : 'config.h', configuration : core_conf)

configinc = include_directories('.')

common_args = ['-DHAVE_CONFIG_H']

gst_req = '>= 1.0.0'

# Check for the required version of GStreamer core (and gst-plugins-base)
#
# If you need libraries from gst-plugins-base here, also add:
# for libgstaudio-1.0: gstreamer-audio-1.0
# for libgstvideo-1.0: gstreamer-video-1.0
# for libgsttag-1.0: gstreamer-tag-1.0
# for libgstpbutils-1.0: gstreamer-pbutils-1.0
# for libgstfft-1.0: gstreamer-fft-1.0
# for libgstinterfaces-1.0: gstreamer-interfaces-1.0
# for libgstrtp-1.0: gstreamer-rtp-1.0
# for libgstrtsp-1.0: gstreamer-rtsp-1.0
# etc.
gst_dep = dependency('gstreamer-1.0', version : gst_req,
  fallback : ['gstreamer', 'gst_dep'])
gst_base_dep = dependency('gstreamer-base-1.0', version : gst_req,
  fallback : ['gstreamer', 'gst_base_dep'])

# Set the directory where plugins should be installed.
#
# If the prefix is the user home directory, adjust the plugin installation
# path so that GStreamer can find it. Requires meson >= 0.53.0
fs = import('fs')
if fs.is_samepath(get_option('prefix'), '~')
  plugins_install_dir = '@0@/.local/share/gstreamer-1.0/plugins'.format(get_option('prefix'))
else
  plugins_install_dir = '@0@/gstreamer-1.0'.format(get_option('libdir'))
endif

plugin_deps = [gst_dep, gst_base_dep]
tool_deps = [gst_dep]

subdir('plugins')
subdir('tools')
EOF


mkdir -p $basedir/plugins

cat >$basedir/plugins/meson.build <<EOF
lib_args = common_args + []

# sources used to compile this plug-in
plugin_sources = [
  '${gstreplace}plugin.c',
  '${gstreplace}.c',
  '${gstreplace}.h'
]

shlib = shared_library('${gstreplace}',
  plugin_sources,
  c_args : lib_args,
  include_directories: [configinc],
  dependencies : plugin_deps,
  gnu_symbol_visibility : 'hidden',
  install : true,
  install_dir : plugins_install_dir,
)

# Make this library usable as a Meson subproject.
gst_${replace}_dep = declare_dependency(
  include_directories: include_directories('.'),
  link_with : shlib)

pkg_mod = import('pkgconfig')
pkg_mod.generate(
  name : '${gst__replace}',
  filebase : '${gst__replace}',
  description : 'Meson sample project.',
  subdirs : 'src',
  libraries : shlib,
  version : '"@0@"'.format(meson.project_version()),
)
EOF


generate()
{
cat <<EOF
/*
 * GStreamer
 * Copyright (C) $(date +%Y) $REAL_NAME <$EMAIL_ADDRESS>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Alternatively, the contents of this file may be used under the
 * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
 * which case the following provisions apply instead of the ones
 * mentioned above:
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <gst/gst.h>
#include "gstreplace.h"

static gboolean
plugin_init (GstPlugin * plugin)
{
  gst_element_register (plugin, "replace", GST_RANK_NONE,
      GST_TYPE_REPLACE);

  return TRUE;
}

GST_PLUGIN_DEFINE (
    GST_VERSION_MAJOR,
    GST_VERSION_MINOR,
    replace,
    "FIXME Template plugin",
    plugin_init,
    VERSION,
    "LGPL", /* FIXME */
    "GStreamer",
    "http://gstreamer.net/"
)
EOF
}


generate | sed \
  -e "s/GST_BASE_REPLACE/$GST_BASE_REPLACE/g" \
  -e "s/GST_TYPE_BASE_REPLACE/$GST_TYPE_BASE_REPLACE/g" \
  -e "s/GstBaseReplace/$GstBaseReplace/g" \
  -e "s/GST_IS_REPLACE/$GST_IS_REPLACE/g" \
  -e "s/GST_REPLACE/$GST_REPLACE/g" \
  -e "s/GST_TYPE_REPLACE/$GST_TYPE_REPLACE/g" \
  -e "s/GstReplace/$GstReplace/g" \
  -e "s/gst_replace/$gst_replace/g" \
  -e "s/gstreplace/$gstreplace/g" \
  -e "s/replace/$replace/g" >$basedir/plugins/${gstreplace}plugin.c

gst-indent $basedir/plugins/${gstreplace}plugin.c || echo "Warning: could not run gst-indent on the generated code." 1>&2
rm -f $basedir/plugins/${gstreplace}plugin.c~

cat >$basedir/plugins/${gstreplace}.c <<EOF
/* This file should be replaced by element source generated by
 * gst-element-maker, or by your own source code.  To generate suitable
 * element source using gst-element-maker, run:
 *
 *   gst-element-maker $cmdline_prefix $replace BASE_CLASS
 *
 * Where BASE_CLASS is replaced by one of the base class templates,
 * such as basesrc, basetransform, audiofilter, videofilter2, etc.
 * Then copy the resulting $gstreplace.c file over this file, and
 * $gstreplace.h over $gstreplace.h.
 */
/* The rest of this file is shim code to allow the project to compile */
EOF

cat >$basedir/plugins/${gstreplace}.h <<EOF
/* This file should be replaced by element header generated by
 * gst-element-maker, or by your own source code.  To generate suitable
 * element header using gst-element-maker, run:
 *
 *   gst-element-maker $cmdline_prefix $replace BASE_CLASS
 *
 * Where BASE_CLASS is replaced by one of the base class templates,
 * such as basesrc, basetransform, audiofilter, videofilter2, etc.
 * Then copy the resulting $gstreplace.h file over this file, and
 * $gstreplace.c over $gstreplace.c.
 */
/* The rest of this file is shim code to allow the project to compile */
#define ${GST_TYPE_REPLACE} G_TYPE_NONE
EOF


mkdir -p $basedir/tools

cat >$basedir/tools/meson.build <<EOF
exe_args = common_args + []

# sources used to compile this program
tool_sources = [
  '${gstreplace}.c',
]

executable('${gstreplace}',
  tool_sources,
  install: true,
  c_args : exe_args,
  include_directories: [configinc],
  dependencies : tool_deps,
)
EOF

cat >$basedir/tools/${gstreplace}.c <<EOF
/* This file should be replaced by application source generated by
 * gst-app-maker, or by your own source code.  To generate suitable
 * app source using gst-app-maker, run:
 *
 *   gst-app-maker $cmdline_prefix $replace
 *
 * Then copy the resulting $gstreplace.c file over this file.
 */
/* The rest of this file is shim code to allow the project to compile */
#include <stdio.h>
int main (void) { printf ("FIXME\n"); return 0; }
EOF
