from base.base_metrics import BaseMetrics
import boto3
class EC2Metrics(BaseMetrics):
    def __init__(self, access_key, secret_key, region, instance_id):
        super().__init__(access_key, secret_key, region)
        self.instance_id = instance_id

    def get_cpu_utilization(self, start_time, end_time):
        metric_name = 'CPUUtilization'
        namespace = 'AWS/EC2'
        dimensions = [{'Name': 'InstanceId', 'Value': self.instance_id}]
        period = 300
        statistics = 'Average'
        return self.get_metric_data(metric_name, namespace, dimensions, start_time, end_time, period, statistics)

    def get_ec2_metric_data(self, metric, start_time, end_time, time, stat):
        
        session = boto3.Session(
        aws_access_key_id=self.access_key, 
        aws_secret_access_key= self.secret_key,  
        region_name=self.region
        )
        cloudwatch_client = session.client('cloudwatch')
        try:
            metric_response = cloudwatch_client.get_metric_data(
                MetricDataQueries=[
                    {
                        'Id': metric.lower(),
                        'MetricStat': {
                            'Metric': {
                                'Namespace': 'AWS/EC2',
                                'MetricName': metric,
                                'Dimensions': [
                                    {'Name': 'InstanceId', 'Value': self.instance_id}
                                ]
                            },
                            'Period': time,  # Datos por hora
                            'Stat': stat
                        },
                        'ReturnData': True
                    }
                ],
                StartTime=start_time,
                EndTime=end_time
            )
            timestamps = metric_response['MetricDataResults'][0]['Timestamps']
            values = metric_response['MetricDataResults'][0]['Values']
            if not timestamps or not values:
                return {
                    "status": "success",
                    "message": f"No se encontraron datos para la métrica {metric}",
                    "timestamps": [],
                    "values": []
                }
            return {
                "status": "success",
                "message": f"Métricas EC2 para {metric}",
                "timestamps": timestamps,
                "values": values
            }
        except Exception as e:
            return {
                "status": "error",
                "message": f"Error al obtener datos para la métrica {metric}: {str(e)}",
                "timestamps": [],
                "values": []
            }