"""
Service for generating CSV exports of Record Cleaner reports.
"""
import csv
import io
from typing import List, Dict, Any
from django.http import HttpResponse
from components.utils import format_atlas_event_date
from .atlas_service import DEFAULT_FIELDS


def generate_csv_report(merged_records: List[Dict[str, Any]]) -> HttpResponse:
    """
    Generate a CSV file containing original occurrence data plus Record Cleaner results.

    Args:
        merged_records: List of merged records (occurrence + validation + verification)

    Returns:
        HttpResponse with CSV content
    """
    # Create CSV in memory
    output = io.StringIO()

    if not merged_records:
        return HttpResponse('No records to export', content_type='text/plain')

    # Use DEFAULT_FIELDS ordering (includes 'id')
    # Then add dataResourceID and validation/verification fields
    fieldnames = list(DEFAULT_FIELDS)
   
    
    # Add dataResourceID (present in merged records but not in DEFAULT_FIELDS)
    fieldnames.append('dataResourceID')
    
    # Add validation/verification fields
    additional_fields = [
        'validation_result',
        'validation_messages',
        'preferred_tvk',
        'verification_result',
        'verification_messages',
        'id_difficulty',
    ]
    for field in additional_fields:
        fieldnames.append(field)

    # Convert eventDate values if they're numeric (Atlas API bug)
    processed_records = []
    for record in merged_records:
        processed_record = record.copy()
        if processed_record.get('eventDate'):
            processed_record['eventDate'] = format_atlas_event_date(processed_record['eventDate'])
        if processed_record.get('eventDateEnd'):
            processed_record['eventDateEnd'] = format_atlas_event_date(processed_record['eventDateEnd'])
        
        messages = processed_record.get('validation_messages') or []
        processed_record['validation_messages'] = '; '.join(messages)        
        messages = processed_record.get('verification_messages') or []
        processed_record['verification_messages'] = '; '.join(messages)

        processed_records.append(processed_record)

    writer = csv.DictWriter(output, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(processed_records)

    # Create HTTP response
    response = HttpResponse(output.getvalue(), content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="record_cleaner_report.csv"'

    return response
