from base.base_metrics import BaseMetrics
import boto3
class WafMetricsR(BaseMetrics):
    def __init__(self, access_key, secret_key, region, web_acl_id):
        super().__init__(access_key, secret_key, region)
        self.web_acl_id = web_acl_id

    def get_Waf_Allowe_data(self,metric, start_time, end_time,country_code,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:
            print(f"Solicitando métrica: {metric}")
            response = cloudwatch_client.get_metric_data(
            MetricDataQueries=[
                {
                    'Id': 'allowedRequests',
                    'MetricStat': {
                        'Metric': {
                            'Namespace': 'AWS/WAFV2',
                            'MetricName': 'AllowedRequests',
                            'Dimensions': [
                                {'Name': 'WebACL', 'Value': self.web_acl_id},
                                {'Name': 'Region', 'Value': session.region_name},
                                {'Name': 'Country', 'Value': country_code}
                            ]
                        },
                        'Period': time,  # Datos diarios
                        'Stat': stat
                    },
                    'ReturnData': True
                }
            ],
                StartTime=start_time,
                EndTime=end_time
            )

            timestamps = response['MetricDataResults'][0]['Timestamps']
            values = 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 WAF 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": []
            }
            
    def get_Waf_blocked_data(self,metric, start_time, end_time,country_code,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:
            print(f"Solicitando métrica: {metric}")
            response = cloudwatch_client.get_metric_data(
            MetricDataQueries=[
                {
                    'Id': 'deniedRequests',
                    'MetricStat': {
                        'Metric': {
                            'Namespace': 'AWS/WAFV2',
                            'MetricName': 'BlockedRequests',
                            'Dimensions': [
                                {'Name': 'WebACL', 'Value': self.web_acl_id},
                                {'Name': 'Region', 'Value': session.region_name},
                                {'Name': 'Country', 'Value': country_code}
                            ]
                        },
                        'Period': time,  # Datos diarios
                        'Stat': stat
                    },
                    'ReturnData': True
                }
            ],
                StartTime=start_time,
                EndTime=end_time
            )

            timestamps = response['MetricDataResults'][0]['Timestamps']
            values = 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 WAF 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": []
            }            