from typing import Optional
from payroll.models import EmployeeMapping, ProjectMapping, PayrollIntegration


class MappingService:
    """Service for handling employee and project mappings"""
    
    @staticmethod
    def get_employee_mapping(user_id: str, payroll_integration: PayrollIntegration) -> Optional[str]:
        """
        Get external employee ID for a user
        
        Args:
            user_id: Internal user UUID
            payroll_integration: PayrollIntegration instance
            
        Returns:
            External employee ID or None
        """
        try:
            mapping = EmployeeMapping.objects.get(
                user_id=user_id,
                payroll_integration=payroll_integration,
                is_active=True
            )
            return mapping.external_employee_id
        except EmployeeMapping.DoesNotExist:
            return None
    
    @staticmethod
    def get_project_mapping(project_id: str, payroll_integration: PayrollIntegration) -> Optional[str]:
        """
        Get external project code for a project
        
        Args:
            project_id: Internal project UUID
            payroll_integration: PayrollIntegration instance
            
        Returns:
            External project code or None
        """
        try:
            mapping = ProjectMapping.objects.get(
                project_id=project_id,
                payroll_integration=payroll_integration,
                is_active=True
            )
            return mapping.external_project_code
        except ProjectMapping.DoesNotExist:
            return None
    
    @staticmethod
    def create_employee_mapping(
        user_id: str,
        payroll_integration: PayrollIntegration,
        external_employee_id: str
    ) -> EmployeeMapping:
        """Create or update employee mapping"""
        mapping, created = EmployeeMapping.objects.update_or_create(
            user_id=user_id,
            payroll_integration=payroll_integration,
            defaults={
                'external_employee_id': external_employee_id,
                'is_active': True
            }
        )
        return mapping
    
    @staticmethod
    def create_project_mapping(
        project_id: str,
        payroll_integration: PayrollIntegration,
        external_project_code: str
    ) -> ProjectMapping:
        """Create or update project mapping"""
        mapping, created = ProjectMapping.objects.update_or_create(
            project_id=project_id,
            payroll_integration=payroll_integration,
            defaults={
                'external_project_code': external_project_code,
                'is_active': True
            }
        )
        return mapping

