import json
import sys
import mysql.connector

sys.path.insert(0, "./include")
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from fastapi import FastAPI, HTTPException, Security
from fastapi.security import APIKeyHeader
from config import connect

from fastapi.openapi.docs import get_swagger_ui_html
from fastapi.openapi.utils import get_openapi

import secrets

from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials

app = FastAPI(docs_url=None, redoc_url=None, openapi_url = None)
#app=FastAPI(title="FastAPI",version="0.1.0")
security = HTTPBasic()
api_key_header = APIKeyHeader(name="X-API-Key")
def get_api_key(api_key_header: str = Security(api_key_header)) -> str:
    if api_key_header in api_keys:
        return api_key_header
    raise HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Invalid or missing API Key",
    )
@app.get("/protected")
def protected_route(api_key: str = Security(get_api_key)):
    # Process the request for authenticated users
    return {"message": "Access granted!"}
def get_current_username(credentials: HTTPBasicCredentials = Depends(security)):
    correct_username = secrets.compare_digest(credentials.username, "user")
    correct_password = secrets.compare_digest(credentials.password, "password")
    if not (correct_username and correct_password):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Incorrect email or password",
            headers={"WWW-Authenticate": "Basic"},
        )
    return credentials.username


@app.get("/docs")
async def get_documentation(username: str = Depends(get_current_username)):
    return get_swagger_ui_html(openapi_url="/openapi.json", title="docs")


@app.get("/openapi.json")
async def openapi(username: str = Depends(get_current_username)):
    return get_openapi(title = "Flag api", version="0.1.0", routes=app.routes)






class create_dict(dict):
    # __init__ function


    def __init__(self):
        self = dict()
    # Function to add key:value
    def add(self, key, value):
        self[key] = value

@app.get("/list_box")
async def read_item():
	conn = connect()
	cursor = conn.cursor()
	query = "SELECT id,mat FROM flag.flag;"
	cursor.execute(query)
	columns = [column[0] for column in cursor.description]
	data = [dict(zip(columns, row)) for row  in cursor.fetchall()]
	#result =cursor.fetchall()
	conn.close()
	return  JSONResponse(content=data, media_type="application/json")
#return json.loads(data)

@app.get("/lock_box_space")
async def read_item(mat: str, company: str,date: str, fascia: str,nr:str):
	conn = connect()
	cursor = conn.cursor()
	query = "SELECT flag.lock_box_space("+mat+","+company+","+date+","+fascia+","+nr+")as id;"
	cursor.execute(query)
	columns = [column[0] for column in cursor.description]
	data = [dict(zip(columns, row)) for row  in cursor.fetchall()]
	conn.commit()
	#result =cursor.fetchall()
	conn.close()
	return  JSONResponse(content=data, media_type="application/json")

@app.get("/book_box_space")
async def read_item(id: str):
        conn = connect()
        cursor = conn.cursor()
        query = "SELECT flag.book_box_space("+id+")as QR consegna;"
        cursor.execute(query)
        columns = [column[0] for column in cursor.description]
        data = [dict(zip(columns, row)) for row  in cursor.fetchall()]
        conn.commit()
        #result =cursor.fetchall()
        conn.close()
        return  JSONResponse(content=data, media_type="application/json")
