from flask import Flask, request, jsonify
import os
import face_recognition
import tempfile

app = Flask(__name__)

@app.route("/")
def helloWorld():
    return "hello world"

@app.route('/compare_faces', methods=['POST'])
def compare_two_images():
    # load image
    image_1 = face_recognition.load_image_file(request.files['image_1']) 
    image_2 = face_recognition.load_image_file(request.files['image_2']) 

    # deteksi wajah
    # face_image_1 = face_recognition.face_locations(image_1)
    # face_image_2 = face_recognition.face_locations(image_2)

    # encoding image agar bisa di lakukan komparasi
    image_1_encodings = face_recognition.face_encodings(image_1)[0]
    image_2_encodings = face_recognition.face_encodings(image_2)[0]

    # compare image
    result = face_recognition.compare_faces([image_1_encodings], image_2_encodings)
    print(result)

    return response_formater(200, 'success', [])

@app.route('/face_detection', methods=['POST'])
def face_detection():
    user_id = request.form['user_id']
    is_login = request.form['is_login']
    image_file = request.files['image']

    if is_login.lower() == 'false':
        # proses registrasi / penyimpanan foto
        dir = 'image/users'
        os.makedirs(dir, exist_ok=True)
        file_extension = os.path.splitext(image_file.filename)[-1]
        image_name = f"{user_id}{file_extension}"
        image_path = os.path.join("image", "users", image_name)
        image_file.save(image_path)
        return response_formater(200,"Registered, image saved successfully.",[] ) 

    else:
        # proses login / pengecekan foto
        identified_user = identifikasi_user(image_file, user_id)
        return identified_user

def identifikasi_user(image_file, user_id):
    known_faces_dir = 'image/users'
    with tempfile.NamedTemporaryFile(delete=False, suffix='.jpg') as tmpfile:
        image_file.save(tmpfile.name)
        image_to_check = face_recognition.load_image_file(tmpfile.name)
    known_faces = []

    for file_name in os.listdir(known_faces_dir):
        name, ext = os.path.splitext(file_name)
        # Mencari nama gambar wajah yang sesuai dengan user_id
        if name == user_id:
            file_path = os.path.join(known_faces_dir, file_name)
            known_image = face_recognition.load_image_file(file_path)
            known_faces.append((face_recognition.face_encodings(known_image)[0], file_name))
    
    if not known_faces:
        message = "Tidak ada foto yang cocok dengan user ID anda, silakan registrasikan foto Anda terlebih dahulu."
        return response_formater(404, message, []) 

    image_to_check_encoding = face_recognition.face_encodings(image_to_check)[0]
    matched_files = []

    for known_face, file_name in known_faces:
        is_match = face_recognition.compare_faces([known_face], image_to_check_encoding)
        if is_match[0]:
            matched_files.append(file_name)

    if matched_files:
        return response_formater(200, "berhasil di identifikasi", matched_files)
    else:
        return response_formater(400, "gagal identifikasi", [])


def response_formater(status_code, message, data):
    response = {
        'status_code': status_code,
        'message': message,
        'data': data
    }
    return jsonify(response)
