#!/usr/bin/env bash
set -euo pipefail

usage() {
  cat <<'TXT'
Uso:
  make-client-module.sh <client_root> <module_slug> "<module_name>" <entry_url|-> [free|paid] [price] [currency] [license_term]

Ejemplo:
  make-client-module.sh /home/bitnami/htdocs/desert/btec_v1 crm-cotizaciones "CRM Cotizaciones" cotizaciones.php free
  make-client-module.sh /home/bitnami/htdocs/desert/btec_v1 asistente-voz "Asistente Voz" - paid 79.00 USD monthly
  make-client-module.sh /home/bitnami/htdocs/sunnydesertcabo/btec_v1 blog-publicador-web "Blog Publicador Web" blog.php paid 3600 MXN one_time
TXT
}

if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  usage
  exit 0
fi

if [[ $# -lt 4 ]]; then
  usage
  exit 1
fi

client_root="${1%/}"
module_slug="$2"
module_name="$3"
entry_url_raw="$4"
module_type="${5:-free}"
price_amount="${6:-}"
price_currency="${7:-USD}"
license_term="${8:-}"

if [[ ! -d "$client_root" ]]; then
  echo "Error: client_root no existe: $client_root" >&2
  exit 1
fi

if [[ ! -d "$client_root/func" ]]; then
  echo "Error: no se encontró carpeta func en: $client_root" >&2
  exit 1
fi

if [[ ! "$module_slug" =~ ^[a-z0-9]+(-[a-z0-9]+)*$ ]]; then
  echo "Error: module_slug debe usar minusculas y guiones (ej: blog-publicador-web)." >&2
  exit 1
fi

if [[ "$module_type" != "free" && "$module_type" != "paid" ]]; then
  echo "Error: module_type debe ser free o paid." >&2
  exit 1
fi

if [[ "$module_type" == "paid" ]]; then
  if [[ -z "$price_amount" ]]; then
    echo "Error: para module_type=paid debes indicar price (ej: 49.00)." >&2
    exit 1
  fi
  if ! [[ "$price_amount" =~ ^[0-9]+([.][0-9]{1,2})?$ ]]; then
    echo "Error: price invalido. Usa formato decimal (ej: 49.00)." >&2
    exit 1
  fi
fi

price_currency="$(echo "$price_currency" | tr '[:lower:]' '[:upper:]' | tr -cd 'A-Z0-9')"
if [[ -z "$price_currency" ]]; then
  price_currency="USD"
fi
if [[ "${#price_currency}" -gt 10 ]]; then
  price_currency="${price_currency:0:10}"
fi

if [[ -z "$license_term" ]]; then
  if [[ "$module_type" == "paid" ]]; then
    license_term="monthly"
  else
    license_term="one_time"
  fi
fi

license_term="$(echo "$license_term" | tr '[:upper:]' '[:lower:]' | tr '-' '_')"
case "$license_term" in
  weekly|semanal) license_term="weekly" ;;
  monthly|mensual|mesual) license_term="monthly" ;;
  annual|anual|yearly) license_term="annual" ;;
  one_time|onetime|unica|unico|lifetime) license_term="one_time" ;;
  *)
    echo "Error: license_term invalido. Usa weekly, monthly, annual o one_time." >&2
    exit 1
    ;;
esac

func_id="${module_slug//-/_}"
modules_dir="$client_root/func/modules"
module_php="$modules_dir/${module_slug}.php"
module_sql="$modules_dir/${module_slug}.sql"
module_readme="$modules_dir/${module_slug}.README.md"

mkdir -p "$modules_dir"

if [[ -e "$module_php" || -e "$module_sql" ]]; then
  echo "Error: ya existe scaffold para este slug en $modules_dir" >&2
  exit 1
fi

if [[ "$entry_url_raw" == "-" || "$entry_url_raw" == "null" ]]; then
  entry_url_php="null"
else
  entry_url_php="'${entry_url_raw//\'/\\\'}'"
fi

if [[ "$module_type" == "paid" ]]; then
  price_php="$price_amount"
else
  price_php="null"
fi

cat > "$module_php" <<PHP
<?php

declare(strict_types=1);

if (!function_exists('btec_client_module_${func_id}_catalog')) {
    /**
     * @return array<string,mixed>
     */
    function btec_client_module_${func_id}_catalog(): array
    {
        return [
            'slug' => '${module_slug}',
            'name' => '${module_name}',
            'description' => 'Describe aquí qué resuelve este módulo.',
            'module_type' => '${module_type}',
            'price_usd' => ${price_php},
            'price_currency' => '${price_currency}',
            'default_license_term' => '${license_term}',
            'latest_version' => '1.0.0',
            'entry_url' => ${entry_url_php},
            'install_callback' => 'btec_modules_install_${func_id}',
            'update_callback' => 'btec_modules_update_${func_id}',
            'is_active' => 1,
        ];
    }
}

if (!function_exists('btec_client_module_${func_id}_detail')) {
    /**
     * @return array<string,mixed>
     */
    function btec_client_module_${func_id}_detail(): array
    {
        return [
            'slug' => '${module_slug}',
            'characteristics' => [
                'Característica principal 1.',
                'Característica principal 2.',
                'Característica principal 3.',
            ],
            'functions' => [
                'Función operativa 1.',
                'Función operativa 2.',
                'Función operativa 3.',
            ],
            'benefits' => [
                'Beneficio de negocio 1.',
                'Beneficio de negocio 2.',
                'Beneficio de negocio 3.',
            ],
        ];
    }
}

if (!function_exists('btec_modules_install_${func_id}')) {
    /**
     * @return array{success:bool,messages:array<int,string>,errors:array<int,string>,version:string}
     */
    function btec_modules_install_${func_id}(mysqli \$conn): array
    {
        \$messages = [];
        \$errors = [];

        try {
            \$schemaPath = __DIR__ . '/${module_slug}.sql';
            if (is_readable(\$schemaPath)) {
                \$schemaSql = file_get_contents(\$schemaPath);
                if (is_string(\$schemaSql) && trim(\$schemaSql) !== '') {
                    if (\$conn->multi_query(\$schemaSql) === false) {
                        throw new RuntimeException('Error al ejecutar ${module_slug}.sql: ' . \$conn->error);
                    }
                    do {
                        \$result = \$conn->store_result();
                        if (\$result instanceof mysqli_result) {
                            \$result->free();
                        }
                    } while (\$conn->more_results() && \$conn->next_result());
                    \$messages[] = 'Esquema SQL verificado.';
                }
            } else {
                \$messages[] = 'No se detectó SQL. Instalación sin cambios de base de datos.';
            }

            // Opcional: crear entrada de menú para la pantalla del módulo.
            if (function_exists('menu_modules_bootstrap')
                && function_exists('menu_modules_insert')
                && function_exists('btec_modules_find_menu_id_by_slug')
            ) {
                menu_modules_bootstrap(\$conn);
                \$groupSlug = 'sistema'; // Ajusta este grupo según tu estructura.
                \$groupId = btec_modules_find_menu_id_by_slug(\$conn, \$groupSlug);
                \$menuSlug = '${module_slug}';
                \$menuId = btec_modules_find_menu_id_by_slug(\$conn, \$menuSlug);
                if (\$groupId !== null && \$menuId === null && ${entry_url_php} !== null) {
                    menu_modules_insert(\$conn, [
                        'parent_id' => \$groupId,
                        'slug' => \$menuSlug,
                        'label' => '${module_name}',
                        'icon_class' => 'fa-solid fa-cube',
                        'url' => ${entry_url_php},
                        'sort_order' => 100,
                        'is_active' => 1,
                    ]);
                    \$messages[] = 'Acceso de menú agregado.';
                }
            }
        } catch (Throwable \$e) {
            \$errors[] = \$e->getMessage();
        }

        return [
            'success' => empty(\$errors),
            'messages' => \$messages,
            'errors' => \$errors,
            'version' => '1.0.0',
        ];
    }
}

if (!function_exists('btec_modules_update_${func_id}')) {
    /**
     * @return array{success:bool,messages:array<int,string>,errors:array<int,string>,version:string}
     */
    function btec_modules_update_${func_id}(mysqli \$conn): array
    {
        return btec_modules_install_${func_id}(\$conn);
    }
}
PHP

cat > "$module_sql" <<SQL
-- ${module_name} (${module_slug})
-- SQL idempotente: usa CREATE TABLE IF NOT EXISTS y ALTER TABLE condicional.

-- Ejemplo:
-- CREATE TABLE IF NOT EXISTS \`${module_slug//-/_}_items\` (
--   id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
--   ida VARCHAR(60) NOT NULL,
--   created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
--   updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SQL

cat > "$module_readme" <<TXT
# ${module_name}

Slug: ${module_slug}

Archivos generados:
- func/modules/${module_slug}.php
- func/modules/${module_slug}.sql

Siguientes pasos:
1. Completa la descripción, características, funciones y beneficios.
2. Implementa SQL real en ${module_slug}.sql.
3. Ajusta creación de menú (grupo, icono, sort_order) en el callback install.
4. Abre modulos-btec.php e instala el módulo.
TXT

echo "Scaffold creado:"
echo "  - $module_php"
echo "  - $module_sql"
echo "  - $module_readme"
echo
echo "Siguiente paso:"
echo "  1) Abre modulos-btec.php del cliente."
echo "  2) Busca '${module_name}' e instala."
