import requests
import pandas as pd
import datetime
import random

class GLPIClient:
    def __init__(self, api_url=None, app_token=None, user_token=None):
        self.api_url = api_url
        self.app_token = app_token
        self.user_token = user_token
        self.session_token = None
        self.is_mock = not (api_url and app_token and user_token)

    def init_session(self):
        if self.is_mock:
            return True
        
        headers = {
            'App-Token': self.app_token,
            'Authorization': f'user_token {self.user_token}'
        }
        try:
            response = requests.get(f"{self.api_url}/initSession", headers=headers)
            response.raise_for_status()
            self.session_token = response.json().get('session_token')
            return True
        except Exception as e:
            print(f"Error initializing session: {e}")
            return False

    def get_headers(self):
        return {
            'App-Token': self.app_token,
            'Session-Token': self.session_token
        }

    def get_tickets(self, limit=100):
        if self.is_mock:
            return self._generate_mock_tickets(limit)
        
        # Real implementation would go here
        # For now, let's keep robust mock for dev
        return self._generate_mock_tickets(limit)

    def _generate_mock_tickets(self, count=100):
        """Generates realistic mock data for testing UI"""
        status_map = {1: 'Novo', 2: 'Em Processamento', 3: 'Planejado', 4: 'Pendente', 5: 'Solucionado', 6: 'Fechado'}
        categories = ['Hardware', 'Software', 'Rede', 'Impressora', 'Acesso']
        
        data = []
        now = datetime.datetime.now()
        
        for i in range(count):
            status_id = random.choices(list(status_map.keys()), weights=[10, 20, 10, 10, 30, 20])[0]
            date_creation = now - datetime.timedelta(days=random.randint(0, 30))
            
            # Close date logic
            if status_id in [5, 6]:
                date_solved = date_creation + datetime.timedelta(hours=random.randint(1, 48))
            else:
                date_solved = None

            ticket = {
                'id': i + 1,
                'name': f"Chamado Exemplo {i+1}",
                'status': status_map[status_id],
                'status_id': status_id,
                'date': date_creation,
                'solvedate': date_solved,
                'category': random.choice(categories),
                'priority': random.randint(1, 5)
            }
            data.append(ticket)
            
        return pd.DataFrame(data)

    def get_kpis(self, df):
        """Calculates KPIs from the dataframe"""
        total_tickets = len(df)
        solved_tickets = len(df[df['status'].isin(['Solucionado', 'Fechado'])])
        open_tickets = total_tickets - solved_tickets
        success_rate = (solved_tickets / total_tickets * 100) if total_tickets > 0 else 0
        
        return {
            'total': total_tickets,
            'solved': solved_tickets,
            'open': open_tickets,
            'success_rate': success_rate
        }
