from pathlib import Path

import jwt
import boto3

from .rfile import RFile
from .io_s3 import IOS3
from .io_fs import IOFS


class RDisk:
    def __init__(self, token, uri, jwt_key, is_obj_api=False, is_admin=False, login=None, config=None):
        self.uri = uri
        
        # API для CmfAttachments
        self.is_obj_api = is_obj_api
        # Прозрачная передача флага режима администратора
        self.is_admin = is_admin

        if token and login:
            raise Exception('Несовместимые опции: token и login')

        # TODO2: токен все еще работает в webdav, хотя он там уже неполноценный, т.к. мы scope подрезали
        # так что мб в будущем переделать код на проверку login, вместо token. Token использовать только для получения
        # login
        if token:
            self.token = jwt.decode(token, jwt_key, algorithms=['RS256', 'HS256'])
            self.login = None
        else:
            self.token = None
            self.login = login
        
        if self.uri.startswith("s3://"):
            conn = boto3.client(
                's3', 
                endpoint_url=config["endpoint_url"],
                aws_access_key_id=config["aws_access_key_id"],
                aws_secret_access_key=config["aws_secret_access_key"],
                aws_session_token=None,
                config=boto3.session.Config(signature_version='s3v4'),
                verify=False
            )
            self.io = IOS3(conn, config["bucket_name"])
            self.base_path = self.uri.split("s3://")[1]
        else:
            self.io = IOFS()
            self.base_path = self.uri.split("file://")[1]

        self.root = self.get_rfile("/")

    def create_rfile_from_template(self, dirname, filename):
        ext = filename.split('.')[-1]
        template = Path(__file__).parent / "templates" / f"template.{ext}"
        if not template.exists():
            raise ValueError(f"Нет шаблона для {ext}")
        dir = self.get_rfile(dirname)
        child = dir.add_child(filename, False)
        child.write(template.read_bytes())
        return child

    def get_rfile(self, id):
        return RFile(id=id, _rdisk=self)

    def get_rfile_by_path(self, path: str):
        id = path.split(self.base_path)[1]
        if not id.startswith("/"):
            id = "/" + id
        return RFile(id=id, _rdisk=self)
