from datetime import datetime

from app import db
from app.dao.dao_utils import autocommit
from app.models import ServiceDataRetention


def fetch_service_data_retention_by_id(service_id, data_retention_id):
    data_retention = ServiceDataRetention.query.filter_by(service_id=service_id, id=data_retention_id).first()
    return data_retention


def fetch_service_data_retention(service_id):
    data_retention_list = (
        ServiceDataRetention.query.filter_by(service_id=service_id)
        .order_by(
            # in the order that models.notification_types are created (email, sms, letter)
            ServiceDataRetention.notification_type
        )
        .all()
    )
    return data_retention_list


def fetch_service_data_retention_by_notification_type(service_id, notification_type):
    data_retention_list = ServiceDataRetention.query.filter_by(
        service_id=service_id, notification_type=notification_type
    ).first()
    return data_retention_list


@autocommit
def insert_service_data_retention(service_id, notification_type, days_of_retention):
    new_data_retention = ServiceDataRetention(
        service_id=service_id, notification_type=notification_type, days_of_retention=days_of_retention
    )

    db.session.add(new_data_retention)
    return new_data_retention


@autocommit
def update_service_data_retention(service_data_retention_id, service_id, days_of_retention):
    updated_count = ServiceDataRetention.query.filter(
        ServiceDataRetention.id == service_data_retention_id, ServiceDataRetention.service_id == service_id
    ).update({"days_of_retention": days_of_retention, "updated_at": datetime.utcnow()})
    return updated_count


def fetch_service_data_retention_for_all_services_by_notification_type(notification_type):
    return ServiceDataRetention.query.filter(ServiceDataRetention.notification_type == notification_type).all()
