#!/bin/bash
# THE PURPOSE OF THIS SCRIPT IS TO RUN THIS BASH SCRIPT IN A LARAVEL PROJECT AND IT WILL ADD THE APPROPRIATE REQUIRED PAGES.
# TO RUN SCRIPT:
#rm -f Laravel-AddNewpage-api.sh
#curl -o ./Laravel-AddNewpage-api.sh https://www.webune.com/forums/Laravel-AddNewpage-api.sh.html
#chmod +x Laravel-AddNewpage-api.sh
#./Laravel-AddNewpage-api.sh

# touch Laravel-AddNewpage-api.sh ; chmod a+x Laravel-AddNewpage-api.sh ; code Laravel-AddNewpage-api.sh

########## ENTER INPUT START ########

#EXAMPLE 1 - Creates a page and a new controller (AdminController) http://localhost/admin/ in the 15T Windows XAMPP PC
#1 Platform = 1
#2 Page Name = index
#3 Folder Name = admin
#4 Route = /admin
#5 Route Type = 1 (get)
#6 Controller Name = AdminController
# RESULTS:
#1 = For the 15T Windows XAMPP PC
#2,3 = Creates file: admin/index.blade.php
#4 = Creates a route in api.php as '/admin'
#5 = Sets the CRUD type to 'get'
#6 = Check if AdminController exists, if not, generates to app/Http/Controllers/AdminController.php
# URL= http://localhost:8000/admin or http://localhost/admin


#EXAMPLE 2 - Creates a page to existing controller (AdminController) following:
#1 Platform = 1
#2 Page Name = todo
#3 Folder Name = admin
#4 Route = /admin/todo
#5 Route Type = 1 (get)
#6 Controller Name = AdminController
# RESULTS:
#1 = For the 15T Windows XAMPP PC
#2,3 = Creates file: admin/todo.blade.php
#4 = Creates a route in api.php as '/admin/todo'
#5 = Sets the CRUD type to 'get'
#6 = Check if AdminController exists, if not, generates to app/Http/Controllers/
# URL= http://localhost:8000/admin/todo















# 1
PS3='1. Select your planform (1): '
APP_PLATFORMS=("php" "sail")
select APP_PLATFORM in "${APP_PLATFORMS[@]}"; do
    case $APP_PLATFORM in
        "php")
            APP_ROUTE_NAME=$APP_PLATFORM
            break
            ;;
        "sail")
            APP_ROUTE_NAME=$APP_PLATFORM
            break
            ;;
        *) echo "invalid option $REPLY";;
    esac
done
echo "#22 APP_PLATFORM = $APP_PLATFORM"

echo "EXAMPLE: Route::post('/home', [AuthController::class, 'index']); "

#2  ROUTE
while [[ $APP_ROUTE == "" ]]
do
  read -p "4. Enter the Route (/home): NOTE Common Resource Routes: index, create, store, show, edit, update, destroy " APP_ROUTE
  set -e
done
echo "#49 APP_ROUTE = $APP_ROUTE"

# 3 ROUTER METHOD TYPE
#https://laravel.com/docs/9.x/routing#available-router-methods
PS3='5. Select the route Type (1):  '
APP_ROUTE_NAMES=("get" "post" "patch" "delete" "options")
select ROUTER_METHOD in "${APP_ROUTE_NAMES[@]}"; do
    case $ROUTER_METHOD in
        "get")
            APP_ROUTE_NAME=$ROUTER_METHOD
            break
            ;;
        "post")
            APP_ROUTE_NAME=$ROUTER_METHOD
            break
            ;;
        "patch")
            APP_ROUTE_NAME=$ROUTER_METHOD
	        break
            ;;
	    "delete")
	        APP_ROUTE_NAME=$ROUTER_METHOD
            break
	        ;;
	    "options")
	        APP_ROUTE_NAME=$ROUTER_METHOD
            break
	        ;;
        *) echo "invalid option $REPLY";;
    esac
done
echo "#79 ROUTER_METHOD = $ROUTER_METHOD"




#https://laravel.com/docs/9.x/controllers#actions-handled-by-resource-controller
# // CONTROLLERS NAMING CONVENTIONS:
# // 7 Common Resource Routes:
# // index - Show all listings
# // show - SHOW single listing
# // create - Show form to create new listing (POST)
# // edit - show form to edit listing
# // update - update listing (POST)
# // destroy - Delete Listing
PS3=' Ente a route Method name (create): '
APP_ROUTE_NAMES=("index" "create" "store" "show" "edit" "update" "destroy")
select RESOURCE_CONTROLLER in "${APP_ROUTE_NAMES[@]}"; do
    case $RESOURCE_CONTROLLER in
        "index")
            APP_ROUTE_NAME=$RESOURCE_CONTROLLER
            break
            ;;
        "create")
            APP_ROUTE_NAME=$RESOURCE_CONTROLLER
            break
            ;;
        "store")
            APP_ROUTE_NAME=$RESOURCE_CONTROLLER
	        break
            ;;
	    "show")
	        APP_ROUTE_NAME=$RESOURCE_CONTROLLER
            break
	        ;;
	    "edit")
	        APP_ROUTE_NAME=$RESOURCE_CONTROLLER
            break
	        ;;
	    "update")
	        APP_ROUTE_NAME=$RESOURCE_CONTROLLER
            break
	        ;;
	    "destroy")
	        APP_ROUTE_NAME=$RESOURCE_CONTROLLER
            break
	        ;;
        *) echo "invalid option $REPLY";;
    esac
done
echo "#163 RESOURCE_CONTROLLER = $RESOURCE_CONTROLLER"




# while [[ $APP_ROUTE_NAME == "" ]]
# do
#   read -p "2. Ente a route Method name (index) : " APP_ROUTE_NAME
#   set -e
# done
# echo "#31 APP_ROUTE_NAME = $APP_ROUTE_NAME"









# this option is if the blade file should be created in the view/ folder or sub foldre in /view
# APP_VIEW_FOLDER=''
# read -p "3. Ente a controller name (UserController): " APP_VIEW_FOLDER
# if [[ $CONTROLLERNAME == "" ]]
# then
#     CONTROLLERNAME=$CONTROLLERNAME_DEFAULT
#     set -e
# fi
# echo "#41 APP_VIEW_FOLDER = $APP_VIEW_FOLDER"



#5
# CONTROLLERNAME is OK to be blank, no controller command will be generated by script
while [[ $CONTROLLERNAME == "" ]]
do
  read -p "6. Enter the Controlller Name (CamelizeText: UserController): If controller already exists, please also enter. " CONTROLLERNAME
  set -e
done
echo "#89 CONTROLLERNAME = $CONTROLLERNAME"


VIEW_SUB_FOLDER="resources/views"


########################################### PROCESS INPUT #################################


################################# CONTROLLER
CONTROLLERFILE="app/Http/Controllers/Api/$CONTROLLERNAME.php"
echo "#151 CONTROLLERFILE = $CONTROLLERFILE"

# check if directory exists, IF NOT CREATE A NEW CONTROLLER
#if [ ! -f $CONTROLLERFILE ]
if [ ! -f "$CONTROLLERFILE" ]
then
    CONTROLLER_COMAND="$APP_PLATFORM artisan make:controller Api/$CONTROLLERNAME"
    echo "#158 - CONTROLLER_COMAND = $CONTROLLER_COMAND"
    # Contorller file exisits, OK
    # controller file does not exits, so create
    #mkdir $CONTROLLERFILE
    #$APP_PLATFORM artisan make:controller $CONTROLLERNAME
    eval $CONTROLLER_COMAND
    set -e
    echo "#163 Controller Name Added: $CONTROLLERNAME"

    # IF THIS PAGE WILL HAVE A CONROLLER, A LAYOUT IS REQURED:
    # CHECK IF LAYOUT EXISTS< IF NOT CREATED:

    COMPONENTS_FOLDERNAME="$VIEW_SUB_FOLDER/components/"
    echo "#170 COMPONENTS_FOLDERNAME = $COMPONENTS_FOLDERNAME"
    LAYOUT_FILE="$COMPONENTS_FOLDERNAME/layout.blade.php"
    echo "#172 LAYOUT_FILE = $LAYOUT_FILE"

    if [ ! -d "$COMPONENTS_FOLDERNAME" ]
    then
        mkdir $COMPONENTS_FOLDERNAME
        echo "#173 COMPONENTS_FOLDERNAME created: $COMPONENTS_FOLDERNAME"
        LAYOUT_CODE='<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>'"$APP_ROUTE_NAME"'</title></head><body> {{$slot}}</body></html>'
        echo $LAYOUT_CODE > $LAYOUT_FILE
        echo "#173 LAYOUT_FILE created: $LAYOUT_FILE"
        # layout.blade.php does not exits, so create


    fi
else
    echo "#217 [YES] Controller File Exists CONTROLLERFILE: $CONTROLLERFILE"
fi


# MUST BE HERE to DECLARE APP_METHOD_FILE
if [[ $APP_VIEW_FOLDER != "" ]]
then
    # if its a sub folder of view/ then add a dot
    APP_METHOD_FILE="$APP_VIEW_FOLDER.$APP_ROUTE_NAME"
    set -e
else
    APP_METHOD_FILE="$APP_ROUTE_NAME"
fi
echo "#173 APP_VIEW_FOLDER = $APP_VIEW_FOLDER"


# always will be view: Example: https://github.com/bradtraversy/laragigs/blob/main/app/Http/Controllers/ListingController.php
CONTROLLER_METHOD="public function $APP_ROUTE_NAME() {\n\t\t\treturn view('$APP_METHOD_FILE');\n\t\t}"
echo "#176 CONTROLLER_METHOD = $CONTROLLER_METHOD"
#https://unix.stackexchange.com/a/283411
# add this method to the 3rd line from the bottom in the file
sed -zEi "s/(\n[^\n]*){3}$/\n$CONTROLLER_METHOD&/" $CONTROLLERFILE

#sed -i "\/\/\NewMethods/a $CONTROLERCODE" $CONTROLLERFILE
code $CONTROLLERFILE




################################# ROUTER
# EXAMPLE: Route::get('/myadmin ', [ListingController::class, 'index']);
echo "// AUTO GENERATED BY: https://www.webune.com/forums/Laravel-AddNewpage-api.sh.html" >> routes/api.php
echo "Route::$ROUTER_METHOD('$APP_ROUTE', [$CONTROLLERNAME::class, '$APP_ROUTE_NAME']);" >> routes/api.php
# open routes file
code routes/api.php
echo "#148 - Route added to api.php"



# NO VIEWS FOR THIS VERSION
################################# VIEW

# check if directory exists
echo "#224 Check if exists: APP_VIEW_FOLDER=$APP_VIEW_FOLDER"
VIEW_SUB_FOLDER="resources/views/$APP_VIEW_FOLDER/"
echo "#186 VIEW_SUB_FOLDER = $VIEW_SUB_FOLDER"

if [ ! -d $VIEW_SUB_FOLDER ]
then
    # controller file does not exits, so create

    echo "#229 mkdir $VIEW_SUB_FOLDER"

    #DISABLED mkdir $VIEW_SUB_FOLDER
    set -e
    echo "#223 View Folder Created: $VIEW_SUB_FOLDER"
else
    echo "#235 YES $APP_VIEW_FOLDER FILE ALREADY EXISTS"
fi



COMPONENTNAME_FILE="$VIEW_SUB_FOLDER$APP_ROUTE_NAME.blade.php"

echo "#197 COMPONENTNAME_FILE = $COMPONENTNAME_FILE"
# check if file exists
if [ ! -f $COMPONENTNAME_FILE ]
then
    # controller file does not exits, so create
    #DISABLED touch $COMPONENTNAME_FILE
    set -e
fi


VIEWCODE=$'<x-layout>\n\t... NEw Page name '"$APP_ROUTE_NAME"$' Created By Bash Script\n</x-layout>'
#DISABLED echo "$VIEWCODE" > $COMPONENTNAME_FILE

#DISABLED code $COMPONENTNAME_FILE







#xdg-open http://localhost/$COMPONENTNAME/$APP_ROUTE_NAME
echo $'######################\nCOMPLETED:######################\nhttp://localhost:8000'"$APP_ROUTE"$'\nhttp://localhost'"$APP_ROUTE"''






exit