from flask import Blueprint, request
import logging
from datetime import datetime
from firebase.firebase import Firebase
import pytz 
import utility.function as func
from feature.utm_generator.short_link import ShortIo
import os
import json
logging.basicConfig(level=logging.INFO)

evntFunction = func.Event()
short_link = Blueprint('short_link', __name__, url_prefix='/feature/short-link')

fb = Firebase(host=os.environ.get("FIREBASE_HOST"))
timezone = pytz.timezone('Asia/Bangkok')

@short_link.route('/',  methods=['POST', 'GET', 'DELETE'])
@short_link.route('',  methods=['POST', 'GET', 'DELETE'])
def feature_short_link():
    now = datetime.now(timezone).strftime("%Y-%m-%d %H:%M:%S")
    try:
        if request.method == 'POST':
            data = request.get_json()
            for req in ['property_id','original_link']:
                if req not in data:
                    return {'message': f"{req} is require"}, 400
                
            logging.info("SH1")
            property_id = data.get("property_id")
            original_link = data.get("original_link")
            utm_sorce = data.get("utm_sorce", None)
            utm_medium = data.get("utm_medium", None)
            utm_campaign = data.get("utm_campaign", None)
            utm_content = data.get("utm_content", None)
            utm_term = data.get("utm_term", None)
            logging.info("SH2")

            short_link = ShortIo()
            logging.info("SH3")

            respond  = short_link.create_short_link(original_link, utm_sorce, utm_medium, utm_campaign, utm_term, utm_content)
            logging.info("SH4")
            logging.info(respond.content)
            if respond.status_code != 200:
                logging.info("SH5")
                return {'status': 'error', 'message': f"{respond.content}"}, 500
            logging.info("SH6")
            
            content = json.loads(respond.content)
            logging.info("SH7")

            #save in Firebase
            short_link_list = fb.db.reference().child(f"account/{property_id}/short_link").get()
            logging.info("SH8")
            short_link_list = [] if not short_link_list else short_link_list
            logging.info("SH9")
            short_link_list.append(content)
            logging.info("SH9")
            fb.db.reference().child(f"account/{property_id}/short_link").set(short_link_list)
            logging.info("SH10")
            return {
                "status": 'ok',
                "short_link": content['shortURL']
            },200
        
        elif request.method == 'GET':
            data = request.args
            for req in ['property_id']:
                if req not in data:
                    return {'message': f"{req} is required"}, 400
                
            property_id = data.get("property_id")
            short_link_list = fb.db.reference().child(f"account/{property_id}/short_link").get()
            short_link_list = [] if not short_link_list else short_link_list
            short_link_list_desc = sorted(short_link_list, key=lambda x: x['createdAt'], reverse=True)

            return {
                'status': 'ok',
                'data': short_link_list_desc
            },200
        
        elif request.method == 'DELETE':
            data = request.get_json()
            for req in ['property_id','path']:
                if req not in data:
                    return {'message': f"{req} is require"}, 400
            
            property_id = data.get("property_id")
            path = data.get("path")
            
            short_link_list = fb.db.reference().child(f"account/{property_id}/short_link").get()
            short_link_list = [] if not short_link_list else short_link_list
            newList = []
            for i in short_link_list:
                if i['path'] != path:
                    newList.append(i)
            
            return {
                'status': 'ok',
                'data': newList
            },200

        return {'status': 'error', 'message': 'Method not allowed'}, 405
    
    except Exception as e:
        logging.error(f"Content Fucn error: {e}")
        return {'status': 'error', 'message': e}, 500