"""Test untuk fungsi inti pengolah CSV."""

import csv

import pytest

from main import (
    buat_laporan,
    hitung_omzet,
    ringkas_per_kategori,
    tulis_ringkasan_csv,
    validasi_baris,
)


@pytest.fixture
def baris_valid():
    return {
        "tanggal": "2025-06-01",
        "produk": "Kopi Susu",
        "kategori": "Minuman",
        "jumlah": "3",
        "harga": "18000",
    }


@pytest.fixture
def data_penjualan():
    return [
        {
            "tanggal": "2025-06-01",
            "produk": "Kopi Susu",
            "kategori": "Minuman",
            "jumlah": "3",
            "harga": "18000",
        },
        {
            "tanggal": "2025-06-01",
            "produk": "Roti Cokelat",
            "kategori": "Makanan",
            "jumlah": "2",
            "harga": "12000",
        },
        {
            "tanggal": "2025-06-02",
            "produk": "Kopi Susu",
            "kategori": "Minuman",
            "jumlah": "1",
            "harga": "18000",
        },
    ]


def test_hitung_omzet(baris_valid):
    assert hitung_omzet(baris_valid) == 54000


def test_validasi_baris_valid(baris_valid):
    assert validasi_baris(baris_valid) == []


@pytest.mark.parametrize(
    ("perubahan", "pesan"),
    [
        ({"tanggal": "01/06/2025"}, "tanggal tidak berformat YYYY-MM-DD"),
        ({"jumlah": "-1"}, "nilai jumlah harus lebih besar dari 0"),
        ({"jumlah": "0"}, "nilai jumlah harus lebih besar dari 0"),
        ({"harga": "1x000"}, "nilai harga bukan angka bulat: '1x000'"),
        ({"produk": ""}, "kolom produk kosong"),
    ],
)
def test_validasi_baris_tidak_valid(baris_valid, perubahan, pesan):
    baris_valid.update(perubahan)
    assert pesan in validasi_baris(baris_valid)


def test_validasi_kolom_hilang(baris_valid):
    del baris_valid["harga"]
    assert "kolom harga kosong" in validasi_baris(baris_valid)


def test_ringkas_per_kategori(data_penjualan):
    ringkasan = ringkas_per_kategori(data_penjualan)

    assert ringkasan["Minuman"] == {"transaksi": 2, "jumlah": 4, "omzet": 72000}
    assert ringkasan["Makanan"] == {"transaksi": 1, "jumlah": 2, "omzet": 24000}


def test_tulis_ringkasan_csv(data_penjualan, tmp_path):
    ringkasan = ringkas_per_kategori(data_penjualan)
    berkas_csv = tmp_path / "ringkasan.csv"

    tulis_ringkasan_csv(ringkasan, str(berkas_csv))

    with berkas_csv.open(newline="", encoding="utf-8") as berkas:
        hasil = list(csv.DictReader(berkas))

    assert hasil == [
        {
            "kategori": "Minuman",
            "transaksi": "2",
            "jumlah": "4",
            "omzet": "72000",
            "rata_rata": "36000",
        },
        {
            "kategori": "Makanan",
            "transaksi": "1",
            "jumlah": "2",
            "omzet": "24000",
            "rata_rata": "24000",
        },
    ]


def test_buat_laporan_memuat_ringkasan(data_penjualan):
    laporan = buat_laporan(data_penjualan, data_penjualan, [])

    assert "Total baris       : 3" in laporan
    assert "Total omzet        : Rp96,000" in laporan
    assert "Produk terlaris    : Kopi Susu (4 item)" in laporan
