from flask import Blueprint, request
import logging
import uuid
import pytz
import os
from firebase.firebase import Firebase
from datetime import datetime
from utility.function import Function
from utility.token import Token
from flasgger import swag_from
logging.basicConfig(level=logging.INFO)

user = Blueprint('user', __name__, url_prefix='/user')
fb = Firebase(host=os.environ.get("FIREBASE_HOST"))

@user.route('/register', methods=['POST'])
@swag_from('/app/swagger_docs/user_register.yml')
def user_func():
    if request.method == 'POST':
        data = request.get_json()
        for req in ['email', 'password']:
            if req not in data:
                return {'message': f"{req} is require for user added"}, 400
            
        #Gen ID
        id = Function.text_to_numeric_token(data.get('email'))
        data['role'] = 'user'
        data['user_id'] = id
        fb.db.reference().child(f'users/{id}').set(data)

        token = Token()
        user = token.register(user_id=id)
        user['status'] = 'ok'
        user['message'] = 'Success'
        return user, 200
    
    return {'message': 'Method not allowed'}, 405

@user.route('/login', methods=['POST'])
@swag_from('/app/swagger_docs/user_login.yml')
def user_login():
    data = request.get_json()
    for req in ['email', 'password']:
        if req not in data:
            return {'message': f"{req} is require for user added"}, 400
        
    email = data.get("email", None)
    password = data.get("password", None)
        
    token = Token()
    data, code = token.login(email, password)
    
    if code != 200:
        return data, code
    
    data['status'] = 'ok'
    data['message'] = 'Success'
    
    return data, code

@user.route('/refresh', methods=['POST'])
@swag_from('/app/swagger_docs/user_refresh.yml')
def user_refresh_token():
    if request.method == 'POST':
        local_keyB = request.headers.get('Authorization')
        bearerB = local_keyB.replace("Bearer ", "")
        
        token = Token()
        data = token.new_access_token(bearerB)
        if data:
            data['status'] = 'ok'
            return data, 200
        return {'status': "error", "message": "internal server error"},500


@user.route('/property', methods=['POST', 'GET', 'PUT', 'DELETE'])
def user_property():
    user_id = Function.getUserID(request)
    if request.method == 'POST':
        data = request.get_json()
        for req in ['property_id','features']:
            if req not in data:
                return {"status":"error",'message': f"{req} is require for user property added"}, 400
            
        property_id = data.get("property_id")
        features = data.get("features")

        #Add property
        job = fb.db.reference().child(f"""users/{user_id}/property/{property_id}/features""").set(features)

        return {"status":"ok",'message': 'Success'}, 200
    
    elif request.method == 'GET':
        property_id = request.args.get('property_id')
        if not property_id:
            return {"status":"error",'message': 'property_id is required'}, 400
        
        if property_id != 'all':
            data = []
            property_details = {
                "property_id" : property_id,
                "property_name" : fb.get_by_child(f"property/{property_id}/name")
            }
            data.append(property_details)
            if data:
                return {'message': 'Success', 'data': data}, 200
            return {"status":"error",'message': 'Not found'},404
        else:
            data = []
            property_list = fb.get_by_child(child=f"users/{user_id}/property/")
            property_id_list = list(property_list.keys())
            
            for property_id in property_id_list:
                property_details = {
                    "property_id" : property_id,
                    "property_name" : fb.get_by_child(f"property/{property_id}/name")
                }
                data.append(property_details)
            if data:
                return {"status":"ok",'message': 'Success', 'data': data}, 200
            
        return {"status":"error",'message': 'Not found'},404
    
    return {"status":"error",'message': 'Method not allowed'}, 405

@user.route('/channel', methods=['POST', 'GET', 'PUT', 'DELETE'])
def user_channel():
    user_id = Function.getUserID(request)
    if request.method == 'POST':
        data = request.get_json()
        for req in ['property_id','channel_id', 'role']:
            if req not in data:
                return {"status":"error",'message': f"{req} is require for user channel added"}, 400
            
        property_id = data.get("property_id")
        channel_id = data.get("channel_id")
        role = data.get("role")

        #Add property
        job = fb.db.reference().child(f"""users/{user_id}/property/{property_id}/channel/{channel_id}/role""").set(role)

        return {"status":"ok",'message': 'Success'}, 200
    
    elif request.method == 'GET':
        channel_id = request.args.get('channel_id')
        if not channel_id:
            return {"status":"error",'message': 'channel_id is required'}, 400
        
        if channel_id != 'all':
            data = fb.get_by_child(child=f"users/{user_id}/channel/{channel_id}")
            if data:
                return {"status":"ok",'message': 'Success', 'data': [data]}, 200
            return {"status":"error",'message': 'Not found'},404
        else:
            data = fb.get_by_child(child=f"users/{user_id}/channel")
            if data:
                return {"status":"ok",'message': 'Success', 'data': [data]}, 200
            
        return {"status":"error",'message': 'Not found'},404
    
    return {"status":"error",'message': 'Method not allowed'}, 405