#!/bin/bash
# ASR1806 Fast Partition Configuration Generator
# Usage: ./config_fast_partion_list.sh --dtsi <dtsi> --config <json> --output <header>

set -eo pipefail

# ---------------------------
# 彩色输出定义
# ---------------------------
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# ---------------------------
# 日志函数
# ---------------------------
timestamp() {
    date "+%Y-%m-%d %H:%M:%S"
}

log() {
    echo -e "[$(timestamp)] $1"
}

log_success() {
    echo -e "[$(timestamp)] ${GREEN}SUCCESS${NC} $1"
}

log_warning() {
    echo -e "[$(timestamp)] ${YELLOW}WARNING${NC} $1"
}

log_error() {
    echo -e "[$(timestamp)] ${RED}ERROR${NC} $1" >&2
}

# ---------------------------
# 参数处理
# ---------------------------
show_help() {
    echo -e "${GREEN}Usage:${NC} $0 [options]"
    echo
    echo -e "${YELLOW}Mandatory Options:${NC}"
    echo "  -d, --dtsi     Path to input DTSI partition file"
    echo "  -c, --config   Path to JSON configuration file"
    echo "  -o, --output   Path to output header file"
    echo
    echo -e "${YELLOW}Optional Options:${NC}"
    echo "  -v, --verbose  Enable verbose output"
    echo "  -h, --help     Show this help message"
    exit 0
}

# 解析参数
while [[ $# -gt 0 ]]; do
    case "$1" in
        -d|--dtsi)
            DTSI_FILE="$2"
            shift 2
            ;;
        -c|--config)
            CONFIG_FILE="$2"
            shift 2
            ;;
        -o|--output)
            HEADER_FILE="$2"
            shift 2
            ;;
        -v|--verbose)
            VERBOSE=true
            shift
            ;;
        -h|--help)
            show_help
            ;;
        *)
            log_error "Unknown option: $1"
            show_help
            exit 1
            ;;
    esac
done

# ---------------------------
# 环境检查
# ---------------------------
check_requirements() {
    log "Checking system requirements..."
    
    # 检查必需参数
    local missing=()
    [[ -z "$DTSI_FILE" ]] && missing+=("--dtsi")
    [[ -z "$CONFIG_FILE" ]] && missing+=("--config")
    [[ -z "$HEADER_FILE" ]] && missing+=("--output")

    if [[ ${#missing[@]} -gt 0 ]]; then
        log_error "Missing required options: ${missing[*]}"
        show_help
        exit 1
    fi

    # 检查依赖
    if ! command -v python3 &>/dev/null; then
        log_error "python3 is required but not installed"
        exit 1
    fi

    log_success "All requirements satisfied"
}

validate_paths() {
    log "Validating input paths..."
    
    # 检查输入文件
    for file in "$DTSI_FILE" "$CONFIG_FILE"; do
        if [[ ! -f "$file" ]]; then
            log_error "File not found: $file"
            exit 1
        fi
        log "Found: $file"
    done

    # 准备输出目录
    mkdir -p "$(dirname "$HEADER_FILE")" || {
        log_error "Failed to create output directory: $(dirname "$HEADER_FILE")"
        exit 1
    }
    log "Output will be written to: $HEADER_FILE"

    log_success "Path validation passed"
}

# ---------------------------
# 主逻辑
# ---------------------------
generate_partitions() {
    local py_script="$(dirname "$0")/generate_partitions.py"
    
    log "Starting partition configuration generation..."
    log "--------------------------------------------"
    log "Input DTSI:    $DTSI_FILE"
    log "Config JSON:   $CONFIG_FILE"
    log "Output Header: $HEADER_FILE"
    log "Python Script: $py_script"
    log "--------------------------------------------"

    local py_cmd=(python3 "$py_script"
        --dtsi "$DTSI_FILE"
        --config "$CONFIG_FILE"
        --header "$HEADER_FILE"
    )
    
    [[ $VERBOSE == true ]] && py_cmd+=(--verbose)

    if ! "${py_cmd[@]}"; then
        log_error "Partition generation failed"
        exit 1
    fi

    log_success "Configuration generated successfully"
}

verify_output() {
    log "Verifying output file..."
    
    if [[ ! -f "$HEADER_FILE" ]]; then
        log_error "Output file was not created: $HEADER_FILE"
        exit 1
    fi

    local line_count=$(wc -l < "$HEADER_FILE")
    local generated_lines=$(grep -c "Auto-generated partition config" "$HEADER_FILE")
    
    log "Output file info:"
    log "  Path:       $HEADER_FILE"
    log "  Lines:      $line_count"
    log "  Generated:  $generated_lines"
    
    if [[ $generated_lines -eq 0 ]]; then
        log_warning "No generated content found in output file"
    fi

    log_success "Output verification passed"
}

# ---------------------------
# 主流程
# ---------------------------
main() {
    echo -e "\n${GREEN}=== ASR1806 Partition Config Generator ===${NC}"
    
    check_requirements
    validate_paths
    generate_partitions
    verify_output
    
    echo -e "\n${GREEN}=== Operation Completed Successfully ===${NC}"
    echo -e "Output file created: ${YELLOW}$HEADER_FILE${NC}"
}

main