import random

import pandas as pd
import pytest
from pydantic import BaseModel

from scripts.intersept_not_valid import ValidationInterseptor


class FakeModel(BaseModel):
    name: str
    age: int


def test_init_composed():
    interceptor = ValidationInterseptor(FakeModel)

    def df_generator(nrows=3):
        records = [{"name": "plop", "age": random.randint(1, 50)} for _ in range(nrows)]
        return pd.DataFrame.from_records(records)

    df_generator_val = interceptor(df_generator)

    df = df_generator_val(3)
    assert len(df) == 3
    assert interceptor.not_valid_rows == []


def test_init_decorator():
    interceptor = ValidationInterseptor(FakeModel)

    @interceptor
    def df_generator(nrows=3):
        records = [{"name": "plop", "age": random.randint(1, 50)} for _ in range(nrows)]
        return pd.DataFrame.from_records(records)

    df = df_generator(3)
    assert len(df) == 3
    assert interceptor.not_valid_rows == []


def test_intersept_not_valid():
    interceptor = ValidationInterseptor(FakeModel)

    @interceptor
    def df_generator():
        records = [
            {"name": "plop", "age": 12},
            {"name": "hop", "age": "ui"},
            {"name": "pipo", "age": 12},
        ]
        return pd.DataFrame.from_records(records)

    df = df_generator()
    assert len(df) == 2
    assert interceptor.not_valid_rows == [
        {
            "name": "hop",
            "age": "ui",
            "ValidationInterseptorFunc": "df_generator",
            "ValidationInterseptorArgs": (),
            "ValidationInterseptorKwrds": {},
            "ValidationInterseptorIndex": 1,
        }
    ]