import requests
import json
import hmac
import hashlib
import time
import logging
import os

from dotenv import load_dotenv
from datetime import datetime, timezone, timedelta

from models.integration_model import IntegrationHistory

load_dotenv()


class LalamoveService:
    def __init__(self, pipefy_data):
        self.url = "https://rest.lalamove.com/v3/quotations"
        self.api_key = os.getenv("LALAMOVE_API_KEY")
        self.api_secret = os.getenv("LALAMOVE_API_SECRET")
        self.timestamp = str(int(time.time() * 1000))

        future_time = (
            datetime.now(timezone.utc) + timedelta(hours=3) + timedelta(minutes=5)
        )
        self.schedule_at = future_time.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
        self.service_type = next(
            (
                field.get("value")
                for field in pipefy_data["fields"]
                if field.get("name") == "TIPO VEÍCULO"
            ),
            "CARFOURH",
        )
        self.stop_1_address = next(
            (
                field.get("value")
                for field in pipefy_data["fields"]
                if field.get("name") == "ENDEREÇO DA COLETA"
            ),
            "",
        )
        self.stop_2_address = next(
            (
                field.get("value")
                for card in pipefy_data.get("child_relations", {}).get("cards", [])
                for field in card.get("fields", [])
                if field.get("name") == "ENDEREÇO"
            ),
            "",
        )

    def generate_signature(self, body):
        raw_signature = f"{self.timestamp}\r\nPOST\r\n/v3/quotations\r\n\r\n{body}"
        logging.info(f"Raw Signature String: {raw_signature}")
        signature = hmac.new(
            self.api_secret.encode("utf-8"),
            raw_signature.encode("utf-8"),
            hashlib.sha256,
        ).hexdigest()
        return signature

    def extract_second_address(pipefy_card_data):
        stop_2_address = None
        if (
            isinstance(pipefy_card_data.get("child_relations"), list)
            and len(pipefy_card_data["child_relations"]) > 0
        ):
            for relation in pipefy_card_data["child_relations"]:
                cards = relation.get("cards", [])
                if cards:
                    for card in cards:
                        for field in card.get("fields", []):
                            if field.get("name") == "ENDEREÇO":
                                stop_2_address = field.get("value")
                                return stop_2_address
        return stop_2_address

    def request_quotation(self):
        body = json.dumps(
            {
                "data": {
                    "isRouteOptimized": True,
                    "scheduleAt": self.schedule_at,
                    "serviceType": self.service_type,
                    "language": "pt_BR",
                    "stops": [
                        {"address": self.stop_1_address},
                        {"address": self.stop_2_address},
                    ],
                }
            },
            ensure_ascii=False,
        )

        signature = self.generate_signature(body)
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"hmac {self.api_key}:{self.timestamp}:{signature}",
            "X-Request-Time": self.timestamp,
            "Market": "BR",
        }

        integration_history = IntegrationHistory()
        try:
            response = requests.post(self.url, headers=headers, data=body)
            status_request = response.status_code

            integration_history.insert(
                identifier_code="None",
                source_app="lalamove",
                destination_app="db",
                request_description=body,
                response_description=response.text if response.ok else None,
                status_request=status_request,
            )
            logging.info("Data lalamove inserted successfully into MySQL")
            response.raise_for_status()
            logging.info("Frete obtido com sucesso")
            return response.json()
        except requests.exceptions.RequestException as e:
            logging.error(f"Error fetching Lalamove quotation: {str(e)}")
            integration_history.insert(
                identifier_code=None,
                source_app="lalamove",
                destination_app="db",
                request_description=body,
                response_description=None,
                status_request=500,
            )
            return None
        finally:
            integration_history.close()
