from urllib.parse import urlparse
from db.query import QueryExecution
from helper_functions import set_data
from logger_module.package_logger import print_log

class VendorAuthenticationSchema:
    def auth(self, request, host_name):
        try:
            api_key = request.headers.get('key')
            api_secret = request.headers.get('secret')
            
            if not api_key or not api_secret:
                return False, {"error": "Missing vendor credentials", "status_code": 401, "application/json": {"error": "Missing vendor credentials"}}
                
            vendor_query = """
                SELECT c.vendor_id, c.merchant_id, v.name, v.type, v.partner_id
                FROM vendor_api_credentials c 
                JOIN vendor v ON c.vendor_id = v.id 
                WHERE c.key = %s AND c.secret = %s AND c.status = 1
            """
            vendor_params = (api_key, api_secret)
            status, vendor_result = QueryExecution.fetch_result(vendor_query, vendor_params)
            
            if status and vendor_result:
                print_log("Vendor Authorization success")
                return True, self.get_vendor_details(vendor_result, host_name, request)
            else:
                return False, {"error": "Invalid vendor credentials", "status_code": 401, "application/json": {"error": "Invalid vendor credentials"}}
                
        except Exception as ex:
            print_log(f"Vendor auth error: {str(ex)}")
            return False, {"error": "Internal server error during vendor authentication", "status_code": 500, "application/json": {"error": "Internal server error"}}

    def get_vendor_details(self, data, domain, request):
        url = request.url
        parsed_url = urlparse(url)
        endpoint = parsed_url.path
        method = request.method
        self.request_prep(request, method)
        
        if data:
            vendor_id = data.get('vendor_id')
            merchant_id = data.get('merchant_id') or vendor_id
            vendor_name = data.get('name', 'vendor')
            vendor_type = data.get('type')
            partner_id = data.get('partner_id')

            if vendor_type == 'partner' and partner_id:
                partner_query = "SELECT name FROM partners WHERE id = %s"
                status, partner_result = QueryExecution.fetch_result(partner_query, (partner_id,))
                if status and partner_result:
                    vendor_name = partner_result.get('name')
            
            set_data('vendor_details', data)
            
            # Mock merchant_details to satisfy JSON schema references like $merchant_details.id
            merchant_details = {
                'id': merchant_id,
                'merchant_name': vendor_name,
                'category_id': 'default'
            }
            set_data('merchant_details', merchant_details)

            # In the future, this is where you can dynamically load JSON based on vendor id/name
            return {
                'merchant_id': merchant_id, # Kept so main.py doesn't break
                'merchant_name': vendor_name, # Added so main.py doesn't break on .split()
                'vendor_id': vendor_id, 
                'vendor_name': vendor_name,
                'category_id': 'default', 
                'domain': domain, 
                'endpoint': endpoint, 
                'method': method.lower()
            }
        return {'domain': domain, 'endpoint': endpoint, 'method': method.lower(), 'source': request.headers.get('source')}

    @staticmethod
    def request_prep(request, method):
        if method == 'GET':
            args = request.args
            keys = args.keys()
            request_body = {}
            for i in keys:
                req_b = {i: args.get(i)}
                request_body.update(req_b)
            request.get_json = request_body
        else:
            request.get_json = request.get_json()
        set_data('request', request.get_json)
