"""Inspect and safely address installer files managed by this admin server."""
from pathlib import Path
from urllib.parse import unquote, urlsplit


def installer_path(directory, filename):
    name = str(filename or '')
    if (not name or name != Path(name).name or '/' in name or '\\' in name or
            ':' in name or not name.lower().endswith('.exe')):
        raise ValueError('Invalid setup filename.')
    root = Path(directory).resolve()
    candidate = root / name
    if candidate.is_symlink() or candidate.resolve().parent != root:
        raise ValueError('Setup must be inside this server’s upload storage.')
    return candidate


def managed_release_filename(release, base_urls):
    if not isinstance(release, dict):
        return ''
    if release.get('uploaded_filename'):
        return str(release['uploaded_filename'])
    try:
        parsed = urlsplit(str(release.get('url') or ''))
        for base_url in base_urls:
            base = urlsplit(str(base_url or '').rstrip('/'))
            prefix = base.path.rstrip('/') + '/downloads/'
            if (base.netloc and parsed.scheme == base.scheme and parsed.netloc == base.netloc
                    and parsed.path.startswith(prefix)):
                return unquote(parsed.path[len(prefix):])
    except ValueError:
        pass
    return ''


def release_storage_state(release, directory, base_urls):
    name = managed_release_filename(release, base_urls)
    files = []
    error = ''
    try:
        for path in Path(directory).glob('*.exe'):
            try:
                safe = installer_path(directory, path.name)
                if safe.is_file():
                    stat = safe.stat()
                    files.append({'name': path.name, 'size_mb': round(stat.st_size / 1048576, 2),
                                  'size_bytes': stat.st_size, 'current': path.name == name})
            except (OSError, ValueError):
                continue
    except OSError:
        error = 'Could not read setup storage. Check server permissions.'
    files.sort(key=lambda row: (not row['current'], row['name']))
    state = 'empty'
    if name:
        try:
            path = installer_path(directory, name)
            state = 'uploaded' if path.is_file() else 'missing'
        except (ValueError, OSError):
            state = 'missing'
            name = ''
    elif isinstance(release, dict) and release.get('url'):
        state = 'external'
    return {'state': state, 'filename': name, 'files': files, 'error': error}
