#compdef photoc
# Native zsh completion; install in a directory in $fpath before compinit.

local command='' word pending=0 ended=0 index
local -a command_descriptions specs
command_descriptions=(
    'query:Search JPEG metadata'
    'check:Audit JPEG structural readability'
    'compress:Re-encode JPEGs by quality or target size'
    'contact:Generate paged JPEG contact sheets'
    'exif:Inspect JPEG and Sony ARW metadata'
    'duplicates:Find exact duplicate files'
    'stats:Summarize JPEG and Sony ARW collections'
    'timeline:Summarize shooting dates and sessions'
    'rename:Preview or apply photo renames'
    'sort:Preview or apply photo sorting'
    'focus:Compare JPEG sharpness scores'
    'scrub:Remove EXIF GPS tags'
)

for ((index = 2; index < CURRENT; ++index)); do
    word=$words[index]
    if ((pending)); then
        pending=0
        continue
    fi
    if ((! ended)); then
        case $word in
            --) ended=1; continue ;;
            --quality|--target|--min-quality|--output-dir|--output|--columns|--thumb-size|--sort|--by|--gap|--format|--threshold|--camera|--make|--iso|--aperture|--focal|--after|--before)
                pending=1; continue ;;
            -*) continue ;;
        esac
    fi
    command=$word
    break
done

specs=(
    '(-h --help)'{-h,--help}'[Show help]'
    '(-v --verbose -q --quiet)'{-v,--verbose}'[Add diagnostics on stderr]'
    '(-v --verbose -q --quiet)'{-q,--quiet}'[Suppress status and non-critical warnings]'
    '--no-progress[Disable interactive progress display]'
    '1:command:{_describe command command_descriptions}'
)
case $command in
    '')
        specs+=('(-V --version)'{-V,--version}'[Show version]' '--json[Request JSON where supported]') ;;
    query)
        specs+=(
            '--camera[Exact camera model]:model:'
            '--make[Exact camera make]:make:'
            '--iso[Numeric ISO comparison]:expression:'
            '--aperture[F-number comparison]:expression:'
            '--focal[Focal length comparison in mm]:expression:'
            '--after[Inclusive start date]:YYYY-MM-DD:'
            '--before[Inclusive end date]:YYYY-MM-DD:'
            '(--no-gps)--has-gps[Require valid GPS coordinates]'
            '(--has-gps)--no-gps[Require no valid GPS coordinates]'
            '--recursive[Include nested directories]'
            '(--json)--print0[Print NUL-separated paths]'
            '(--print0)--json[Print filters, matches, metadata, and summary]'
            '2:JPEG file or directory:_files'
        ) ;;
    check)
        specs+=(
            '--recursive[Include nested directories]'
            '--only-errors[List ERROR rows only]'
            '--json[Print structured JSON]'
            '2:JPEG file or directory:_files'
        ) ;;
    compress)
        specs+=(
            '(--target --min-quality)--quality[JPEG quality (default 80)]:quality:(60 70 75 80 85 90 95 100)'
            '(--quality)--target[Desired maximum size]:size:(500KB 1MB 2MB 5MB)'
            '(--quality)--min-quality[Minimum target quality (default 20)]:quality:(20 30 40 50)'
            '--recursive[Include nested directories]'
            '--output-dir[Destination directory]:directory:_files -/'
            '2:JPEG file or directory:_files'
        ) ;;
    contact)
        specs+=(
            '--output[Required JPEG output path]:JPEG output:_files'
            '--recursive[Include nested directories]'
            '--columns[Columns per sheet (default 4)]:columns:(2 3 4 5 6)'
            '--thumb-size[Thumbnail box size (default 240)]:pixels:(96 160 240 320 512)'
            '--quality[JPEG quality (default 85)]:quality:(60 70 75 80 85 90 95 100)'
            '--metadata[Show exposure metadata beneath each thumbnail]'
            '--sort[Sort photos by filename or capture time]:sort:(name date)'
            '2:directory:_files -/'
        ) ;;
    exif)
        specs+=('--json[Print structured JSON]' '2:JPEG or Sony ARW file:_files') ;;
    duplicates|stats)
        specs+=('--recursive[Include nested directories]' '--json[Print structured JSON]' '2:directory:_files -/') ;;
    timeline)
        specs+=(
            '--recursive[Include nested directories]'
            '--gap[Session gap (default 60m)]:duration:(30m 60m 2h)'
            '--json[Print date/session hierarchy]'
            '2:directory:_files -/'
        ) ;;
    rename)
        specs+=(
            '--format[Filename template]:template:'
            '--recursive[Include nested directories]'
            '--apply[Apply renames after preflight]'
            '2:directory:_files -/'
        ) ;;
    sort)
        specs+=(
            '--by[Grouping mode]:mode:(date session)'
            '--gap[Session gap (default 60m)]:duration:(30m 60m 2h)'
            '--recursive[Include nested directories]'
            '--apply[Apply moves after preflight]'
            '2:directory:_files -/'
        ) ;;
    focus)
        specs+=(
            '--recursive[Include nested directories]'
            '--threshold[Review cutoff (default 100)]:threshold:'
            '--only-blurry[List only scores below the threshold]'
            '--json[Print structured JSON]'
            '2:JPEG file or directory:_files'
        ) ;;
    scrub)
        specs+=(
            '--gps[Remove EXIF GPS tags]'
            '--recursive[Include nested directories]'
            '--in-place[Replace originals without a backup]'
            '2:JPEG file or directory:_files'
        ) ;;
esac

_arguments -S "${specs[@]}"
