import pytest, json
from django.contrib.auth import get_user_model
from model_bakery import baker
from reports.models import Reports
from products.models import Products, Categories, Series
from inquiry.models import Inquiries
from reports.services import ProductInquiriesReport

Users = get_user_model()


# Create your tests here.
@pytest.mark.django_db()
class TestReportsModel:
    def test_return_str_model(self):
        report = baker.make(Reports)
        assert str(report) == f"{report.title} - {report.type}"


@pytest.mark.django_db()
class TestProductInquiriesReportService:
    def test_fetch_most_inquired_product(self):
        category_1 = baker.make(
            Categories,
            main_category_name=["Living", "Dining"],
            sub_category_name="Ottoman",
            multiple_orderings={"Living": 1, "Dining": 2},
        )

        modified_description = json.dumps({"delta": "", "html": "Hello World"})
        self.product_1 = baker.make(
            Products,
            name="Product 1",
            edp_number="EDP-000",
            article_number="ART-000",
            price=100.0,
            description=modified_description,
            category=category_1,
        )

        baker.make(Inquiries, product=self.product_1)

        p_report = ProductInquiriesReport()
        product = p_report.get_most_inquired_product()

        assert product is not None
        assert isinstance(product, Products) is True


@pytest.mark.django_db()
class TestProductInquiriesReportsFetch:
    def setup_method(self):
        self.admin = baker.make(Users, is_staff=True)
        category_1 = baker.make(
            Categories,
            main_category_name=["Living", "Dining"],
            sub_category_name="Ottoman",
            multiple_orderings={"Living": 1, "Dining": 2},
        )
        series = baker.make(Series)

        modified_description = json.dumps({"delta": "", "html": "Hello World"})
        self.product_1 = baker.make(
            Products,
            name="Product 1",
            edp_number="EDP-000",
            article_number="ART-000",
            price=100.0,
            description=modified_description,
            category=category_1,
        )
        self.product_2 = baker.make(
            Products,
            name="Product 1",
            edp_number="EDP-000",
            article_number="ART-000",
            price=100.0,
            description=modified_description,
            category=category_1,
            series=series,
        )

        self.inq_1 = baker.make(Inquiries, product=self.product_1)
        self.inq_2 = baker.make(Inquiries, product=self.product_2)

    def test_fetch_product_inquiries_report_by_non_admin_return_403(
        self, authenticate_user
    ):
        api_client = authenticate_user()
        response = api_client.get("/api/reports/product-inquiries/")

        assert response.status_code == 403

    def test_fetch_product_inquiries_report_by_admin_return_200(
        self, authenticate_user
    ):
        api_client = authenticate_user(user=self.admin)
        response = api_client.get("/api/reports/product-inquiries/")

        assert response.status_code == 200
        assert "top_inquirer" in response.data
        assert "most_inquired_product" in response.data
        assert "most_inquired_categories" in response.data
        assert "top_ten_inquired_products" in response.data
