-- ۱. جدول مشتریان
CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    full_name VARCHAR(255) NOT NULL,
    phone_number VARCHAR(15),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- ۲. جدول کالاها (ساختار اختصاصی کاشی)
CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,
    series_name VARCHAR(100) NOT NULL, -- نام سری / طرح (مثلا: پاریس)
    size_value VARCHAR(50) NOT NULL,   -- سایز (مثلا: 60x60)
    grade_level INT NOT NULL,          -- درجه (1, 2, 3)
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- ۳. جدول دوره‌های لیست قیمت
CREATE TABLE price_lists (
    price_list_id SERIAL PRIMARY KEY,
    list_title VARCHAR(100) NOT NULL,     -- عنوان لیست قیمت (مثلا: لیست قیمت خرداد)
    start_date TIMESTAMP NOT NULL,         -- تاریخ شروع اعتبار
    is_active BOOLEAN DEFAULT TRUE,        -- وضعیت فعال بودن
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- ۴. جدول جزئیات قیمت هر کالا در هر لیست قیمت
CREATE TABLE price_list_items (
    item_id SERIAL PRIMARY KEY,
    price_list_id INT REFERENCES price_lists(price_list_id),
    product_id INT REFERENCES products(product_id),
    price_per_meter NUMERIC(15, 2) NOT NULL -- قیمت هر متر مربع کاشی
);

-- ۵. جدول دریافتی‌ها (بستانکاری مشتری - نقد و چک)
CREATE TABLE payments (
    payment_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),
    payment_type VARCHAR(10) CHECK (payment_type IN ('CASH', 'CHEQUE')), -- نوع پرداخت: نقد یا چک
    amount NUMERIC(15, 2) NOT NULL,          -- مبلغ دریافتی اولیه
    remaining_amount NUMERIC(15, 2) NOT NULL, -- مانده مصرف‌نشده (کلید اصلی برای محاسبه FIFO)
    received_date TIMESTAMP NOT NULL,         -- تاریخ دریافت (مبنای قفل قیمت روز)
    
    -- فیلدهای اختصاصی چک (در صورت نقدی بودن، این فیلدها NULL می‌مانند)
    cheque_number VARCHAR(50),                -- شماره چک
    cheque_due_date TIMESTAMP,                -- تاریخ سررسید چک
    
    price_list_id INT REFERENCES price_lists(price_list_id), -- لیست قیمتی که این پول به آن قفل شده
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- ۶. جدول فاکتورهای فروش (بارگیری/تحویل)
CREATE TABLE invoices (
    invoice_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),
    invoice_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    total_amount NUMERIC(15, 2) NOT NULL
);

-- ۷. جدول جزئیات فاکتور (کالاهای تحویل شده)
CREATE TABLE invoice_items (
    invoice_item_id SERIAL PRIMARY KEY,
    invoice_id INT REFERENCES invoices(invoice_id),
    product_id INT REFERENCES products(product_id),
    quantity_sqm NUMERIC(10, 2) NOT NULL, -- متراژ کاشی به متر مربع
    applied_price NUMERIC(15, 2) NOT NULL -- قیمتی که سیستم بر اساس FIFO و لیست قیمت قدیمی محاسبه کرده
);

-- ۸. جدول واسط برای ردیابی دقیق کسر از بستانکاری (مچینگ فیفو)
-- این جدول نشان می‌دهد هر ردیف فاکتور دقیقاً از کدام واریزی قدیمی مشتری کسر شده است (برای گزارش‌گیری مدیریتی)
CREATE TABLE fifo_allocations (
    allocation_id SERIAL PRIMARY KEY,
    invoice_item_id INT REFERENCES invoice_items(invoice_item_id),
    payment_id INT REFERENCES payments(payment_id),
    allocated_amount NUMERIC(15, 2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);