#!/usr/bin/env python3
# cleat: {"name":"Projects","keyword":"p","icon":"folder","subtitle":"Find a project · editor, terminal and Git actions under ⌘K","version":"2.0.0","requires":["python3","git"],"examples":["p "],"configuration":{"CLEAT_PROJECTS_DIR":"Project folder","CLEAT_PROJECTS_DIRS":"Additional project folders (one per line)","CLEAT_PROJECTS_APP":"Editor name or app path"},"configurationOptions":{"CLEAT_PROJECTS_DIR":{"required":false,"defaultValue":"~/Development","type":"folder"},"CLEAT_PROJECTS_DIRS":{"required":false,"type":"folders"},"CLEAT_PROJECTS_APP":{"required":false,"type":"app"}},"emptyMessage":"No matching projects. Configure project folders in Settings → Commands.","listTimeout":10}
import json, os, pathlib, subprocess, sys, time

def main():
    if len(sys.argv) > 1 and sys.argv[1] == '--run':
        args = ['open']
        if os.environ.get('CLEAT_PROJECTS_APP'): args += ['-a', os.environ['CLEAT_PROJECTS_APP']]
        subprocess.run(args + [sys.argv[2]], check=True)
        return
    query = (sys.argv[1] if len(sys.argv) > 1 else '').casefold()
    roots = [os.environ.get('CLEAT_PROJECTS_DIR') or '~/Development'] + os.environ.get('CLEAT_PROJECTS_DIRS', '').splitlines()
    seen, rows = set(), []
    for root in filter(None, roots):
        folder = pathlib.Path(root).expanduser()
        if not folder.is_dir():
            print('Project folder unavailable: ' + str(folder), file=sys.stderr)
            continue
        for path in folder.iterdir():
            if not path.is_dir() or path.name.startswith('.') or query not in path.name.casefold(): continue
            absolute = str(path.resolve())
            if absolute in seen: continue
            seen.add(absolute)
            rows.append(path)
    metadata_deadline = time.monotonic() + 2
    for path in sorted(rows, key=lambda p: p.name.casefold())[:200]:
        branch = ''
        if (path / '.git').exists() and time.monotonic() < metadata_deadline:
            try:
                result = subprocess.run(['git','-C',str(path),'branch','--show-current'], capture_output=True,text=True,timeout=max(0.05,min(1,metadata_deadline-time.monotonic())))
                branch = result.stdout.strip() or 'Detached HEAD'
            except subprocess.TimeoutExpired: branch = 'Git details available in actions'
        print(json.dumps({'id':str(path.resolve()),'title':path.name,'subtitle':(branch + ' · ' if branch else '') + str(path.parent), 'arg':str(path.resolve()),'path':str(path.resolve()),'icon':str(path.resolve()),'actionLabel':'Open Project'}))
if __name__ == '__main__':
    try: main()
    except (OSError, subprocess.CalledProcessError) as error:
        print(str(error), file=sys.stderr); sys.exit(1)
