from .models import *
from datetime import datetime, timedelta
from django.utils.translation import gettext as _
from django.template.loader import render_to_string
from GeneralApp.funcs_options import get_options_by_opt_types, get_mail_send_options
from BaseModels.mailSender import admin_send_mail_by_SMTPlib, techSendMail



def get_Dict_for_send_msgs(kwargs, search_owner_type):
    print('get_Dict_for_send_msgs')

    Dict = {
        'search_owner_type': search_owner_type
    }
    sets = get_options_by_opt_types(['domain', 'project_name'], only_vals=True)
    Dict.update(sets)


    Dict.update({'logo': f'{sets["domain"]}/static/img/svg/LogoMobile.svg', })

    find_routes_page_url = f'{sets["domain"]}/routes/route_search_results/?'
    kwargs_list = [f'{key}={value}' for key, value in kwargs.items()]
    kwargs_list.append(f'owner_type={search_owner_type}')
    find_routes_page_url += f'{"&".join(kwargs_list)}'

    Dict.update({'find_routes_page_url': find_routes_page_url})

    return Dict



def send_push_message_for_found_matches_routes(route, data_Dict):
    print(f'send_push_message_for_found_matches_routes to route id = {route.id}')

    if not route.owner.is_authenticated:
        return None

    from PushMessages.views import send_push
    title = 'Мы нашли исполнителя по Вашему объявлению!'
    text = 'Для просмотра результата нажмите на кнопку ниже'
    send_push(route.owner, title, text, url=data_Dict['find_routes_page_url'], button_name=_('Перейти к найденному'))
    return None



def send_mail_found_matches_routes(route, data_Dict):
    print(f'send_mail_found_matches_routes to route id = {route.id}')

    Dict = {
        'route': route,
    }
    Dict.update(data_Dict)

    html = render_to_string('mail/m_found_matched_routes.html', Dict)


    mail_sets = get_mail_send_options()
    to = [route.owner.email, 'web@syncsystems.net']
    subject = _('Мы нашли исполнителя по Вашему объявлению!')
    res = admin_send_mail_by_SMTPlib(
        mail_sets,
        subject=subject,
        from_email=mail_sets['sender_email'], to=to,
        html_content=html
    )

    return res


def search_matches(for_routes=None):
    print('search_matches')

    log = ''

    try:
        if not for_routes:
            for_routes = Route.objects.filter(
                createDT__gte=datetime.now() - timedelta(hours=1),
                receive_msg_by_email=True
            )

        check_fields = [
            'type_transport', 'departure_DT', 'arrival_DT', 'from_address_point', 'to_address_point',
            'from_place', 'to_place', 'cargo_type', 'weight'
        ]

        if for_routes:
            msg = f'last hour create routes count = {for_routes.count()}'
        else:
            msg = f'last hour not create routes'
        print(msg)

        for route in for_routes:
            kwargs = {}
            params = {}

            for field_name in check_fields:
                field_val = getattr(route, field_name, None)
                if field_val:
                    if type(field_val) == datetime:
                        params.update({f"{field_name}": f'{field_val.strftime("%d.%m.%Y")} - {field_val.strftime("%d.%m.%Y")}'})
                        kwargs.update({f"{field_name}__date": field_val.date()})
                    elif field_name == 'weight':
                        # print(field_name)
                        params.update({f"{field_name}": field_val})
                        if route.owner_type == 'mover':
                            kwargs.update({f"{field_name}__lte": field_val})
                        else:
                            kwargs.update({f"{field_name}__gte": field_val})
                    else:
                        kwargs.update({field_name: field_val})
                        params.update({field_name: field_val})

            found_routes = Route.objects.exclude(
                id=route.id,
            ).exclude(
                owner=route.owner
            ).exclude(
                owner_type=route.owner_type
            ).filter(
                **kwargs
            # ).count(
            )

            if found_routes:
                msg = f'found routes for send messages = {found_routes.count()}'

                data_Dict = get_Dict_for_send_msgs(params, found_routes[0].owner_type)
                msg = send_push_message_for_found_matches_routes(route, data_Dict)
                if msg:
                    log += msg
                msg = send_mail_found_matches_routes(route, data_Dict)
                if msg:
                    log += msg

    except Exception as e:
        msg = f'<br>\n! search_matches Error = {str(e)}'
        print(msg)
        log += msg

        mail_sets = get_mail_send_options()
        techSendMail(mail_sets, log, title='search_matches fail')

    return log
