import odoorpc
import logging
from django.conf import settings
from urllib.parse import urlparse

# Set up logging
logger = logging.getLogger(__name__)


class OdooAPI:
    def __init__(self):
        self.odoo = None
        self._connect()

    def _connect(self):
        """Establish connection to Odoo"""
        try:
            # Parse URL to get host
            url = settings.ODOO_CONFIG["url"]
            parsed_url = urlparse(url)
            host = parsed_url.netloc or parsed_url.path

            # Log connection attempt
            logger.info(f"Attempting to connect to Odoo at {host}")
            logger.debug(
                f"Connection parameters: HOST={host}, DB={settings.ODOO_CONFIG['db']}, "
                f"USER={settings.ODOO_CONFIG['username']}"
            )

            self.odoo = odoorpc.ODOO(host, port=443, protocol="jsonrpc+ssl")

            logger.info("Connection established, attempting login...")
            self.odoo.login(
                settings.ODOO_CONFIG["db"],
                settings.ODOO_CONFIG["username"],
                settings.ODOO_CONFIG["password"],
            )
            logger.info("Successfully logged into Odoo")

            version_info = self.odoo.version
            logger.info(f"Connected to Odoo version: {version_info}")

        except odoorpc.error.RPCError as e:
            logger.error(f"RPC Error connecting to Odoo: {str(e)}")
            logger.debug("Full RPC error details:", exc_info=True)
            raise
        except odoorpc.error.InternalError as e:
            logger.error(f"Internal Odoo error: {str(e)}")
            logger.debug("Full internal error details:", exc_info=True)
            raise
        except Exception as e:
            logger.error(f"Unexpected error connecting to Odoo: {str(e)}")
            logger.debug("Full error details:", exc_info=True)
            raise

    def create_lead(self, lead, lead_title=""):
        """Create a lead in Odoo"""
        try:
            logger.info(f"Attempting to create lead for {lead.name}")

            # Prepare lead data
            lead_data = {
                "name": "Servala" + lead_title,
                "contact_name": lead.name,
                "partner_name": (
                    lead.company if hasattr(lead, "company") and lead.company else ""
                ),
                "email_from": lead.email,
                "phone": lead.phone if hasattr(lead, "phone") and lead.phone else "",
                "description": lead.message,
                "type": "lead",
                "campaign_id": settings.ODOO_CONFIG["campaign_id"],
                "source_id": settings.ODOO_CONFIG["source_id"],
                "medium_id": settings.ODOO_CONFIG["medium_id"],
                "tag_ids": [(4, settings.ODOO_CONFIG["tag_id"])],
            }

            logger.debug(f"Prepared lead data: {lead_data}")

            # Ensure we have a valid connection
            if not self.odoo:
                logger.warning("No active Odoo connection, attempting to reconnect")
                self._connect()

            # Create the lead
            Lead = self.odoo.env["crm.lead"]
            odoo_lead_id = Lead.create(lead_data)
            logger.info(f"Successfully created lead in Odoo with ID: {odoo_lead_id}")

            return odoo_lead_id

        except odoorpc.error.RPCError as e:
            logger.error(f"RPC Error creating lead: {str(e)}")
            logger.debug("Full RPC error details:", exc_info=True)
            raise
        except Exception as e:
            logger.error(f"Unexpected error creating lead: {str(e)}")
            logger.debug("Full error details:", exc_info=True)
            raise

    def add_to_mailing_list(self, email, mailing_list_id=46):
        """Add an email to a mailing list in Odoo"""
        try:
            logger.info(
                f"Attempting to add {email} to mailing list ID {mailing_list_id}"
            )

            # Ensure we have a valid connection
            if not self.odoo:
                logger.warning("No active Odoo connection, attempting to reconnect")
                self._connect()

            # Add contact to mailing list
            MailingContact = self.odoo.env["mailing.contact"]
            existing_mailing_contacts = MailingContact.search([("email", "=", email)])

            if existing_mailing_contacts:
                mailing_contact_id = existing_mailing_contacts[0]

                # Check if already in this list
                MailingContactList = self.odoo.env["mailing.contact.subscription"]
                existing_subscriptions = MailingContactList.search(
                    [
                        ("contact_id", "=", mailing_contact_id),
                        ("list_id", "=", mailing_list_id),
                    ]
                )

                if not existing_subscriptions:
                    # Add to this specific list
                    MailingContactList.create(
                        {
                            "contact_id": mailing_contact_id,
                            "list_id": mailing_list_id,
                            "opt_out": False,
                        }
                    )
            else:
                # Create new mailing contact and subscription
                mailing_contact_id = MailingContact.create(
                    {
                        "name": email.split("@")[0],
                        "email": email,
                    }
                )

                MailingContactList = self.odoo.env["mailing.contact.subscription"]
                MailingContactList.create(
                    {
                        "contact_id": mailing_contact_id,
                        "list_id": mailing_list_id,
                        "opt_out": False,
                    }
                )

            logger.info(f"Successfully added {email} to mailing list")
            return True

        except odoorpc.error.RPCError as e:
            logger.error(f"RPC Error adding to mailing list: {str(e)}")
            logger.debug("Full RPC error details:", exc_info=True)
            return False
        except Exception as e:
            logger.error(f"Unexpected error adding to mailing list: {str(e)}")
            logger.debug("Full error details:", exc_info=True)
            return False
