# services/erp_client.py

import os
import requests
from django.conf import settings
from datetime import datetime, timedelta
from django.core.cache import cache
from django.utils.timezone import now


class OdooAPIService:
    def __init__(self):
        # self.base_url = settings.ERP_BASE_URL
        # self.auth_url = settings.ERP_AUTH_URL
        # self.client_id = settings.ERP_CLIENT_ID
        # self.client_secret = settings.ERP_CLIENT_SECRET

        # self.base_url = 'https://odoo-test.pvs.be:8019/api/v2'
        # self.auth_url = 'https://odoo-test.pvs.be:8019/api/v2/odoo/oauth2/user_authentication'
        # self.client_id = 'bjobYQAgUfaNaXot7i9z6EsbqEJQFB0jFS03dau6'
        # self.client_secret = 'Zpiknzy5V1B0yQY1Cs50PPTABdIxFK54puMTSjWf'
        # self.grant_type = 'password'
        # self.username = 'admin'
        # self.password = 'Pvsadmin@26'


        # self.base_url = 'https://odoo.pvs.be:9000/api/v2'
        # self.auth_url = 'https://odoo.pvs.be:9000/api/v2/odoo/oauth2/user_authentication'
        # self.client_id = 'HC95T7UAcqJYRfuPq4zR7ty6Uwa5JJ7XCz2ynTRz'
        # self.client_secret = 'wGPyfQHCXS1penqX9uBvLYrGd14VOSgLXBCib3oL'
        # self.grant_type = 'password'
        # self.username = 'pvs_admin@142'
        # self.password = 'pvs@tycan2890'

        self.base_url = settings.ERP_BASE_URL
        self.auth_url = settings.ERP_AUTH_URL
        self.client_id = settings.ERP_CLIENT_ID
        self.client_secret = settings.ERP_CLIENT_SECRET
        self.grant_type = settings.ERP_GRANT_TYPE
        self.username = settings.ERP_USERNAME
        self.password = settings.ERP_PASSWORD
        


        self.token = None
        self.token_expiry = None
        self.company_id = None

    # ------------------------
    # GET TOKEN
    # ------------------------
    def get_token(self):
        # cache_key = f"odoo_token_{self.client_id}"

        # ✅ 1. Check cache
        # token = cache.get(cache_key)
        # if token:
        #     return token

        # ✅ 2. Prepare payload
        payload = {
            "client_id": self.client_id,
            "client_secret": self.client_secret,
            "grant_type": self.grant_type,
            "username": self.username,
            "password": self.password,
        }

        headers = {
            "Content-Type": "application/x-www-form-urlencoded",
            "Accept": "application/json"
        }

        # try:
        # ✅ 3. Call auth API
        response = requests.post(
            self.auth_url,
            data=payload,
            headers=headers,
            timeout=10
        )

        response.raise_for_status()

        data = response.json()

        token = data.get("access_token")
        expires_in = data.get("expires_in", 3600)

        if not token:
            raise Exception("Token not found in response")

        # ✅ 4. Cache token
        # cache.set(cache_key, token, timeout=expires_in - 60)

        # ✅ 5. Optional tracking
        self.token_expiry = now() + timedelta(seconds=expires_in - 60)

        
        self.company_id = data.get("data", {}).get("user_company_id")

        return token

        # except requests.exceptions.RequestException as e:
        #     raise Exception(f"Odoo Auth Failed: {str(e)}")

    # ------------------------
    # COMMON REQUEST METHOD
    # ------------------------
    def request(self, method, endpoint, data=None, params={ModuleNotFoundError}):
        token = self.get_token()
        
        if params is None:
            params = {}
        params['company_id'] = self.company_id

        headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json"
        }

        url = f"{self.base_url}{endpoint}"

        response = requests.request(
            method=method,
            url=url,
            json=data,
            params=params,
            headers=headers
        )

        if response.status_code >= 400:
            raise Exception(f"ERP API Error: {response.text}")

        return response.json()

    # ------------------------
    # EXAMPLE API CALLS
    # ------------------------
    def get_price_list(self, params=None):

        response = self.request(
            "GET",
            "/get/pvs_quarterly_pricelist/get_customer_price_list", 
            params=params
            )
        return response

    def get_customer_requirements(self, params=None):

        response = self.request(
            "GET",
            "/get/pvs_instruction_master/get_instruction_master_list", 
            params=params
            )
        
        return response
    
    def get_price_from_quantity(self, params=None):

        response = self.request(
            "GET",
            "/get/pvs_quarterly_pricelist/check_price_validation", 
            params=params
            )
        
        return response
    
    def get_package_master_data(self, params=None):
        response = self.request(
            "GET",
            "/get/package_uom/get_package_list?Search", 
            params=params
            )
        
        return response
    