#!/bin/sh
. /lib/functions.sh
. /lib/functions/service.sh

global=0
config_file="/etc/config/samba4"

# 若 Samba 服务本身未开机自启，则无需处理
/etc/init.d/samba4 enabled 2>/dev/null || exit 0

chk_en() {
    config_get_bool autoshare "$1" autoshare 1
    [ "$autoshare" -eq 0 ] && exit 0
}

config_load samba4
config_foreach chk_en samba4

wait_for_init() {
    # 1. 开机引导期等待 procd 就绪
    for _ in $(seq 30); do
        [ -e /tmp/procd.done ] && break
        sleep 1
    done

    # 2. 确认 samba4 实例已注入 procd
    for _ in $(seq 30); do
        if ubus call service list '{"name":"samba4"}' 2>/dev/null | grep -q "samba4"; then
            sleep 1
            return 0
        fi
        sleep 1
    done
}

smb_handle() {
    local path
    config_get path "$1" path
    [ -z "$path" ] && return

    case "$path" in
        "$2" | "$2"/*) global=1 ;;
    esac
    case "$2" in
        "$path" | "$path"/*) global=1 ;;
    esac
}

device="${DEVPATH##*/}"

case "$ACTION" in
    add)
        case "$device" in
            sd*|md*|hd*|mmcblk*|nvme*) ;;
            *) return 0 ;;
        esac

        path="/dev/$device"
        wait_for_init

        grep -v '/boot\|/opt' /proc/mounts | while read -r j; do
            str="${j%% *}"
            if [ "$str" = "$path" ]; then
                strr="${j#* }"
                target="${strr%% *}"
                global=0
                config_load samba4
                config_foreach smb_handle sambashare "$target"

                # 提取共享名：优先提取 /mnt/ 后的目录名，异常情况下取末级路径名
                name="${target#*/mnt/}"
                name="${name#/}"
                [ -z "$name" ] || [ "$name" = "$target" ] && name="${target##*/}"

                if [ "$global" -eq 0 ]; then
                    printf "\n\nconfig sambashare\n" >> "$config_file"
                    printf "\toption auto '1'\n" >> "$config_file"
                    printf "\toption name '%s'\n" "$name" >> "$config_file"
                    printf "\toption path '%s'\n" "$target" >> "$config_file"
                    printf "\toption read_only 'no'\n" >> "$config_file"
                    printf "\toption guest_ok 'yes'\n" >> "$config_file"
                    printf "\toption create_mask '0666'\n" >> "$config_file"
                    printf "\toption dir_mask '0777'\n" >> "$config_file"
                    printf "\toption device '%s'\n" "$device" >> "$config_file"
                    printf "\toption force_root '1'\n" >> "$config_file"
                    printf "\toption inherit_owner 'yes'\n" >> "$config_file"

                    /etc/init.d/samba4 reload
                    return 0
                fi
            fi
        done
        ;;

    remove)
        changed=0
        i=0
        while true; do
            if ! uci -q get "samba4.@sambashare[$i]" >/dev/null; then
                break
            fi

            dev=$(uci -q get "samba4.@sambashare[$i].device")
            auto=$(uci -q get "samba4.@sambashare[$i].auto")

            if [ "$dev" = "$device" ] && [ "$auto" = "1" ]; then
                uci -q delete "samba4.@sambashare[$i]"
                changed=1
                # 删除当前节点后后续元素索引前移，保持 i 不变继续扫描
                continue
            fi
            i=$((i + 1))
        done

        if [ "$changed" -eq 1 ]; then
            uci commit samba4
            /etc/init.d/samba4 reload
        fi
        ;;
esac
