#!/usr/bin/env python3
"""
Production database initializer.
Run once after first deployment:
    python create_db.py
"""
import sys, os
sys.path.insert(0, os.path.dirname(__file__))

from datetime import date
from app.database import engine, Base
import app.models as _models  # registers all models with Base
from app.models import (
    Pump, FuelRate, ShiftTemplate, SystemSetting,
    RolePagePermission, PumpShiftConfig,
)
from sqlalchemy.orm import Session


def create_tables():
    print("Creating all tables...")
    Base.metadata.create_all(engine)
    print("Done.\n")


def seed():
    with Session(engine) as db:
        # ── Pumps ────────────────────────────────────────────────────────────
        if db.query(Pump).count() == 0:
            db.add_all([
                Pump(pump_code='LP1',   pump_number=1, fuel_type='LP92',  description='Pump 1 - Lanka Petrol 92'),
                Pump(pump_code='LP2',   pump_number=2, fuel_type='LP92',  description='Pump 2 - Lanka Petrol 92'),
                Pump(pump_code='EURO3', pump_number=2, fuel_type='EURO3', description='Pump 2 - Euro 3 Petrol'),
                Pump(pump_code='LAD1',  pump_number=3, fuel_type='LAD',   description='Pump 3 - Lanka Auto Diesel'),
                Pump(pump_code='LAD2',  pump_number=4, fuel_type='LAD',   description='Pump 4 - Lanka Auto Diesel'),
                Pump(pump_code='LADXM', pump_number=4, fuel_type='LADXM', description='Pump 4 - Xtra Mile Diesel'),
            ])
            db.commit()
            print("  Seeded 6 pumps.")

        # ── Fuel rates ───────────────────────────────────────────────────────
        if db.query(FuelRate).count() == 0:
            db.add_all([
                FuelRate(fuel_type='LP92',  rate=410.00, effective_from=date(2026, 4, 21)),
                FuelRate(fuel_type='EURO3', rate=465.00, effective_from=date(2026, 4, 21)),
                FuelRate(fuel_type='LAD',   rate=392.00, effective_from=date(2026, 4, 21)),
                FuelRate(fuel_type='LADXM', rate=590.00, effective_from=date(2026, 4, 21)),
            ])
            db.commit()
            print("  Seeded 4 fuel rates.")

        # ── Shift templates ──────────────────────────────────────────────────
        if db.query(ShiftTemplate).count() == 0:
            db.add_all([
                ShiftTemplate(name='Early Morning', code='EM',  start_time='22:00', end_time='07:00', crosses_midnight=True,  color='#818cf8', sort_order=1),
                ShiftTemplate(name='Day Shift',     code='DAY', start_time='05:30', end_time='14:00', crosses_midnight=False, color='#38bdf8', sort_order=2),
                ShiftTemplate(name='Morning Shift', code='MS',  start_time='07:00', end_time='14:00', crosses_midnight=False, color='#60a5fa', sort_order=3),
                ShiftTemplate(name='MG Morning',    code='MG',  start_time='07:00', end_time='21:00', crosses_midnight=False, color='#fbbf24', sort_order=4),
                ShiftTemplate(name='Evening Shift', code='ES',  start_time='14:00', end_time='22:00', crosses_midnight=False, color='#fb923c', sort_order=5),
            ])
            db.commit()
            print("  Seeded 5 shift templates.")

        # ── System settings ──────────────────────────────────────────────────
        defaults = [
            ('leave.annual_days',            '14',                         'Annual leave days per year'),
            ('leave.sick_days',              '7',                          'Sick leave days per year'),
            ('leave.casual_days',            '3',                          'Casual leave days per year'),
            ('allowance.overtime.enabled',   'true',                       'Enable overtime allowance'),
            ('allowance.overtime.amount',    '500',                        'Overtime allowance (Rs.)'),
            ('allowance.performance.enabled','true',                       'Enable performance bonus'),
            ('allowance.performance.amount', '2000',                       'Performance bonus (Rs.)'),
            ('allowance.attendance.enabled', 'true',                       'Enable attendance bonus'),
            ('allowance.attendance.amount',  '1000',                       'Attendance bonus (Rs.)'),
            ('station_name',                 'Dunhinda Brothers',          'Station display name'),
            ('station_address',              '',                           'Full postal address'),
            ('station_phone',                '',                           'Contact phone'),
            ('station_email',                '',                           'Contact email'),
            ('station_vat_no',               '',                           'VAT registration number'),
            ('station_reg_no',               '',                           'Business registration number'),
            ('default_vat_rate',             '18.00',                      'Default VAT %'),
            ('invoice_prefix',               'INV',                        'Invoice number prefix'),
            ('invoice_next_seq',             '1',                          'Next invoice sequence'),
            ('unclosed_shift_hours',         '14',                         'Hours before unclosed shift alert'),
            ('low_stock_threshold_lp92',     '2000',                       'Low stock LP92 (litres)'),
            ('low_stock_threshold_euro3',    '1000',                       'Low stock EURO3 (litres)'),
            ('low_stock_threshold_lad',      '2000',                       'Low stock LAD (litres)'),
            ('low_stock_threshold_ladxm',    '500',                        'Low stock LADXM (litres)'),
            ('price_override_alert_pct',     '5.00',                       'Bulk sale discount % alert'),
        ]
        added = 0
        for key, val, desc in defaults:
            if not db.query(SystemSetting).filter(SystemSetting.setting_key == key).first():
                db.add(SystemSetting(setting_key=key, setting_value=val, description=desc))
                added += 1
        if added:
            db.commit()
            print(f"  Seeded {added} system settings.")

        # ── Role page permissions ────────────────────────────────────────────
        if db.query(RolePagePermission).count() == 0:
            roles   = ['OWNER', 'MANAGER']
            modules = [
                'dashboard', 'shifts', 'cash_handovers', 'shift_history', 'tank_dip',
                'customers', 'stock', 'bulk_sales', 'billing', 'expenses', 'analytics',
                'staff', 'roster', 'leave', 'allowances', 'performance',
                'notifications', 'settings', 'audit',
            ]
            db.add_all([
                RolePagePermission(role=r, module=m, can_access=True)
                for r in roles for m in modules
            ])
            db.commit()
            print(f"  Seeded {len(roles)*len(modules)} role permissions.")

        # ── Pump-shift configs ───────────────────────────────────────────────
        if db.query(PumpShiftConfig).count() == 0:
            pumps     = db.query(Pump).filter(Pump.is_active == True).all()
            templates = db.query(ShiftTemplate).filter(ShiftTemplate.is_active == True).all()
            db.add_all([
                PumpShiftConfig(pump_id=p.id, shift_template_id=st.id, sort_order=st.sort_order)
                for p in pumps for st in templates
            ])
            db.commit()
            print(f"  Seeded {len(pumps)*len(templates)} pump-shift configs.")

    print("\nSeed complete.")


if __name__ == '__main__':
    create_tables()
    seed()
    print("\nDatabase initialized successfully.")
    print("Next: run  python setup_admin.py  to create the admin user.")
