# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========

import base64

from mirage.accessor.github import GitHubAccessor
from mirage.cache.index import IndexCacheStore, LookupStatus
from mirage.core.github._client import github_get
from mirage.core.github.config import GitHubConfig
from mirage.types import PathSpec


async def read_bytes(config: GitHubConfig, owner: str, repo: str,
                     sha: str) -> bytes:
    data = await github_get(
        config.token,
        "/repos/{owner}/{repo}/git/blobs/{sha}",
        owner=owner,
        repo=repo,
        sha=sha,
    )
    return base64.b64decode(data["content"])


async def read(
    accessor: GitHubAccessor,
    path: PathSpec,
    index: IndexCacheStore = None,
) -> bytes:
    if isinstance(path, str):
        path = PathSpec(original=path, directory=path)
    if isinstance(path, PathSpec):
        prefix = path.prefix
        path = path.original

    if prefix and path.startswith(prefix):
        path = path[len(prefix):] or "/"
    key = "/" + path.strip("/")
    if index is None:
        raise FileNotFoundError(path)
    result = await index.get(key)
    if result.status == LookupStatus.NOT_FOUND or result.entry is None:
        raise FileNotFoundError(path)
    if result.entry.resource_type == "folder":
        raise IsADirectoryError(path)
    return await read_bytes(accessor.config, accessor.owner, accessor.repo,
                            result.entry.id)
