"""명시 task mount에서 실제 snapshot 최대3개만 수집하는 개발용 경계."""
import json
import os
from pathlib import Path
import stat
import time


class MetadataSamples:
    def __init__(self, root):
        self.root = Path(root)
        if (not self.root.is_absolute() or self.root.is_symlink() or not self.root.is_dir()
                or stat.S_IMODE(self.root.stat().st_mode) != 0o700):
            raise ValueError('Private metadata sample directory is required.')
        self.attempts = 0
        self.error = None
        self.started = time.monotonic()

    def enabled(self):
        return (self.attempts < 3 and time.monotonic() - self.started <= 60
                and (self.root / 'capture.enabled').is_file())

    @classmethod
    def from_environment(cls):
        root = os.environ.get('CONTEXTRA_METADATA_SAMPLES_DIR')
        return cls(root) if root else None

    def capture(self, snapshot):
        if not self.enabled():
            return
        # 첫 Frame은 빈 결과도 수집, 이후는 유효 표시 후보가 있을 때만 수집한다.
        if self.attempts and not any(o['visible'] for o in snapshot['objects']):
            return
        payload = json.dumps(snapshot, ensure_ascii=False, allow_nan=False).encode()
        if len(payload) > 128 * 1024:
            self.error = 'SAMPLE_TOO_LARGE'
            return
        while self.attempts < 3:
            self.attempts += 1
            target = self.root / f'sample-{self.attempts}.json'
            try:
                fd = os.open(target, os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_NOFOLLOW, 0o600)
                with os.fdopen(fd, 'wb') as handle:
                    handle.write(payload)
                return
            except FileExistsError:
                continue
            except OSError:
                self.error = 'SAMPLE_WRITE_FAILED'
                return
