import unittest
from datetime import datetime

from app.services.fiscal_document_service import (
    _extract_laconi_delivery_note_items_from_preview_text,
    _extract_moet_delivery_note_items_from_text,
    _extract_supplier_name,
    _is_company_like_line,
    _is_plausible_fiscal_document_date,
    _name_similarity,
)


class FiscalSupplierExtractionTests(unittest.TestCase):
    def test_single_word_legal_entity_supplier_is_valid(self) -> None:
        self.assertTrue(_is_company_like_line("VELIER S.p.A."))
        self.assertEqual(
            _extract_supplier_name(
                "VELIER S.p.A.\n"
                "Via V Maggio 85 | Villa Nuova Paradisetto 16147 Genova\n"
                "CLIENTE FATTURAZIONE | DESTINATARIO\n"
                "SAMMY PRODUCTION SRL | RITUAL\n"
            ),
            "VELIER S.p.A.",
        )

    def test_bare_legal_suffix_is_not_a_supplier(self) -> None:
        self.assertFalse(_is_company_like_line("S.p.A."))


class FiscalDocumentParsingTests(unittest.TestCase):
    def test_moet_compact_product_codes_are_not_dropped(self) -> None:
        items = _extract_moet_delivery_note_items_from_text(
            "Documento di Trasporto\n"
            "DESCRIZIONE DEI BENI (Natura - Qualita) | QTY | Cartons\n"
            "1105819 | DP WH13 1.5L C3 ΤΡΙΝ | 6 | 2 | COL\n"
            "LOTTO LAPN3AG | COL | 6\n"
            "1115384 | CB SAUVIGNON BLANC 2025 | 30 | 5 | COL\n"
            "LOTTO L25171B001 COL | 30\n"
        )

        self.assertEqual([item["product_code"] for item in items], ["1105819", "1115384"])
        self.assertEqual(items[0]["pack_count"], 2.0)
        self.assertEqual(items[1]["pack_count"], 5.0)

    def test_laconi_two_line_header_is_accepted(self) -> None:
        items = _extract_laconi_delivery_note_items_from_preview_text(
            "QUANTITÀ | PREZZO | SCONTO % | IMPORTO | C.I.\n"
            "C. ART. | DESCRIZIONE | colli X pezzi\n"
            "B840 | CO2 KG10 | BM | 1 X | 1 | 30,5500 | 30,55\n"
        )

        self.assertEqual(len(items), 1)
        self.assertEqual(items[0]["product_code"], "B840")
        self.assertEqual(items[0]["unit_code"], "BM")
        self.assertEqual(items[0]["pack_count"], 1.0)

    def test_stale_ocr_year_is_not_plausible_for_current_documents(self) -> None:
        stale_year = datetime.now().year - 6
        self.assertFalse(_is_plausible_fiscal_document_date(f"{stale_year}-06-23"))

    def test_moet_volume_variants_do_not_match_wrong_size(self) -> None:
        self.assertLess(_name_similarity("BV PURCHROME SF 40% 1750ML C6", "BELVEDERE 0.7L"), 0.4)
        self.assertGreater(_name_similarity("BV PURCHROME SF 40% 1750ML C6", "BELVEDERE 1.5L"), 0.4)


if __name__ == "__main__":
    unittest.main()
