import os

from flask import Flask, jsonify, request
from flask_cors import CORS

from .detector import (
    build_loader,
    parse_instagram_input,
    resolve_media,
    resolve_profile,
)


def create_app() -> Flask:
    app = Flask(__name__)
    CORS(app)

    loader = build_loader()
    username = os.getenv("INSTALOAD_USERNAME")
    password = os.getenv("INSTALOAD_PASSWORD")
    if username and password:
        loader.login(username, password)

    @app.get("/health")
    def health() -> tuple[dict, int]:
        return {"ok": True}, 200

    @app.post("/api/instagram/resolve")
    def resolve() -> tuple[dict, int]:
        payload = request.get_json(silent=True) or {}
        url = str(payload.get("url", "")).strip()
        if not url:
            return {"error": "url is required"}, 400

        parsed = parse_instagram_input(url)
        if parsed.input_type == "video_url":
            return jsonify(
                {
                    "input_type": "video_url",
                    "original_url": url,
                    "media_type": "video",
                    "media_url": url,
                }
            ), 200

        if parsed.input_type in {"reel", "p", "tv"} and parsed.shortcode:
            data = resolve_media(loader, parsed.shortcode)
            response_type = "post" if parsed.input_type == "p" else parsed.input_type
            return jsonify(
                {
                    "input_type": response_type,
                    "original_url": url,
                    "data": data,
                }
            ), 200

        if parsed.input_type == "profile" and parsed.username:
            data = resolve_profile(loader, parsed.username)
            return jsonify(
                {
                    "input_type": "profile",
                    "original_url": url,
                    "data": data,
                }
            ), 200

        return {"error": "Unsupported Instagram URL"}, 400

    @app.errorhandler(Exception)
    def on_error(err: Exception):
        return jsonify({"error": str(err)}), 500

    return app


def main() -> None:
    app = create_app()
    host = os.getenv("HOST", "0.0.0.0")
    port = int(os.getenv("PORT", "5000"))
    debug = os.getenv("DEBUG", "false").lower() == "true"
    app.run(host=host, port=port, debug=debug)


if __name__ == "__main__":
    main()
