import json
import os
from flask import Flask, request, jsonify, send_from_directory

app = Flask(__name__)

# Language alias mapping
LANG_ALIAS = {
    "zh": "zh-CN",
    "zh-cn": "zh-CN",
    "zh-hans": "zh-CN",
    "zht": "zh-TW",
    "zh-tw": "zh-TW",
    "zh-hant": "zh-TW"
}

# Normalize language codes
def normalize_lang(lang):
    lang = lang.lower()
    return LANG_ALIAS.get(lang, lang)

# 1. LOAD AND RESTRUCTURE DATA
# We create a dictionary where the key is the lowercase city name
# Structure: { "dubai": { "en": {...}, "ar": {...} }, "reno": { ... } }
city_map = {}

try:
    with open('AllCitiesTranslated.json', 'r', encoding='utf-8') as f:
        raw_data = json.load(f)
        for entry in raw_data:
            if "city" in entry:
                # Store using lowercase key for case-insensitive O(1) lookup
                city_map[entry["city"].lower()] = entry
    print(f"Indexed {len(city_map)} cities successfully.")
except Exception as e:
    print(f"Error loading JSON: {e}")

# 2. API ROUTE
@app.route('/city_translation', methods=['GET'])
def get_translation():

    city_name = request.args.get('city')
    lang_param = request.args.get('lang')

    if not city_name:
        return jsonify({"error": "Missing 'city' param"}), 400

    city_entry = city_map.get(city_name.lower())

    if not city_entry:
        return jsonify({"error": "City not found"}), 404

    city_original = city_entry["city"]

    # Remove city key from language dictionary
    lang_data = {k: v for k, v in city_entry.items() if k != "city"}

    # CASE 1: No lang passed → return all translations
    if not lang_param:

        translations = {
            lang: data.get("text", "")
            for lang, data in lang_data.items()
        }

        return jsonify({
            "city": city_original,
            "translation": translations
        })

    # CASE 2: lang is array (comma separated)
    if "," in lang_param:

        translations = {}
        
        for req_lang in [l.strip() for l in lang_param.split(",")]:
            
            normalized = normalize_lang(req_lang)

            if normalized in city_entry:
                translations[req_lang] = city_entry[normalized].get("text")

        return jsonify({
            "city": city_original,
            "translation": translations
        })

    # CASE 3: single language request
    lang_code = normalize_lang(lang_param)

    result = city_entry.get(lang_code) or city_entry.get("en")

    return jsonify({
        "city": city_original,
        "translation": result.get("text") if result else "N/A"
    })

# 3. THE FILE SERVER
@app.route('/')
@app.route('/<path:path>')
def serve_files(path=''):
    directory = os.getcwd()
    target_path = os.path.join(directory, path)
    
    if path == '' or os.path.isdir(target_path):
        try:
            files = os.listdir(target_path)
            links = "".join([f'<li><a href="/{os.path.join(path, f)}">{f}</a></li>' for f in files])
            return f"<h3>Directory listing for /{path}</h3><ul>{links}</ul>"
        except Exception as e:
            return str(e), 403
    
    return send_from_directory(directory, path)

if __name__ == '__main__':
    # Using threaded=True helps Flask handle those rapid-fire requests better
    print("Optimized Server starting on port 10005...")
    app.run(host='0.0.0.0', port=10005, threaded=True)
