import csv
import random
from datetime import datetime, timedelta, date

N = 10_000_000
OUTPUT_FILE = "kazna.csv"

# Најран датум на инсталација на камера
CAMERAS_START_DATE = datetime.strptime("2022-03-15", "%Y-%m-%d").date()

TODAY = date.today()

amounts = [
    2500, 3000, 3500, 4500, 5000,
    7000, 9000, 12000, 15000,
    20000, 25000, 30000,
    45000, 60000
]


def random_date_after_camera_installation():
    days_between = (TODAY - CAMERAS_START_DATE).days
    return CAMERAS_START_DATE + timedelta(days=random.randint(0, days_between))


def random_deadline(datum):
    return datum + timedelta(days=random.choice([8, 15, 30, 45, 60]))


def generate_status(datum, rok):
    r = random.random()

    # Ако рокот е поминат
    if rok < TODAY:

        if r < 0.70:
            return 1  # платена

        elif r < 0.90:
            return 2  # задоцнета / проблематична

        else:
            return 0  # сè уште неплатена

    # Ако рокот НЕ е поминат
    else:

        if r < 0.55:
            return 0  # pending

        elif r < 0.95:
            return 1  # paid

        else:
            return 2  # problematic


def random_amount():
    r = random.random()

    # Најчести помали казни
    if r < 0.45:
        return random.choice([
            2500, 3000, 3500, 4500, 5000
        ])

    # Средни казни
    elif r < 0.80:
        return random.choice([
            7000, 9000, 12000, 15000
        ])

    # Поголеми казни
    elif r < 0.95:
        return random.choice([
            20000, 25000, 30000
        ])

    # Ретки многу големи казни
    else:
        return random.choice([
            45000, 60000
        ])


with open(OUTPUT_FILE, "w", newline="", encoding="utf-8") as f:

    writer = csv.writer(f)

    writer.writerow([
        "datum",
        "status",
        "rok_na_plakanje",
        "iznos_za_plakanje"
    ])

    for i in range(1, N + 1):

        datum = random_date_after_camera_installation()

        rok = random_deadline(datum)

        status = generate_status(datum, rok)

        iznos = random_amount()

        writer.writerow([
            datum.strftime("%Y-%m-%d"),
            status,
            rok.strftime("%Y-%m-%d"),
            iznos
        ])

        if i % 100_000 == 0:
            print(f"{i} kazni generated...")

print("CSV file generated:", OUTPUT_FILE)