import os
import platform
from concurrent.futures import ProcessPoolExecutor

import pytest
from click.testing import CliRunner
from simplesqlite import SimpleSQLite

from sqlitebiter.__main__ import cmd
from sqlitebiter._const import ExitCode

from .common import print_traceback


def fifo_writer(fifo_name):
    with open(fifo_name, "w") as p:
        p.write(
            r"""{"name": "Stacey Chandler", "address": "5514 Daniel Pines Suite 219\nSouth David, WA 31900"}
            {"name": "Joseph Wright", "address": "037 Laura Turnpike\nMartinezfort, MI 92378"}
            {"name": "Mr. Andrew Gomez", "address": "2605 Martin Spur Suite 854\nRowlandhaven, WY 75523"}
            {"name": "Gina Nguyen", "address": "99522 Pamela Land\nNorth Gabriellaport, TX 07851"}
            {"name": "Erika Fisher", "address": "85239 Brandon Underpass Apt. 798\nNorth Destiny, WA 27159"}
            {"name": "Alicia Thomas", "address": "2103 Weaver Drives Apt. 614\nWest Thomasstad, RI 03345"}
            {"name": "John Williams", "address": "1369 Taylor Island Suite 970\nRamirezstad, GA 24877"}
            {"name": "Emily Fitzgerald", "address": "11086 Juan Hill\nLake Marthaburgh, ME 35035"}
            """
        )
        p.flush()


class Test_sqlitebiter_file:
    @pytest.mark.skipif(platform.system() == "Windows", reason="platform dependent tests")
    def test_smoke_one_file(self):
        db_path = "test.sqlite"
        runner = CliRunner()

        with runner.isolated_filesystem():
            fifo_name = "jsonl_fifo"

            os.mkfifo(fifo_name)

            with ProcessPoolExecutor() as executor:
                executor.submit(fifo_writer, fifo_name)
                result = runner.invoke(cmd, ["-o", db_path, "file", fifo_name, "--format", "jsonl"])

            print_traceback(result)

            assert result.exit_code == ExitCode.SUCCESS, fifo_name

            assert SimpleSQLite(db_path).fetch_num_records("jsonl_fifo") == 8