import requests
import logging

class DefontanaClient:
    def __init__(self):
        self.api_link = "https://api.defontana.com/api/"
        self.client_id = "bigbang"
        self.company = "bigbang"
        self.user = "ventaweb"
        self.password = "Apiweb2020!!"
        self.token = None

    def get_token(self):
        """Obtener token de autenticación"""
        url = f"{self.api_link}Auth"
        params = {
            "client": self.client_id, "company": self.company,
            "user": self.user, "password": self.password
        }
        try:
            resp = requests.get(url, params=params, timeout=20)
            if resp.status_code == 200:
                self.token = resp.json().get('access_token')
                return True
            return False
        except:
            return False

    def get_products_with_stock(self):
        """(Este método ya funcionaba, lo dejamos igual)"""
        if not self.token: self.get_token()
        if not self.token: return []
        url = f"{self.api_link}sale/GetProducts"
        headers = {"Authorization": f"Bearer {self.token}"}
        all_products = []
        for page in range(1, 50):
            try:
                params = {"itemsPerPage": 100, "pageNumber": page, "status": "0"}
                resp = requests.get(url, headers=headers, params=params, timeout=20)
                if resp.status_code == 200:
                    data = resp.json()
                    items = data.get('productList') or data.get('items') or []
                    if not items: break
                    for p in items:
                        all_products.append({
                            "id": str(p.get('id', '')),
                            "codigo": str(p.get('code', 'SN')),
                            "nombre": str(p.get('name', 'Sin Nombre')),
                            "stock": float(p.get('stock', 0)),
                            "precio": float(p.get('price', 0))
                        })
                else: break
            except: break
        return all_products

    # ... (imports y class DefontanaClient igual que antes) ...

    # ... (métodos get_token y get_products_with_stock igual que antes) ...

    def get_ventas_por_fecha(self, fecha_inicio, fecha_fin):
        if not self.token: self.get_token()
        
        url = f"{self.api_link}Sale/GetSaleByDate"
        headers = {"Authorization": f"Bearer {self.token}"}
        all_ventas = []

        for page in range(1, 10): # Probamos hasta 10 páginas
            try:
                params = {
                    "initialDate": fecha_inicio,
                    "endingDate": fecha_fin,
                    "itemsPerPage": 50,
                    "pageNumber": page
                }
                
                resp = requests.get(url, headers=headers, params=params, timeout=20)
                
                if resp.status_code == 200:
                    data = resp.json()
                    ventas_raw = data.get('saleList') or data.get('list') or []
                    
                    if not ventas_raw: break

                    for v in ventas_raw:
                        detalles = []
                        raw_details = v.get('details') or []
                        
                        for d in raw_details:
                            # En tu JSON el código viene en 'code'
                            codigo = d.get('code') or d.get('productID')
                            if not codigo: continue

                            detalles.append({
                                "codigo": str(codigo).strip(),
                                # OJO: El nombre viene vacío en la API, pondremos "Buscando..."
                                # y lo resolveremos en el frontend o backend con la DB local
                                "nombre": str(d.get('comment') or "Producto sin descripción"), 
                                "cantidad": float(d.get('count') or 0)
                            })

                        if detalles:
                            all_ventas.append({
                                # Tu JSON dice 'firstFolio'
                                "folio": str(v.get('firstFolio') or v.get('documentNumber') or "S/N"),
                                # Tu JSON solo trae 'clientFile' (RUT), no trae nombre
                                "cliente": str(v.get('clientFile') or "Cliente Desconocido"),
                                "fecha": v.get('dateTime', fecha_inicio),
                                "total": v.get('total', 0), # Tu JSON usa 'total'
                                "items": detalles
                            })
                else:
                    break
            except Exception as e:
                logging.error(f"Error ventas: {e}")
                break

        return {"success": True, "ventas": all_ventas}
