#!/bin/bash
# Copyright 2024 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

#### CATEGORY=Other
#### DEPRECATED
### List the dependencies of a target, and if dependencies are in SDK

## usage: fx sdk-deps [Options]
##
##  Options:
##     -t < target> : List all the deps of this target
##     -d < dep> : Determine if the dependency is in SDK
##     -o < filename> : Write output to CSV file. Default: sdk_deps_out.csv
##
## Deprecated: This command is deprecated as it only supports GN atoms.

set -o errexit

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh
fx-config-read

readonly TEMPDIR="tmp"
mkdir "${TEMPDIR}"
trap 'rm -rf "$TEMPDIR"' EXIT

dep_list_file="${TEMPDIR}/dep_list"
partner_sdk_deps_file="${TEMPDIR}/partner_sdk_deps_list"
non_sdk_deps_file="${TEMPDIR}/non_sdk_deps_list"
output_csv="sdk_deps_out.csv" # Default CSV filename

touch ${dep_list_file}
touch ${partner_sdk_deps_file}
touch ${non_sdk_deps_file}

collect_deps() {
    local target=$1
    local prefix=$(echo ${target} | cut -d ":" -f1)
    local deps=($(fx-command-run gn desc "${build_dir}" "${target}" deps || continue))
    for dep in "${deps[@]}"; do
        # We skip some deps
        if [[ "${dep}" == *"shlib-allowlist-check"* \
           || "${dep}" == *"static-libc++-deps"* \
           || "${dep}" == *"tools/bindc:bin"* \
           || "${dep}" == *"zircon/public/sysroot"* \
           || "${dep}" != "//"* ]] ; then
            continue
        fi
        if [[ "${dep}" == ${prefix}* ]]; then
            collect_deps $dep
        else
            echo "${dep}" | xargs >> ${dep_list_file}
        fi
    done
}

main() {
    local build_dir=$(fx-command-run get-build-dir)
    fx-info "Using build dir: ${build_dir}"
    local targets=()
    local sdk_deps=()
    while [[ $# -ge 1 ]]; do
        case "$1" in
        -t)
            shift
            targets+=( "$1" )
            ;;
        -d)
            shift
            sdk_deps+=( "$1" )
            ;;
        -o)
            shift
            output_csv="$1"
            ;;
        esac
        shift
    done
    if [[ "${#targets[@]}" -eq 0 && "${#sdk_deps[@]}" -eq 0 ]]; then
        echo "Either a target that contains driver or a dependency needs to be passed in."
        fx-command-help sdk-deps
        exit 1
    fi

    if [[ "${#targets[@]}" -gt 0 ]]; then
        local distribution_manifests=()
        # Use `gn meta` to walk the metadata and select all items with
        # `driver_package_component_files`. This is mandatory all driver.
        for target in "${targets[@]}"; do
            distribution_manifests+=( $(fx-command-run gn meta "${build_dir}" --data=driver_package_component_files "${target}" 2>/dev/null | grep "distribution_manifest = " | cut -d "\"" -f2 | sed -e "s|.*|${build_dir}/&|") )
        done

        # Collect all the drivers from the distribution
         if [[ "${#targets[@]}" -gt 0 ]]; then
            local drivers=($(fx-command-run jq -r '.[] | select((.destination|startswith("driver"))) | .label' "${distribution_manifests[@]}" | sort -u))
        fi

        # Collect all the deps
        fx-info "Listing all drivers and collect deps..."
        echo
        for driver in "${drivers[@]}"; do
            # Don't analyze the compat driver
            if [[ "${driver}" == *"src/devices/misc/drivers/compat:driver"* ]]; then
                continue
            fi
            echo "    ${driver}"
            collect_deps $driver &
        done
        echo
    fi

    # Also collect the deps directly passed in
    for dep in "${sdk_deps[@]}"; do
        echo "${dep}" | xargs >> ${dep_list_file}
    done

    local non_sdk=()

    local partner_sdk_deps="${TEMPDIR}/partner_sdk_all_deps"

    fx-info "Collecting IDK dependencies..."
    fx-command-run gn desc "${build_dir}" "//sdk:fuchsia_collection" deps --all > ${partner_sdk_deps} &

    wait $(jobs -rp)

    for dep in $(cat ${dep_list_file} | sort -u); do
        if [[ "${dep}" == *"sdk/fidl"* ]]; then
            fidl="$(echo $dep | cut -d ":" -f1 | cut -d "/" -f5)"
            dep_sdk="//sdk/fidl/${fidl}:${fidl}_sdk"
        elif [[ "${dep}" == *"src/devices/bind"* ]]; then
            bind="$(echo $dep | cut -d ":" -f1 | cut -d "/" -f6)"
            dep_sdk="//src/devices/bind/${bind}:${bind}_sdk"
        else
            dep_sdk="$(echo ${dep} | cut -d "(" -f1)_sdk"
        fi

        if [[ $(grep -c ${dep_sdk} ${partner_sdk_deps}) -gt 0 ]]; then
            echo "${dep}" >> "${partner_sdk_deps_file}"
            continue
        fi

        echo "${dep}" >> "${non_sdk_deps_file}"
    done

    # Calculate non sdk total items
    num_non_sdk_total_items=$(cat ${non_sdk_deps_file} | wc -l)

    # Calculate items containing banjo
    num_total_banjo=$(cat ${non_sdk_deps_file} | grep banjo | wc -l)

    # Calculate total number of drivers
    num_drivers="${#drivers[@]}"

    # Calculate total number of parter sdk deps
    num_partner_sdk_deps=$(cat ${partner_sdk_deps_file} | wc -l)

    # Print to console
    fx-info "Result:"
    echo
    echo "    In SDK:"
    sed -i -e 's/^/      /' ${partner_sdk_deps_file}
    echo "      Total items:" ${num_partner_sdk_deps}
    cat ${partner_sdk_deps_file}
    echo
    echo "    Not in SDK:"
    sed -i -e 's/^/      /' ${non_sdk_deps_file}
    echo "      Total items:" ${num_non_sdk_total_items}
    echo "      Items containing 'banjo':" ${num_total_banjo}
    cat ${non_sdk_deps_file}

    # Write to CSV with headers
    echo "date_time_run,number_drivers,number_partner_sdk_deps,number_non_sdk_total_items,number_total_banjo" > "${output_csv}"
    echo "$(date +"%Y-%m-%d %H:%M:%S"),${num_drivers},${num_partner_sdk_deps},${num_non_sdk_total_items},${num_total_banjo}" >> "${output_csv}"
    fx-info "CSV output written to: ${output_csv}"

    fx-warn "fx sdk-deps is deprecated."
    fx-warn "Please file an SDK Experiences bug describing why you need it."
}

main "$@"
