import os
import sqlite3
import pytest
from scripts.utils.notifications import sendAppriseNotifications
from datetime import datetime


def create_test_db(db_file):
    """ create a database connection to a SQLite database """
    conn = None
    try:
        conn = sqlite3.connect(db_file)
        sql_create_detections_table = """ CREATE TABLE IF NOT EXISTS detections (
                                        id integer PRIMARY KEY,
                                        Com_Name text NOT NULL,
                                        Date date NULL,
                                        Time time NULL
                                    ); """
        cur = conn.cursor()
        cur.execute(sql_create_detections_table)
        sql = ''' INSERT INTO detections(Com_Name, Date)
              VALUES(?,?) '''

        cur = conn.cursor()
        today = datetime.now().strftime("%Y-%m-%d")  # SQLite stores date as YYYY-MM-DD
        cur.execute(sql, ["Great Crested Flycatcher", today])
        conn.commit()

    except Exception as e:
        print(e)
    finally:
        if conn:
            conn.close()


@pytest.fixture(autouse=True)
def clean_up_after_each_test():
    yield
    os.remove("test.db")


def test_notifications(mocker):
    notify_call = mocker.patch('scripts.utils.notifications.notify')
    create_test_db("test.db")
    settings_dict = {
        "APPRISE_NOTIFICATION_TITLE": "New backyard bird!",
        "APPRISE_NOTIFICATION_BODY": "A $comname ($sciname) was just detected with a confidence of $confidence",
        "APPRISE_NOTIFY_EACH_DETECTION": "0",
        "APPRISE_NOTIFY_NEW_SPECIES": "0",
        "APPRISE_NOTIFY_NEW_SPECIES_EACH_DAY": "0"
    }
    sendAppriseNotifications("Myiarchus crinitus_Great Crested Flycatcher",
                             "0.91",
                             "91",
                             "filename",
                             "1666-06-06",
                             "06:06:06",
                             "06",
                             "-1",
                             "-1",
                             "0.7",
                             "1.25",
                             "0.0",
                             settings_dict,
                             "test.db")

    # No active apprise notifcations configured. Confirm no notifications.
    assert (notify_call.call_count == 0)  # No notification should be sent.

    # Add daily notification.
    notify_call.reset_mock()
    settings_dict["APPRISE_NOTIFY_NEW_SPECIES_EACH_DAY"] = "1"
    sendAppriseNotifications("Myiarchus crinitus_Great Crested Flycatcher",
                             "0.91",
                             "91",
                             "filename",
                             "1666-06-06",
                             "06:06:06",
                             "06",
                             "-1",
                             "-1",
                             "0.7",
                             "1.25",
                             "0.0",
                             settings_dict,
                             "test.db")

    assert (notify_call.call_count == 1)
    assert (
        notify_call.call_args_list[0][0][0] == "A Great Crested Flycatcher (Myiarchus crinitus) was just detected with a confidence of 91 (first time today)"
    )

    # Add new species notification.
    notify_call.reset_mock()
    settings_dict["APPRISE_NOTIFY_NEW_SPECIES"] = "1"
    sendAppriseNotifications("Myiarchus crinitus_Great Crested Flycatcher",
                             "0.91",
                             "91",
                             "filename",
                             "1666-06-06",
                             "06:06:06",
                             "06",
                             "-1",
                             "-1",
                             "0.7",
                             "1.25",
                             "0.0",
                             settings_dict,
                             "test.db")

    assert (notify_call.call_count == 2)
    assert (
        notify_call.call_args_list[0][0][0] == "A Great Crested Flycatcher (Myiarchus crinitus) was just detected with a confidence of 91 (first time today)"
    )
    assert (
        notify_call.call_args_list[1][0][0] == "A Great Crested Flycatcher (Myiarchus crinitus) was just detected with a confidence \
            of 91 (only seen 1 times in last 7d)"
    )

    # Add each species notification.
    notify_call.reset_mock()
    settings_dict["APPRISE_NOTIFY_EACH_DETECTION"] = "1"
    sendAppriseNotifications("Myiarchus crinitus_Great Crested Flycatcher",
                             "0.91",
                             "91",
                             "filename",
                             "1666-06-06",
                             "06:06:06",
                             "06",
                             "-1",
                             "-1",
                             "0.7",
                             "1.25",
                             "0.0",
                             settings_dict,
                             "test.db")

    assert (notify_call.call_count == 3)
