import argparse
import os
import sys
from getpass import getpass
from pathlib import Path


def read_requirements():
    req_path = Path(__file__).resolve().parent / "requirements.txt"
    if not req_path.exists():
        return []
    lines = []
    for raw in req_path.read_text(encoding="utf-8").splitlines():
        s = raw.strip()
        if not s or s.startswith("#"):
            continue
        lines.append(s)
    return lines


def _run_bootstrap(argv):
    parser = argparse.ArgumentParser(prog="setup.py bootstrap")
    parser.add_argument(
        "--settings",
        default=os.environ.get("DJANGO_SETTINGS_MODULE", "core.settings.development"),
    )
    parser.add_argument("--noinput", action="store_true")
    parser.add_argument("--seed", action="store_true")
    parser.add_argument("--no-superuser", action="store_true")
    parser.add_argument("--username", default=os.environ.get("DJANGO_SUPERUSER_USERNAME"))
    parser.add_argument("--email", default=os.environ.get("DJANGO_SUPERUSER_EMAIL"))
    parser.add_argument("--password", default=os.environ.get("DJANGO_SUPERUSER_PASSWORD"))

    args = parser.parse_args(argv)

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", args.settings)

    import django
    from django.core.management import call_command

    django.setup()

    call_command("migrate", interactive=not args.noinput)
    call_command("bootstrap_roles")

    if not args.no_superuser:
        from django.contrib.auth import get_user_model

        User = get_user_model()
        username = args.username
        email = args.email
        password = args.password

        if not username and not args.noinput:
            username = input("Username para superusuario [admin]: ").strip() or "admin"
        if not email and not args.noinput:
            email = input("Email para superusuario [admin@example.com]: ").strip() or "admin@example.com"
        if not password and not args.noinput:
            password = getpass("Password para superusuario [12345678]: ") or "12345678"

        if username and password:
            if not User.objects.filter(username=username).exists():
                User.objects.create_superuser(username=username, email=email or "", password=password)
        elif args.noinput:
            print(
                "No se creó superusuario: define DJANGO_SUPERUSER_USERNAME y DJANGO_SUPERUSER_PASSWORD (y opcional DJANGO_SUPERUSER_EMAIL) o ejecuta sin --noinput."
            )

    seed = args.seed
    if not args.noinput and not args.seed:
        ans = input("¿Deseas cargar datos de prueba? [y/N]: ").strip().lower()
        seed = ans in {"y", "yes", "s", "si", "sí"}

    if seed:
        from apps.catalogos.models import Contrato, ContratoVariedad, Productor, Variedad, Zafra

        zafra, _ = Zafra.objects.get_or_create(
            nombre="Z 2026",
            defaults={"fecha_inicio": "2026-01-01", "fecha_fin": "2026-12-31"},
        )
        variedad, _ = Variedad.objects.get_or_create(nombre="V1")
        productor, _ = Productor.objects.get_or_create(
            rfc="ABC123456T12",
            defaults={"nombre": "Productor Demo"},
        )
        contrato, _ = Contrato.objects.get_or_create(
            zafra=zafra,
            numero_contrato="C-DEMO-1",
            defaults={
                "productor": productor,
                "activo": True,
            },
        )
        ContratoVariedad.objects.get_or_create(
            contrato=contrato,
            variedad=variedad,
            defaults={"peso_teorico": None},
        )


def _run_setup():
    from setuptools import find_packages, setup

    setup(
        name="gemso-trigo",
        version="0.1.0",
        packages=find_packages(),
        include_package_data=True,
        install_requires=read_requirements(),
    )


def main():
    if len(sys.argv) == 1:
        _run_bootstrap([])
        return

    if sys.argv[1] in {"bootstrap", "init"}:
        _run_bootstrap(sys.argv[2:])
        return

    _run_setup()


if __name__ == "__main__":
    main()
