from datetime import datetime

from access_control.permissions import user_has_permission


def can_create_purchase_requisition(staff_profile, company_profile):
    # Migrated to dynamic RBAC.
    return bool(company_profile) and user_has_permission(
        staff_profile, 'warehouse.purchase_requisition.add')


def can_approve_purchase_requisition(staff_profile, company_profile):
    # Migrated to dynamic RBAC. To let procurement/finance managers approve
    # warehouse requisitions, grant their role 'warehouse.purchase_requisition.approve'.
    return bool(company_profile) and user_has_permission(
        staff_profile, 'warehouse.purchase_requisition.approve')


def requisition_status_label(purchase_requisition):
    if getattr(purchase_requisition, 'purchase_requisition_rejected', False):
        return 'rejected'
    if purchase_requisition.purchase_requisition_approved:
        return 'approved'
    return 'pending'


def staff_ref(staff_profile):
    if staff_profile is None:
        return {'staff_id': '', 'staff_name': '', 'staff_position': ''}
    position = ''
    if staff_profile.staff_position is not None:
        position = staff_profile.staff_position.position_title
    return {
        'staff_id': str(staff_profile.id),
        'staff_name': f'{staff_profile.first_name} {staff_profile.last_name}',
        'staff_position': position,
    }


def serialize_requisition_document(document, date_format, target_timezone):
    return {
        'document_id': str(document.id),
        'document_name': document.document_name,
        'document_type': document.document_type,
        'content_type': document.content_type,
        'file_data_base64': document.file_data_base64,
        'uploaded_by': staff_ref(document.uploaded_by),
        'created_on': datetime.strftime(
            document.created_on.astimezone(target_timezone), date_format,
        ) if document.created_on is not None else '',
    }


def enrich_purchase_requisition_map(
    purchase_requisition,
    purchase_requisition_map,
    date_format,
    target_timezone,
):
    purchase_requisition_map['specifications'] = purchase_requisition.specifications or ''
    purchase_requisition_map['purchase_requisition_rejected'] = (
        'true' if purchase_requisition.purchase_requisition_rejected else 'false'
    )
    purchase_requisition_map['rejection_reason'] = purchase_requisition.rejection_reason or ''
    purchase_requisition_map['requisition_status'] = requisition_status_label(purchase_requisition)
    purchase_requisition_map['approved_by'] = staff_ref(
        getattr(purchase_requisition, 'approved_by', None),
    )
    documents = []
    document_qs = getattr(purchase_requisition, 'documents', None)
    if document_qs is not None:
        for document in document_qs.all().order_by('-id'):
            if document.recycle_bin:
                continue
            documents.append(serialize_requisition_document(document, date_format, target_timezone))
    purchase_requisition_map['documents_list'] = documents
    return purchase_requisition_map
