#!/bin/sh

# Swift Package Manager [has some strict requirements](https://github.com/apple/swift-package-manager/blob/main/Documentation/Usage.md#creating-c-language-targets) to source files layout.
# We can gain SPM support with minimal project structure changes by applying an autogenerated layout based on symbolic links technics. 
# SPM related files located under `spm` folder at project's root.
# You should **NEVER** modify it manually nor inlude to Xcode's project.

#  ### Generate SPM layout

#  1. From **project's root** run:

#     `bash scripts/generate_spm_sources_layout.sh`

#  2. Commit Changes

#  Repeate those steps each time you delete/add project's files. **Make sure** to have this CI step which will check that `generate_spm_sources_layout.sh` is not broken.

set -e

###IGListDiffKit
SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH="spm/Sources/IGListDiffKit/include"
SPM_IG_LIST_DIFF_KIT_SOURCES_PATH="spm/Sources/IGListDiffKit"

function generate_ig_list_diff_kit_spm_public_headers() {
    echo "Generate symbolic links for all public headers. *.h"
    echo "Generated under ${SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH}"

    public_headers_list=$(
        find "Source/IGListDiffKit" \
        -type f -name "*.[h]" \
        -not -path "spm/*" \
        -not -path "Source/IGListDiffKit/Internal/*" \
        -not -path "Examples/*" | sed "s| \([^/]\)|:\1|g"
    )

    SRC_ROOT=$(pwd)
    cd $SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH
    for public_file in $public_headers_list; do
        file_to_link=$(echo $public_file | sed "s|:| |g")
        ln -s ../../../../$file_to_link

    done

    cd $SRC_ROOT
    echo "      Done"
    echo ""
}

function generate_ig_list_diff_kit_spm_private_headers() {
    echo "Generate symbolic links for all private headers *.h"
    echo "Generated under ${SPM_IG_LIST_DIFF_KIT_SOURCES_PATH}"

    private_headers_list=$(
        find "Source/IGListDiffKit/Internal" \
        -type f -name "*.h" \
        -not -path "spm/*" | sed "s| \([^/]\)|:\1|g")

    SRC_ROOT=$(pwd)
    cd $SPM_IG_LIST_DIFF_KIT_SOURCES_PATH

    for private_file in $private_headers_list; do
        file_to_link=$(echo $private_file | sed "s|:| |g")

        ln -s ../../../$file_to_link

    done

    cd $SRC_ROOT

    echo "      Done"
    echo ""
}

function generate_ig_list_diff_kit_spm_sources() {
    echo "Generate symbolic links for all public implementations. *.m & *.mm"
    echo "Generated under ${SPM_IG_LIST_DIFF_KIT_SOURCES_PATH}"

    sources_list=$(
        find "Source/IGListDiffKit" \
        -type f -name "*.[m]" -o -name "*.mm" \
        -not -path "spm/*" | sed "s| \([^/]\)|:\1|g")

    SRC_ROOT=$(pwd)
    cd $SPM_IG_LIST_DIFF_KIT_SOURCES_PATH

    for source_file in $sources_list; do
        file_to_link=$(echo $source_file | sed "s|:| |g")

        ln -s ../../../$file_to_link

    done

    cd $SRC_ROOT

    echo "      Done"
    echo ""
}

function generate_ig_list_diff_kit() {
    generate_ig_list_diff_kit_spm_public_headers

    generate_ig_list_diff_kit_spm_private_headers

    generate_ig_list_diff_kit_spm_sources
}

#### IGListKit
SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH="spm/Sources/IGListKit/include"
SPM_IG_LIST_KIT_SOURCES_PATH="spm/Sources/IGListKit"

function generate_ig_list_kit_spm_public_headers() {
    echo "Generate symbolic links for all public headers. *.h"
    echo "Generated under ${SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH}"

    public_headers_list=$(
        find "Source/IGListKit" \
        -name "*.[h]" \
        -type f -not -path "spm/*" \
        -not -path "Source/IGListKit/Internal/*" \
        -not -path "Examples/*" | sed "s| \([^/]\)|:\1|g"
    )

    SRC_ROOT=$(pwd)
    cd $SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH

    for public_file in $public_headers_list; do
        file_to_link=$(echo $public_file | sed "s|:| |g")
        ln -s ../../../../$file_to_link

    done

    cd $SRC_ROOT
    echo "      Done"
    echo ""
}

function generate_ig_list_kit_spm_private_headers() {
    echo "Generate symbolic links for all private headers/implementations *.h && *.m"
    echo "Generated under ${SPM_IG_LIST_KIT_SOURCES_PATH}"

    shared_ig_diff_kit_sorces_list=$(find "Source/IGListDiffKit/Internal" \
        -name "*.[hm]" -o -name "*.mm" \
        -type f -not -path "spm/*" \
        -not -path "Examples/*" | sed "s| \([^/]\)|:\1|g")

    private_headers_list=$(find "Source/IGListKit/Internal" \
        -name "*.h" \
        -type f -not -path "spm/*" \
        -not -path "Examples/*" | sed "s| \([^/]\)|:\1|g")

    SRC_ROOT=$(pwd)
    cd $SPM_IG_LIST_KIT_SOURCES_PATH

    for shared_file in $shared_ig_diff_kit_sorces_list; do
        file_to_link=$(echo $shared_file | sed "s|:| |g")
        ln -s ../../../$file_to_link

    done

    for private_file in $private_headers_list; do
        file_to_link=$(echo $private_file | sed "s|:| |g")

        ln -s ../../../$file_to_link

    done

    cd $SRC_ROOT

    echo "      Done"
    echo ""
}

function generate_ig_list_kit_spm_sources() {
    echo "Generate symbolic links for all public implementations. *.m"
    echo "Generated under ${SPM_IG_LIST_KIT_SOURCES_PATH}"

    sources_list=$(
        find "Source/IGListKit" \
        -name "*.m" -o -name "*.mm" \
        -type f -not -path "spm/*" \
        -not -path "Examples/*" | sed "s| \([^/]\)|:\1|g")

    SRC_ROOT=$(pwd)
    cd $SPM_IG_LIST_KIT_SOURCES_PATH

    for source_file in $sources_list; do
        file_to_link=$(echo $source_file | sed "s|:| |g")

        ln -s ../../../$file_to_link

    done

    cd $SRC_ROOT

    echo "      Done"
    echo ""
}

function generate_ig_list_kit() {
    generate_ig_list_kit_spm_public_headers

    generate_ig_list_kit_spm_private_headers

    generate_ig_list_kit_spm_sources
}

#### IGListSwiftKit
SPM_IG_LIST_SWIFT_KIT_SOURCES_PATH="spm/Sources/IGListSwiftKit"

function generate_ig_list_swift_kit_spm_sources() {
    echo "Generate symbolic links for all public implementations. *.swift"
    echo "Generated under ${SPM_IG_LIST_SWIFT_KIT_SOURCES_PATH}"

    sources_list=$(
        find "Source/IGListSwiftKit" \
        -type f -name "*.swift" \
        -not -path "spm/*" | sed "s| \([^/]\)|:\1|g")

    SRC_ROOT=$(pwd)
    cd $SPM_IG_LIST_SWIFT_KIT_SOURCES_PATH

    for source_file in $sources_list; do
        file_to_link=$(echo $source_file | sed "s|:| |g")

        ln -s ../../../$file_to_link

    done

    cd $SRC_ROOT

    echo "      Done"
    echo ""
}

function generate_ig_list_swift_kit() {
    generate_ig_list_swift_kit_spm_sources
}

# Delete all symbolik links from `spm` folder
function cleanup() {
    rm -rf $SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH/*.*
    rm -rf $SPM_IG_LIST_DIFF_KIT_SOURCES_PATH/*.*
    #IGListKit
    rm -rf $SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH/*.*
    rm -rf $SPM_IG_LIST_KIT_SOURCES_PATH/*.*
    #IGListSwiftKit
    rm -rf $SPM_IG_LIST_SWIFT_KIT_SOURCES_PATH/*.*
}

########## SPM generator pipeline #############
#1
cleanup
#2
generate_ig_list_diff_kit
#3
generate_ig_list_kit
#4
generate_ig_list_swift_kit
