import logging

from django.urls import reverse

from market.services.messaging import send_market_email


logger = logging.getLogger(__name__)


def _user_label(user):
    if not user:
        return "Bomabest Soko user"
    return user.get_full_name() or user.email or user.phone_number or "Bomabest Soko user"


def _recipient_email(user):
    return (getattr(user, "email", "") or "").strip()


def _safe_company_email(*, subject, message, user=None, email="", cta_url="", cta_text="Open Bomabest Soko"):
    recipient = (email or _recipient_email(user)).strip()
    if not recipient:
        return False
    try:
        send_market_email(
            subject=subject,
            message=message,
            recipients=[recipient],
            cta_text=cta_text,
            cta_url=cta_url or reverse("market:login"),
        )
        return True
    except Exception:
        logger.warning("Company notification email failed. subject=%s recipient=%s", subject, recipient, exc_info=True)
        return False


def notify_company_member_added(*, company, member, actor=None, temporary_password=""):
    user = member.user
    password_line = ""
    if temporary_password:
        password_line = (
            f"\nTemporary password: {temporary_password}\n"
            "Please sign in and change this password before continuing."
        )
    return _safe_company_email(
        subject=f"Bomabest Soko: added to {company.display_name}",
        user=user,
        message=(
            f"Hello {_user_label(user)},\n\n"
            f"You have been added to {company.display_name} on Bomabest Soko as {member.get_member_role_display()}.\n"
            f"Added by: {_user_label(actor) if actor else 'Bomabest Soko'}."
            f"{password_line}\n\n"
            "Use the app or website to open your company workspace."
        ),
    )


def notify_company_member_role_changed(*, company, member, old_role="", actor=None):
    return _safe_company_email(
        subject=f"Bomabest Soko: role updated at {company.display_name}",
        user=member.user,
        message=(
            f"Hello {_user_label(member.user)},\n\n"
            f"Your Bomabest Soko role at {company.display_name} changed from {old_role or 'previous role'} "
            f"to {member.get_member_role_display()}.\n"
            f"Updated by: {_user_label(actor) if actor else 'Bomabest Soko'}."
        ),
    )


def notify_company_member_status_changed(*, company, member, is_active, actor=None):
    state = "reactivated" if is_active else "deactivated"
    return _safe_company_email(
        subject=f"Bomabest Soko: company access {state}",
        user=member.user,
        message=(
            f"Hello {_user_label(member.user)},\n\n"
            f"Your company access for {company.display_name} has been {state} on Bomabest Soko.\n"
            f"Updated by: {_user_label(actor) if actor else 'Bomabest Soko'}."
        ),
    )


def notify_company_status_changed(*, company, status_label="", actor=None):
    return _safe_company_email(
        subject=f"Bomabest Soko: {company.display_name} status updated",
        email=company.contact_email,
        message=(
            f"Hello {company.display_name},\n\n"
            f"Your company profile status on Bomabest Soko is now {status_label or company.get_status_display()}.\n"
            f"Updated by: {_user_label(actor) if actor else 'Bomabest Soko'}."
        ),
    )


def notify_company_product_submitted(*, company, product, actor=None):
    return _safe_company_email(
        subject=f"Bomabest Soko: product submitted for review",
        email=company.contact_email,
        message=(
            f"{product.name} has been submitted for Bomabest Soko marketplace review.\n"
            f"Company: {company.display_name}\n"
            f"Submitted by: {_user_label(actor) if actor else 'Bomabest Soko'}."
        ),
    )


def notify_company_rfq_event(*, rfq, event_label, actor=None, target_user=None):
    user = target_user or rfq.assigned_to or rfq.buyer
    return _safe_company_email(
        subject=f"Bomabest Soko: RFQ {event_label}",
        user=user,
        message=(
            f"Hello {_user_label(user)},\n\n"
            f"RFQ update for {rfq.product.name} at {rfq.company.display_name}: {event_label}.\n"
            f"Updated by: {_user_label(actor) if actor else 'Bomabest Soko'}."
        ),
    )
