"""测试数据构造：直接写模型，不经过服务层。"""
import datetime as dt
import uuid

from flyway.domain.actor import Actor
from flyway.models import Client, Product, ProductBatch, Transfer, TransferItem

ADMIN = Actor(user_id=None, username="admin", full_name="Ada Admin", is_admin=True)
STAFF = Actor(user_id=None, username="staff", full_name="Sam Staff", is_admin=False)
WHEN = dt.datetime(2026, 3, 2, 15, 0, tzinfo=dt.UTC)


def client(s, name="C1"):
    c = Client(id=uuid.uuid4(), name=name, email="", mobile_phone="")
    s.add(c)
    s.flush()
    return c


def product(s, title="P1", default_unit=1, available_unit=None):
    p = Product(id=uuid.uuid4(), title=title, default_unit=default_unit, available_unit=available_unit)
    s.add(p)
    s.flush()
    return p


def batch(s, product_, number="B1"):
    b = ProductBatch(id=uuid.uuid4(), product=product_, number=number, date=dt.date(2026, 3, 1))
    s.add(b)
    s.flush()
    return b


def transfer(s, client_, *, load_out=False, draft=False, local=False, code=None, transfer_from=None):
    t = Transfer(
        id=uuid.uuid4(), client=client_, code=code or f"T-{uuid.uuid4().hex[:8]}", date=WHEN,
        is_load_out=load_out, is_draft=draft, is_local=local, transfer_from=transfer_from,
    )
    s.add(t)
    s.flush()
    return t


def item(s, transfer_, batch_, quantity, unit=1, main=None):
    i = TransferItem(id=uuid.uuid4(), transfer=transfer_, batch=batch_, quantity=quantity, unit=unit, main_item=main)
    s.add(i)
    s.flush()
    return i
