-- ============================================================================
-- Sama Baghdad Currency Exchange — PostgreSQL Schema + Seed Data
-- سما بغداد للصرافة — مخطط قاعدة بيانات PostgreSQL + بيانات أولية
--
-- Task ID : DB-SQL-1
-- Schema  : mirrors /prisma/schema.prisma  (31 models → 31 tables)
-- Seeds   : /prisma/seed.ts + /prisma/seed-terms.ts
--
-- Usage:
--   psql -U <user> -d <db> -f sama_baghdad_postgresql.sql
--   OR import via phpPgAdmin (cPanel → PostgreSQL Databases → phpPgAdmin)
--
-- Design notes:
--   * Safe to re-run: uses CREATE TABLE IF NOT EXISTS + INSERT ... ON CONFLICT DO NOTHING.
--   * At the top, all tables are dropped inside a single transaction for clean re-import.
--   * Admin password is a VALID Argon2id hash of "admin123"
--     (generated via @node-rs/argon2 with m=19456, t=2, p=1 — matches src/lib/auth/password.ts).
--     You can either keep this hash or run `bun run db:seed` after import to regenerate
--     with a fresh salt.
--   * Prisma's `@map` directives are respected: camelCase fields without @map
--     (e.g. admins."createdAt", terms_conditions."createdAt", app_settings."updatedAt")
--     are created with double-quoted identifiers so PostgreSQL preserves their case.
--   * No DB-level foreign keys (matches the original PHP/MariaDB schema — relations are
--     soft, enforced at the application layer).
-- ============================================================================


-- ============================================================================
-- CLEAN SLATE — drop every table inside one transaction (atomic re-import)
-- ============================================================================
BEGIN;

DROP TABLE IF EXISTS app_settings             CASCADE;
DROP TABLE IF EXISTS price                    CASCADE;
DROP TABLE IF EXISTS smstext                  CASCADE;
DROP TABLE IF EXISTS terms_conditions         CASCADE;
DROP TABLE IF EXISTS message_counts           CASCADE;
DROP TABLE IF EXISTS blocked_users            CASCADE;
DROP TABLE IF EXISTS blocked_countries        CASCADE;
DROP TABLE IF EXISTS currencies               CASCADE;
DROP TABLE IF EXISTS limits                   CASCADE;
DROP TABLE IF EXISTS confirm_card             CASCADE;
DROP TABLE IF EXISTS confirm_page_western     CASCADE;
DROP TABLE IF EXISTS confirm_page             CASCADE;
DROP TABLE IF EXISTS bank_accounts            CASCADE;
DROP TABLE IF EXISTS western_payment_methods  CASCADE;
DROP TABLE IF EXISTS wester_box               CASCADE;
DROP TABLE IF EXISTS services                 CASCADE;
DROP TABLE IF EXISTS dollar_yan               CASCADE;
DROP TABLE IF EXISTS tracking_page            CASCADE;
DROP TABLE IF EXISTS western_page             CASCADE;
DROP TABLE IF EXISTS dollar_page              CASCADE;
DROP TABLE IF EXISTS index_page               CASCADE;
DROP TABLE IF EXISTS new_western_accounts     CASCADE;
DROP TABLE IF EXISTS qcard                    CASCADE;
DROP TABLE IF EXISTS updat_orders             CASCADE;
DROP TABLE IF EXISTS requests                 CASCADE;
DROP TABLE IF EXISTS cards                    CASCADE;
DROP TABLE IF EXISTS alipay                   CASCADE;
DROP TABLE IF EXISTS alibaba                  CASCADE;
DROP TABLE IF EXISTS western                  CASCADE;
DROP TABLE IF EXISTS dollar                   CASCADE;
DROP TABLE IF EXISTS admins                   CASCADE;

COMMIT;


-- ============================================================================
-- 1. admins — حسابات الإدارة (single-role admin auth, Argon2id passwords)
--    Admin accounts (Argon2id password hashing, one row by default)
-- ============================================================================
CREATE TABLE IF NOT EXISTS admins (
    id          TEXT PRIMARY KEY,
    username    TEXT NOT NULL UNIQUE,
    email       TEXT NOT NULL UNIQUE,
    phone       TEXT,
    password    TEXT NOT NULL,
    "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);


-- ============================================================================
-- 2. dollar — طلبات حجز الدولار للمسافرين
--    Dollar booking orders for travellers (multi-step form)
-- ============================================================================
CREATE TABLE IF NOT EXISTS dollar (
    id                    SERIAL PRIMARY KEY,
    order_number          TEXT NOT NULL,
    step_number           INTEGER NOT NULL DEFAULT 1,
    dollar_amount         TEXT NOT NULL,
    pilgrim               TEXT NOT NULL,             -- "yes" | "no"
    port_type             TEXT NOT NULL,             -- "air" | "land"
    where_receieve_dollar TEXT NOT NULL,
    dollar_phone          TEXT NOT NULL,
    dollar_name           TEXT NOT NULL,
    travel_date           TEXT,
    travel_to             TEXT NOT NULL,
    dollar_how_pay        TEXT NOT NULL,
    passport_image        TEXT,
    ticket_image          TEXT,
    id_image_first        TEXT,
    person_image          TEXT,
    live_image            TEXT,
    visa_image            TEXT,
    minfees_image         TEXT,
    image_confirm_order   TEXT,
    order_status          INTEGER NOT NULL DEFAULT 0,  -- 0=pending,1=paid,2=rejected,3=review
    created_at            TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    ip_address            TEXT NOT NULL,
    device_fingerprint    TEXT NOT NULL,
    status_blocked        INTEGER NOT NULL DEFAULT 0,
    read_status           INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_dollar_order_number ON dollar(order_number);
CREATE INDEX IF NOT EXISTS idx_dollar_phone        ON dollar(dollar_phone);
CREATE INDEX IF NOT EXISTS idx_dollar_created_at   ON dollar(created_at);


-- ============================================================================
-- 3. western — طلبات Western Union / MoneyGram / تحويل بنكي / داخل المحافظات
--    Western Union + MoneyGram + bank-transfer + inter-province orders
-- ============================================================================
CREATE TABLE IF NOT EXISTS western (
    id                    SERIAL PRIMARY KEY,
    order_number          TEXT NOT NULL,
    phone                 TEXT NOT NULL,
    sender_name           TEXT NOT NULL,
    reciever_name         TEXT,
    reciever_name_inside  TEXT,
    country_area_sender   TEXT,
    country_area_reciever TEXT,
    inside_area_sender    TEXT,
    inside_area_reciever  TEXT,
    email                 TEXT NOT NULL DEFAULT 'mail@test.com',
    amount                DOUBLE PRECISION NOT NULL,
    confirm_checked       INTEGER NOT NULL DEFAULT 0,
    transfer_method       TEXT NOT NULL,
    sender_account_name   TEXT,
    account_number        TEXT,
    bank_name             TEXT,
    country               TEXT,
    sender_id_image       TEXT,
    reciever_id_image     TEXT,
    how_pay               TEXT,
    id_number_image       TEXT,
    sender_id_image_bank  TEXT,
    invoice_bank          TEXT,
    pay_image             TEXT,
    order_status          INTEGER NOT NULL DEFAULT 0,
    created_at            TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    ip_address            TEXT NOT NULL,
    device_fingerprint    TEXT NOT NULL,
    status_blocked        INTEGER NOT NULL DEFAULT 0,
    read_status           INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_western_order_number    ON western(order_number);
CREATE INDEX IF NOT EXISTS idx_western_phone           ON western(phone);
CREATE INDEX IF NOT EXISTS idx_western_transfer_method ON western(transfer_method);
CREATE INDEX IF NOT EXISTS idx_western_created_at      ON western(created_at);


-- ============================================================================
-- 4. alibaba — طلبات دفع Alibaba
--    Alibaba order-payment bookings
-- ============================================================================
CREATE TABLE IF NOT EXISTS alibaba (
    id                 SERIAL PRIMARY KEY,
    order_number       TEXT NOT NULL,
    phone              TEXT NOT NULL,
    sender_name        TEXT NOT NULL,
    sender_address     TEXT NOT NULL,
    amount             DOUBLE PRECISION NOT NULL,
    dinnar_amount      DOUBLE PRECISION,
    sender_id_image    TEXT,
    payment_link       TEXT NOT NULL,
    how_pay            TEXT,
    pay_image          TEXT,
    notes              TEXT,
    order_status       INTEGER NOT NULL DEFAULT 0,
    created_at         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    ip_address         TEXT NOT NULL,
    device_fingerprint TEXT NOT NULL,
    status_blocked     INTEGER NOT NULL DEFAULT 0,
    read_status        INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_alibaba_order_number ON alibaba(order_number);
CREATE INDEX IF NOT EXISTS idx_alibaba_phone        ON alibaba(phone);
CREATE INDEX IF NOT EXISTS idx_alibaba_created_at   ON alibaba(created_at);


-- ============================================================================
-- 5. alipay — طلبات حجز Alipay
--    Alipay booking orders
-- ============================================================================
CREATE TABLE IF NOT EXISTS alipay (
    id                 SERIAL PRIMARY KEY,
    order_number       TEXT NOT NULL,
    phone              TEXT NOT NULL,
    sender_name        TEXT NOT NULL,
    sender_address     TEXT NOT NULL,
    amount             DOUBLE PRECISION NOT NULL,
    wian_amount        DOUBLE PRECISION,   -- yuanAmount
    sender_id_image    TEXT,
    alipay_image       TEXT,
    how_pay            TEXT,
    pay_image          TEXT,
    order_status       INTEGER NOT NULL DEFAULT 0,
    created_at         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    ip_address         TEXT NOT NULL,
    device_fingerprint TEXT NOT NULL,
    status_blocked     INTEGER NOT NULL DEFAULT 0,
    read_status        INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_alipay_order_number ON alipay(order_number);
CREATE INDEX IF NOT EXISTS idx_alipay_phone        ON alipay(phone);
CREATE INDEX IF NOT EXISTS idx_alipay_created_at   ON alipay(created_at);


-- ============================================================================
-- 6. cards — طلبات شحن الكروت (Neosurf USD / Neosurf IQD / FIB / ZainCash)
--    Card top-up orders
-- ============================================================================
CREATE TABLE IF NOT EXISTS cards (
    id                       SERIAL PRIMARY KEY,
    transfer_method          TEXT NOT NULL,
    -- Neosurf USD
    neo_sender_name          TEXT,
    neo_sender_account       TEXT,
    neo_four_card            TEXT,
    neo_dollar_amount        DOUBLE PRECISION,
    neo_dinnar_amount        DOUBLE PRECISION,
    neo_how_pay              TEXT,
    -- Neosurf IQD
    neo_dinnar_sender_name   TEXT,
    neo_dinnar_sender_account TEXT,
    neo_dinnar_four_card     TEXT,
    neo_dinnar_section_amount DOUBLE PRECISION,
    neo_dinnar_how_pay       TEXT,
    -- FIB
    fib_sender_name          TEXT,
    fib_sender_account       TEXT,
    fib_dinnar_amount        DOUBLE PRECISION,
    fib_how_pay              TEXT,
    -- ZainCash
    zin_account_number       TEXT,
    zin_sender_name          TEXT,
    zin_dinnar_amount        DOUBLE PRECISION,
    zin_how_pay              TEXT,
    -- Common
    phone                    TEXT NOT NULL,
    date                     TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    status                   INTEGER NOT NULL DEFAULT 0,
    image_confirm_order      TEXT
);
CREATE INDEX IF NOT EXISTS idx_cards_phone           ON cards(phone);
CREATE INDEX IF NOT EXISTS idx_cards_transfer_method ON cards(transfer_method);
CREATE INDEX IF NOT EXISTS idx_cards_date            ON cards(date);


-- ============================================================================
-- 7. requests — الطلبات العامة (generic contact / pricing requests)
--    Generic customer requests (price inquiry, contact, …)
-- ============================================================================
CREATE TABLE IF NOT EXISTS requests (
    id              SERIAL PRIMARY KEY,
    name            TEXT NOT NULL,
    price_request   TEXT NOT NULL,
    city            TEXT,
    phone           TEXT NOT NULL,
    request_order   TEXT,
    status          INTEGER NOT NULL DEFAULT 0,
    request_number  TEXT NOT NULL,
    note            TEXT,
    order_time      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    payment_method  TEXT,
    new_text        TEXT,
    why_send        TEXT
);
CREATE INDEX IF NOT EXISTS idx_requests_phone          ON requests(phone);
CREATE INDEX IF NOT EXISTS idx_requests_request_number ON requests(request_number);


-- ============================================================================
-- 8. updat_orders — طلبات تحديث الطلب (order-modification requests)
--    Order update requests (separate flow — also syncs to sala-orders.com)
-- ============================================================================
CREATE TABLE IF NOT EXISTS updat_orders (
    id           SERIAL PRIMARY KEY,
    service_name TEXT NOT NULL,
    order_number TEXT NOT NULL,
    old_amount   TEXT NOT NULL,
    new_amount   TEXT NOT NULL,
    job_title    TEXT,
    id_image     TEXT,
    status       INTEGER NOT NULL DEFAULT 0,
    created_at   TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_updat_orders_order_number ON updat_orders(order_number);


-- ============================================================================
-- 9. qcard — سجل بطاقات Q-Card (admin-managed)
--    Q-Card receipts (admin-managed)
-- ============================================================================
CREATE TABLE IF NOT EXISTS qcard (
    id              SERIAL PRIMARY KEY,
    name            TEXT NOT NULL,
    amount          TEXT NOT NULL,
    date_create     TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    time_create     TEXT,
    recieve_card    TEXT,
    top_id          TEXT,
    reset_number    TEXT,
    mov_number      TEXT,
    mov_symobol     TEXT,
    device_number   TEXT,
    tager_number    TEXT,
    merchent_number TEXT,
    note            TEXT
);


-- ============================================================================
-- 10. new_western_accounts — سجل حسابات Western Union المنشأة يدويًا
--     Admin-managed Western Union send/receive receipts (with MTCN)
-- ============================================================================
CREATE TABLE IF NOT EXISTS new_western_accounts (
    id              SERIAL PRIMARY KEY,
    send_name       TEXT NOT NULL,
    send_phone      TEXT NOT NULL,
    send_address    TEXT NOT NULL,
    send_id_type    TEXT,
    send_id_number  TEXT,
    send_purpose    TEXT,
    recieve_name    TEXT NOT NULL,
    recieve_country TEXT NOT NULL,
    mtcn            TEXT,
    date            TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    time            TEXT,
    amount_send     DOUBLE PRECISION NOT NULL,
    fee             DOUBLE PRECISION NOT NULL DEFAULT 0,
    total           DOUBLE PRECISION NOT NULL DEFAULT 0,
    exchange_rate   DOUBLE PRECISION,
    payout_amount   DOUBLE PRECISION,
    agent_details   TEXT
);


-- ============================================================================
-- 11. index_page — محتوى الصفحة الرئيسية (CMS)
--     Home-page CMS content (hero, sections, footer, branding)
-- ============================================================================
CREATE TABLE IF NOT EXISTS index_page (
    id             INTEGER PRIMARY KEY DEFAULT 1,
    hero_title     TEXT NOT NULL,
    hero_subtitle  TEXT NOT NULL,
    section2_title TEXT,
    section2_desc  TEXT,
    services_title TEXT,
    footer_text    TEXT,
    news           TEXT,
    social_links   TEXT,    -- JSON
    logo           TEXT,
    main_color     TEXT,
    button_labels  TEXT
);


-- ============================================================================
-- 12. dollar_page — محتوى صفحة حجز الدولار
--     Dollar-booking page CMS content
-- ============================================================================
CREATE TABLE IF NOT EXISTS dollar_page (
    id             INTEGER PRIMARY KEY DEFAULT 1,
    banner_image   TEXT,
    title1         TEXT,
    desc1          TEXT,
    amount         TEXT,    -- pipe-separated options: "5000|3000|2000"
    recieve_dollar TEXT     -- CSV list of receive locations
);


-- ============================================================================
-- 13. western_page — محتوى صفحة Western Union
--     Western-Union page CMS content (service-fee banner)
-- ============================================================================
CREATE TABLE IF NOT EXISTS western_page (
    id                 INTEGER PRIMARY KEY DEFAULT 1,
    penfit_percent     TEXT NOT NULL DEFAULT 'رسوم خدمة تحويل الأموال 2%',
    western_info_send  TEXT
);


-- ============================================================================
-- 14. tracking_page — محتوى صفحة تتبع الطلب
--     Order-tracking page CMS content
-- ============================================================================
CREATE TABLE IF NOT EXISTS tracking_page (
    id    INTEGER PRIMARY KEY DEFAULT 1,
    "desc" TEXT NOT NULL   -- "desc" is reserved in PostgreSQL; must be quoted (Prisma quotes it automatically)
);


-- ============================================================================
-- 15. dollar_yan — سعر الدولار مقابل اليوان الصيني
--     USD → CNY exchange rate (single row)
-- ============================================================================
CREATE TABLE IF NOT EXISTS dollar_yan (
    id           INTEGER PRIMARY KEY DEFAULT 1,
    dollar_price DOUBLE PRECISION NOT NULL DEFAULT 7.17
);


-- ============================================================================
-- 16. services — بطاقات الخدمات في الصفحة الرئيسية
--     Homepage service cards (title + description + image)
-- ============================================================================
CREATE TABLE IF NOT EXISTS services (
    id          SERIAL PRIMARY KEY,
    title       TEXT NOT NULL,
    description TEXT NOT NULL,
    image       TEXT,
    created_at  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);


-- ============================================================================
-- 17. wester_box — صناديق معلومات Western Union (CMS)
--     Western Union info boxes (CMS)
-- ============================================================================
CREATE TABLE IF NOT EXISTS wester_box (
    id          SERIAL PRIMARY KEY,
    title       TEXT NOT NULL,
    description TEXT NOT NULL,
    image       TEXT,
    created_at  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);


-- ============================================================================
-- 18. western_payment_methods — طرق الدفع المعروضة للعملاء
--     Public payment methods (MasterCard Rafidain, FIB, ZainCash, bank transfer)
-- ============================================================================
CREATE TABLE IF NOT EXISTS western_payment_methods (
    id            SERIAL PRIMARY KEY,
    title         TEXT NOT NULL,
    description   TEXT NOT NULL,
    account_num   TEXT NOT NULL,
    barcode_image TEXT,
    box_name      TEXT,
    created_at    TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);


-- ============================================================================
-- 19. bank_accounts — حسابات الشركة البنكية (admin-managed)
--     Company bank accounts shown on /accounts page
-- ============================================================================
CREATE TABLE IF NOT EXISTS bank_accounts (
    id                 SERIAL PRIMARY KEY,
    account_number     TEXT,
    card_number        TEXT,
    fib_barcode        TEXT,
    fib_account_number TEXT,
    tanmia_number      TEXT,
    tbi_number         TEXT,
    daf_number         TEXT,
    zain_number        TEXT,
    other_number       TEXT,
    box_name           TEXT
);


-- ============================================================================
-- 20. confirm_page — محتوى صفحة تأكيد الطلب (الدولار)
--     Dollar confirm-page CMS content
-- ============================================================================
CREATE TABLE IF NOT EXISTS confirm_page (
    id                 INTEGER PRIMARY KEY DEFAULT 1,
    title              TEXT NOT NULL,
    title2             TEXT,
    desc1              TEXT,
    desc2              TEXT,
    account_number     TEXT,
    card_number        TEXT,
    fib_barcode        TEXT,
    fib_account_number TEXT
);


-- ============================================================================
-- 21. confirm_page_western — محتوى صفحة تأكيد Western Union
--     Western confirm-page CMS content
-- ============================================================================
CREATE TABLE IF NOT EXISTS confirm_page_western (
    id     INTEGER PRIMARY KEY DEFAULT 1,
    title  TEXT NOT NULL,
    title2 TEXT,
    desc1  TEXT,
    desc2  TEXT
);


-- ============================================================================
-- 22. confirm_card — محتوى صفحة تأكيد شحن الكارت
--     Card top-up confirm-page CMS content
-- ============================================================================
CREATE TABLE IF NOT EXISTS confirm_card (
    id                 INTEGER PRIMARY KEY DEFAULT 1,
    title              TEXT NOT NULL,
    title2             TEXT,
    desc1              TEXT,
    desc2              TEXT,
    account_number     TEXT,
    card_number        TEXT,
    fib_barcode        TEXT,
    fib_account_number TEXT
);


-- ============================================================================
-- 23. limits — حدود المبالغ المسموح بها لكل خدمة
--     Per-service transaction limits (single row)
-- ============================================================================
CREATE TABLE IF NOT EXISTS limits (
    id            INTEGER PRIMARY KEY DEFAULT 1,
    dollar_limit  DOUBLE PRECISION NOT NULL DEFAULT 1000,
    alipay_limit  DOUBLE PRECISION NOT NULL DEFAULT 100,
    alibaba_limit DOUBLE PRECISION NOT NULL DEFAULT 100,
    western_limit DOUBLE PRECISION NOT NULL DEFAULT 1000,
    bank_limit    DOUBLE PRECISION NOT NULL DEFAULT 1000,
    enter_limit   DOUBLE PRECISION NOT NULL DEFAULT 20000
);


-- ============================================================================
-- 24. currencies — أسعار العملات المعروضة في الشريط
--     Currency buy/sell rates (homepage ticker + converter)
-- ============================================================================
CREATE TABLE IF NOT EXISTS currencies (
    id         SERIAL PRIMARY KEY,
    name       TEXT NOT NULL,
    flag       TEXT NOT NULL,
    buy_price  DOUBLE PRECISION NOT NULL,
    sell_price DOUBLE PRECISION NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);


-- ============================================================================
-- 25. blocked_countries — الدول المحظورة من الخدمات
--     Countries blocked from dollar / money-transfer services
-- ============================================================================
CREATE TABLE IF NOT EXISTS blocked_countries (
    id           SERIAL PRIMARY KEY,
    category     TEXT NOT NULL,         -- "dollar" | "money" | "both"
    country_name TEXT NOT NULL,
    created_at   TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);


-- ============================================================================
-- 26. blocked_users — عناوين IP وبصمات الأجهزة المحظورة
--     Blocked IP addresses / device fingerprints (rate-limit overflow)
-- ============================================================================
CREATE TABLE IF NOT EXISTS blocked_users (
    id                 SERIAL PRIMARY KEY,
    ip_address         TEXT NOT NULL,
    device_fingerprint TEXT,
    created_at         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_blocked_users_ip_address ON blocked_users(ip_address);


-- ============================================================================
-- 27. message_counts — عداد الرسائل لكل IP (rate-limit before block)
--     Per-IP message counter (5 messages → auto-block)
-- ============================================================================
CREATE TABLE IF NOT EXISTS message_counts (
    id                 SERIAL PRIMARY KEY,
    ip_address         TEXT NOT NULL,
    message_count      INTEGER NOT NULL DEFAULT 0,
    last_message_time  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    device_fingerprint TEXT
);
CREATE INDEX IF NOT EXISTS idx_message_counts_ip_address ON message_counts(ip_address);


-- ============================================================================
-- 28. terms_conditions — الشروط والأحكام لكل خدمة
--     Terms & conditions per service (general / dollar / money / cards / alibaba / alipay)
-- ============================================================================
CREATE TABLE IF NOT EXISTS terms_conditions (
    id         SERIAL PRIMARY KEY,
    category   TEXT NOT NULL UNIQUE,
    title      TEXT NOT NULL DEFAULT 'الشروط والأحكام',
    content    TEXT NOT NULL,
    "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);


-- ============================================================================
-- 29. smstext — قالب رسالة SMS المرسلة للعميل عند إنشاء الطلب
--     Default SMS template sent to customer on order creation
-- ============================================================================
CREATE TABLE IF NOT EXISTS smstext (
    id              INTEGER PRIMARY KEY DEFAULT 1,
    message         TEXT NOT NULL,
    whatsapp_number TEXT NOT NULL
);


-- ============================================================================
-- 30. price — سعر صرف الدينار مقابل الدولار (السعر الرسمي للبنك المركزي)
--     IQD-per-USD rate (central-bank rate, default 1320)
-- ============================================================================
CREATE TABLE IF NOT EXISTS price (
    id          INTEGER PRIMARY KEY DEFAULT 1,
    dinar_price DOUBLE PRECISION NOT NULL DEFAULT 1320
);


-- ============================================================================
-- 31. app_settings — إعدادات التطبيق (integrations + branding + contact)
--     App-wide settings (admin-controlled; replaces PHP's hardcoded env vars)
-- ============================================================================
CREATE TABLE IF NOT EXISTS app_settings (
    id                   INTEGER PRIMARY KEY DEFAULT 1,
    whatsapp_number      TEXT NOT NULL DEFAULT '+9647700000000',
    contact_email        TEXT NOT NULL DEFAULT 'info@samabaghdad.com',
    phone_number         TEXT,
    address              TEXT NOT NULL DEFAULT 'بغداد - شارع سعدون',
    working_hours        TEXT NOT NULL DEFAULT 'السبت - الخميس · 9ص - 6م',
    facebook_url         TEXT,
    instagram_url        TEXT,
    telegram_url         TEXT,
    telegram_bot_token   TEXT,
    telegram_chat_id     TEXT,
    telegram_enabled     BOOLEAN NOT NULL DEFAULT FALSE,
    sms_provider         TEXT NOT NULL DEFAULT 'none',     -- none|clickatell|infobip|twilio|messagebird
    sms_api_key          TEXT,
    sms_sender           TEXT,
    sms_enabled          BOOLEAN NOT NULL DEFAULT FALSE,
    email_provider       TEXT NOT NULL DEFAULT 'none',     -- none|mailtrap|smtp|resend
    email_api_key        TEXT,
    email_from           TEXT,
    email_to             TEXT,
    email_enabled        BOOLEAN NOT NULL DEFAULT FALSE,
    exchange_rate_api_key TEXT,
    sala_orders_enabled  BOOLEAN NOT NULL DEFAULT FALSE,
    sala_orders_url      TEXT NOT NULL DEFAULT 'https://sala-orders.com',
    sala_orders_token    TEXT,
    site_name            TEXT NOT NULL DEFAULT 'سما بغداد للصرافة',
    site_name_en         TEXT NOT NULL DEFAULT 'Sama Baghdad',
    legal_entity         TEXT NOT NULL DEFAULT 'Sama Baghdad Limited Company — Wyoming LLC #2025-001676247',
    "updatedAt"          TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);


-- ============================================================================
-- SEED DATA
-- ============================================================================
-- All inserts use ON CONFLICT DO NOTHING so re-running this file is safe.
-- ============================================================================


-- ---------- Admin (1 row) ----------
-- Argon2id hash of "admin123" generated by @node-rs/argon2 (m=19456, t=2, p=1).
-- CHANGE THIS PASSWORD AFTER FIRST LOGIN via the admin dashboard.
INSERT INTO admins (id, username, email, phone, password, "createdAt", "updatedAt")
VALUES (
    'cladmin0samabaghdad0000000000',
    'admin',
    'admin@samabaghdad.com',
    '+9647700000000',
    '$argon2id$v=19$m=19456,t=2,p=1$WK00AyVAYsmg2V/DveJVHA$YrRkxscTMc+5JrTc2obBpqR+6mAm44kZ4XhJmotSaYk',
    CURRENT_TIMESTAMP,
    CURRENT_TIMESTAMP
)
ON CONFLICT (username) DO NOTHING;

-- NOTE: This hash is a valid Argon2id hash of "admin123". If you prefer to
-- regenerate it with a fresh salt, run `bun run db:seed` after importing —
-- the seed script is idempotent and will NOT overwrite an existing admin row
-- (it uses upsert with `update: {}`). To force-regenerate, run:
--   UPDATE admins SET password = '<new_hash>' WHERE username = 'admin';


-- ---------- App settings (1 row, defaults) ----------
INSERT INTO app_settings (id) VALUES (1)
ON CONFLICT (id) DO NOTHING;


-- ---------- Limits (1 row) ----------
INSERT INTO limits (id, dollar_limit, alipay_limit, alibaba_limit, western_limit, bank_limit, enter_limit)
VALUES (1, 1000, 100, 100, 1000, 1000, 20000)
ON CONFLICT (id) DO NOTHING;


-- ---------- Price + DollarYan (1 row each) ----------
INSERT INTO price (id, dinar_price) VALUES (1, 1320)
ON CONFLICT (id) DO NOTHING;

INSERT INTO dollar_yan (id, dollar_price) VALUES (1, 7.17)
ON CONFLICT (id) DO NOTHING;


-- ---------- SMS text (1 row) ----------
INSERT INTO smstext (id, message, whatsapp_number)
VALUES (
    1,
    'عميلنا العزيز، تم استلام طلبك رقم {order_number}. يرجى إيداع المبلغ خلال ساعتين.',
    '+9647700000000'
)
ON CONFLICT (id) DO NOTHING;


-- ---------- Page content (1 row each, CMS defaults) ----------
INSERT INTO index_page (id, hero_title, hero_subtitle, services_title, footer_text, main_color)
VALUES (1, 'سما بغداد للصرافة', 'للصرافة وتحويل الأموال', 'خدماتنا', 'شركة سما بغداد للصرافة', '#d4af37')
ON CONFLICT (id) DO NOTHING;

INSERT INTO dollar_page (id, title1, desc1, amount, recieve_dollar)
VALUES (
    1,
    'حجز الدولار السياحي',
    'احجز الدولار الأمريكي لسفرك بسعر البنك المركزي',
    '5000|3000|2000',
    'مطار بغداد الدولي,مطار البصرة الدولي,مطار أربيل الدولي,مطار النجف الدولي,منفذ إبراهيم الحدودي,منفذ المنذرية الحدودي,عبر فروع شركة سما بغداد'
)
ON CONFLICT (id) DO NOTHING;

INSERT INTO western_page (id, penfit_percent, western_info_send)
VALUES (1, 'رسوم خدمة تحويل الأموال 2%', '')
ON CONFLICT (id) DO NOTHING;

INSERT INTO tracking_page (id, "desc")
VALUES (1, 'أدخل رقم الطلب للاستعلام عن حالته')
ON CONFLICT (id) DO NOTHING;

INSERT INTO confirm_page (id, title, title2, desc1, desc2)
VALUES (1, 'تأكيد الطلب', '', '', '')
ON CONFLICT (id) DO NOTHING;

INSERT INTO confirm_page_western (id, title, title2, desc1, desc2)
VALUES (1, 'تأكيد تحويل ويسترن', '', '', '')
ON CONFLICT (id) DO NOTHING;

INSERT INTO confirm_card (id, title, title2, desc1, desc2)
VALUES (1, 'تأكيد شحن الكارت', '', '', '')
ON CONFLICT (id) DO NOTHING;


-- ---------- Payment methods (4 rows) ----------
INSERT INTO western_payment_methods (title, description, account_num, box_name)
VALUES
    ('ماستر كارد الرافدين', 'تحويل عبر بطاقة ماستر كارد الرافدين', '7801234567890', 'سما بغداد للصرافة'),
    ('عبر FIB',             'تحويل عبر تطبيق FIB',                  '964123456789',  'سما بغداد للصرافة'),
    ('زين كاش',             'إيداع عبر محفظة زين كاش',              '07801234567',   'سما بغداد للصرافة'),
    ('تحويل بنكي',          'تحويل بنكي مباشر عبر IBAN',            'IQ98 BIQB 1234 5678 9012 345', 'سما بغداد للصرافة')
ON CONFLICT DO NOTHING;


-- ---------- Bank account (1 row) ----------
INSERT INTO bank_accounts (account_number, card_number, fib_account_number, box_name)
VALUES ('1234567890', '4111 1111 1111 1111', 'samabaghdad@fib', 'سما بغداد للصرافة')
ON CONFLICT DO NOTHING;


-- ---------- Currencies (9 rows) ----------
INSERT INTO currencies (name, flag, buy_price, sell_price)
VALUES
    ('دولار أمريكي',     '🇺🇸', 1320,    1325),
    ('يورو',            '🇪🇺', 1430,    1440),
    ('جنيه إسترليني',   '🇬🇧', 1670,    1685),
    ('ليرة تركية',      '🇹🇷',   38.5,    39.2),
    ('درهم إماراتي',    '🇦🇪',  359.5,   362.0),
    ('ريال سعودي',      '🇸🇦',  352.0,   354.5),
    ('دينار أردني',     '🇯🇴', 1862,    1875),
    ('جنيه مصري',       '🇪🇬',   27.1,    27.5),
    ('يوان صيني',       '🇨🇳',  182.5,   184.0)
ON CONFLICT DO NOTHING;


-- ---------- Blocked countries (9 rows) ----------
INSERT INTO blocked_countries (category, country_name)
VALUES
    ('both', 'اليمن'),
    ('both', 'ليبيا'),
    ('both', 'نيجيريا'),
    ('both', 'افغانستان'),
    ('both', 'كوريا الشمالية'),
    ('both', 'بلاروسيا'),
    ('both', 'السودان'),
    ('both', 'كوبا'),
    ('both', 'فنزويلا')
ON CONFLICT DO NOTHING;


-- ---------- Services (6 rows — homepage cards) ----------
INSERT INTO services (title, description)
VALUES
    ('الدولار السياحي',  'حجز الدولار الأمريكي لسفرك بسعر البنك المركزي.'),
    ('Western Union',    'إرسال واستقبال التحويلات العالمية عبر Western Union.'),
    ('شحن الكروت',       'شحن كروت Neosurf و FIB و ZainCash.'),
    ('Alibaba',          'دفع طلباتك من موقع Alibaba بأسعار منافسة.'),
    ('Alipay',           'حجز وخدمات Alipay للتعاملات الصينية.'),
    ('تتبع الطلب',       'استعلم عن حالة طلبك في أي وقت.')
ON CONFLICT DO NOTHING;


-- ---------- Terms & conditions (6 rows) ----------
-- Long Arabic markdown content stored as TEXT.
-- Using dollar-quoting ($terms$ ... $terms$) to avoid escaping issues.

INSERT INTO terms_conditions (category, title, content)
VALUES ('general', 'شروط الخدمة', $terms$# شروط الخدمة لشركة سما بغداد المحدودة

**تاريخ السريان:** 12 مايو 2025

## 1. المقدمة
شركة سما بغداد المحدودة ("الشركة") هي شركة ذات مسؤولية محدودة بمالك واحد، تم تأسيسها بموجب قوانين ولاية وايومنغ. تحكم شروط الخدمة هذه ("شروط الخدمة") العمليات، الإدارة، والتفاعلات بين الشركة وعضوها وأي أطراف ثالثة تتعامل مع خدمات أو أنشطة الشركة.

## 2. غرض الشركة
تم تأسيس الشركة للانخراط في أي نشاط قانوني يسمح به قانون الشركات ذات المسؤولية المحدودة في وايومنغ. يجوز للشركة القيام بأي أنشطة تجارية يحددها العضو، السيدة/السيد روئى عباس وفقًا لاتفاقية التشغيل.

## 3. الإدارة والسلطة
**هيكل الإدارة:** يتم إدارة الشركة حصريًا من قبل عضوها، السيدة/السيد روئى عباس، الذي يملك السلطة الكاملة لاتخاذ القرارات المتعلقة بعمليات الشركة، بما في ذلك، على سبيل المثال لا الحصر، العقود، المعاملات، إدارة الأصول، الاقتراض، وتوظيف الأفراد أو الشركات.

**صلاحيات اتخاذ القرار:** يُخول العضو بما يلي:
- بيع أو تأجير أو التصرف في أصول الشركة.
- اقتناء أصول جديدة.
- إدارة أصول الشركة.
- اقتراض الأموال ومنح مصالح تأمينية.
- تنفيذ العقود والاتفاقيات والأدوات المالية نيابة عن الشركة.

**السلطة الملزمة:** يجوز للعضو تنفيذ أي اتفاقية ملزمة قانونيًا، بما في ذلك إنشاء وتشغيل حساب مصرفي للشركة.

## 4. الالتزامات المالية
**المساهمة الرأسمالية الأولية:** يجب على العضو تقديم رأس المال كما هو موضح في الملحق 2 من اتفاقية التشغيل.

**عدم وجود مساهمات إضافية:** ما لم يُنص على خلاف ذلك، لا يلتزم العضو بتقديم مساهمات رأسمالية إضافية تتجاوز المساهمة الأولية.

**التعويض والتسديد:** يحق للعضو الحصول على تعويض عن الخدمات المقدمة للشركة وتسديد جميع النفقات المباشرة.

## 5. العمليات المالية
**الأرباح والخسائر:** يتم تحديد صافي أرباح وخسائر الشركة سنويًا وتوزيعها على العضو.

**التوزيعات:** يجوز للعضو توزيع الأموال المتاحة حسب تقديره بعد استيفاء النفقات والالتزامات.

## 6. المسؤولية والتعويض
**المسؤولية المحدودة:** تقتصر مسؤولية العضو على ما ينص عليه قانون وايومنغ. لا يتحمل العضو مسؤولية شخصية عن ديون أو التزامات الشركة.

**التعويض:** ستعوض الشركة العضو عن النفقات، الأحكام، الغرامات، أو التسويات الناتجة عن الإجراءات المتخذة بحسن نية وفي مصلحة الشركة.

## 7. السجلات والمعلومات
تحتفظ الشركة بسجلات دقيقة، بما في ذلك شهادة التأسيس، اتفاقية التشغيل، الإقرارات الضريبية، البيانات المالية، وتفاصيل العضو، في مقرها الرئيسي (بغداد، السعدون).

## 8. حصة العضوية والتحويلات
يمتلك العضو، السيدة/السيد روئى عباس، 100% من حصة العضوية. لا تُصدر شهادات عضوية؛ يتم تقديم بيان بالحصة عند الطلب.

## 9. الحل
يجوز للعضو حل الشركة في أي وقت أو إذا أصبحت عملياتها غير قانونية بموجب قانون وايومنغ. عند الحل، يتم سداد الديون أولاً، يليها توزيعات للعضو.

## 10. القانون الحاكم
تخضع شروط الخدمة هذه وجميع الأمور ذات الصلة لقوانين ولاية وايومنغ. يتم حل أي نزاعات وفقًا لقانون وايومنغ.

## 11. معلومات التواصل
**العنوان:** بغداد، السعدون

**القبول:** من خلال التفاعل مع شركة سما بغداد المحدودة، فإنك تقر وتوافق على شروط الخدمة هذه.

**توقيع:** رؤى عباس، عضو، 100%
**التاريخ:** 12 مايو 2025$terms$)
ON CONFLICT (category) DO NOTHING;

INSERT INTO terms_conditions (category, title, content)
VALUES ('dollar', 'شروط حجز الدولار السياحي', $terms$قبل البدء بتقديم استمارة حجز بيع الدولار للمسافرين يرجى مراعاة ما يلي:

1. ارفاق صورة لجواز السفر - ارفاق صورة تذكرة السفر
2. يستطيع المسافر ان يختار المطار الذي يريد الاستلام منه
3. يتم منح الحصة مرة واحدة في الشهر
4. يرجى العلم بأن هذا الحجز يعتبر حجز مباشر

## الدول المحظورة
- اليمن
- ليبيا
- نيجيريا
- افغانستان
- كوريا الشمالية
- بلاروسيا
- السودان
- شمال السودان
- جنوب السودان
- كوبا
- فنزويلا
- القرم

يجب اكمال الدفع واخذ صورة للتحويل وارفاق صورة التحويل في الخانة الاخيرة واتمام الحجز بعد ملئ معلوماتك$terms$)
ON CONFLICT (category) DO NOTHING;

INSERT INTO terms_conditions (category, title, content)
VALUES ('money', 'شروط تحويل الأموال', $terms$# شروط تحويل الأموال (Western Union / MoneyGram / تحويل بنكي / داخل المحافظات)

## 1. الرسوم
رسوم خدمة تحويل الأموال **2%** من قيمة التحويل.

## 2. الحدود الدنيا
- Western Union / MoneyGram: 1,000 دولار
- تحويل بنكي: 1,000 دولار
- داخل المحافظات: 20,000 دينار

## 3. سعر الصرف
- 1$ = 1,320 دينار عراقي
- اليوران يحسب بسعر السوق

## 4. المستندات المطلوبة
- صورة البطاقة الشخصية للمرسل (للتحويلات الدولية والبنكية)
- اسم المستلم وعنوانه الكامل
- رقم الحساب / IBAN (للتحويل البنكي)

## 5. التزامات العميل
- تقديم معلومات صحيحة وكاملة
- رفع مستندات واضحة
- التأكد من صحة رقم الحساب قبل الإرسال

## 6. أوقات المعالجة
- التحويلات الدولية: 24-48 ساعة
- التحويلات البنكية: 1-3 أيام عمل
- داخل المحافظات: خلال ساعات

## 7. الإلغاء
لا يمكن إلغاء التحويل بعد تنفيذه. يمكن تعديل الطلب قبل التنفيذ عبر صفحة تحديث الطلب.$terms$)
ON CONFLICT (category) DO NOTHING;

INSERT INTO terms_conditions (category, title, content)
VALUES ('cards', 'شروط شحن الكروت', $terms$# شروط شحن الكروت (Neosurf / FIB / ZainCash)

## 1. المبالغ
- Neosurf بالدولار: الحد الأدنى 1,000 دولار
- Neosurf بالدينار: بدون حد أدنى
- FIB: بدون حد أدنى
- ZainCash: بدون حد أدنى

## 2. سعر الصرف
- 1$ = 1,320 دينار عراقي

## 3. البيانات المطلوبة
- اسم صاحب الحساب
- رقم الحساب / رقم المحفظة
- آخر 4 أرقام من البطاقة (لـ Neosurf)
- المبلغ المطلوب شحنه

## 4. التزامات العميل
- تقديم بيانات صحيحة لحسابك الشخصي
- التأكد من صحة رقم الحساب قبل الإرسال
- عدم استخدام الخدمة لأغراض غير قانونية

## 5. المعالجة
يتم الشحن خلال 24 ساعة من تأكيد الدفع.$terms$)
ON CONFLICT (category) DO NOTHING;

INSERT INTO terms_conditions (category, title, content)
VALUES ('alibaba', 'شروط دفع طلبات Alibaba', $terms$# شروط دفع طلبات Alibaba

## 1. الحد الأدنى
الحد الأدنى لقيمة الطلب: 100 دولار.

## 2. سعر الصرف
- 1$ = 1,320 دينار عراقي
- رسوم الخدمة: 2% من قيمة الطلب

## 3. البيانات المطلوبة
- اسم المتبضع
- عنوان المتبضع
- صورة الهوية الشخصية
- رقم الهاتف
- رابط الدفع الخاص بالطلب (من موقع Alibaba)
- قيمة الطلب بالدولار
- طريقة الدفع

## 4. التزامات العميل
- تقديم رابط دفع صحي من Alibaba
- التأكد من قيمة الطلب قبل الإرسال
- عدم استخدام الخدمة لطلبات محظورة$terms$)
ON CONFLICT (category) DO NOTHING;

INSERT INTO terms_conditions (category, title, content)
VALUES ('alipay', 'شروط حجز Alipay', $terms$# شروط حجز Alipay

## 1. الحد الأدنى
الحد الأدنى للحجز: 100 دولار.

## 2. سعر الصرف
- 1$ = 1,320 دينار عراقي
- 1$ = 7.17 يوان صيني
- رسوم الخدمة: 20 دينار لكل دولار

## 3. البيانات المطلوبة
- اسم المرسل
- عنوان المرسل
- صورة الهوية الشخصية
- صورة باركود حساب Alipay للمستلم
- رقم الهاتف
- المبلغ بالدولار
- طريقة الدفع

## 4. التزامات العميل
- تقديم باركود Alipay صالح
- التأكد من صحة بيانات المستلم
- عدم استخدام الخدمة لأغراض غير قانونية$terms$)
ON CONFLICT (category) DO NOTHING;


-- ============================================================================
-- END OF FILE
-- ============================================================================
-- After importing this SQL, you can optionally run `bun run db:seed` to
-- regenerate the admin password with a fresh Argon2id salt. The seed is
-- fully idempotent and will NOT clobber any rows you have already customized.
--
-- Default admin login:  username=admin  password=admin123
-- ⚠️  CHANGE THIS PASSWORD IMMEDIATELY via the admin dashboard after deploy.
-- ============================================================================
