import asyncio
import uuid
import os
import sys
from datetime import datetime, timezone

# Add backend directory to sys.path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from sqlalchemy import text
from app.core.database import AsyncSessionLocal

async def seed_production_and_qa_modules():
    async with AsyncSessionLocal() as session:
        # Modules to ensure exist
        modules = [
            ('PRODUCTION', 'Production', 'Production dashboard, WIP tracking, station pipeline, timer alerts, holds'),
            ('QA', 'Quality Assurance', 'QA checksheet templates, station inspection gating, shortages, signoffs'),
        ]

        for mod_code, mod_name, mod_desc in modules:
            res = await session.execute(text("SELECT module_id FROM module_master WHERE module_code = :code"), {'code': mod_code})
            existing = res.scalar()
            if not existing:
                mod_id = str(uuid.uuid4())
                await session.execute(text("""
                    INSERT INTO module_master (module_id, module_code, module_name, description, is_active, created_at)
                    VALUES (:mod_id, :code, :name, :desc, true, NOW())
                """), {'mod_id': mod_id, 'code': mod_code, 'name': mod_name, 'desc': mod_desc})
                print(f'Inserted {mod_code} module')
            else:
                print(f'{mod_code} module already exists')

        # Permissions per module
        prod_roles = [
            ('ADMIN', True, True, True, True, True),
            ('PRODUCTION_MGR', True, True, True, False, True),
            ('ENGINEERING_HEAD', True, True, True, False, False),
            ('SALES_MGR', True, False, False, False, False),
            ('STORE_MGR', True, False, False, False, False),
            ('VIEWER', True, False, False, False, False),
            ('YARD_SUPERVISOR', True, True, False, False, False),
        ]

        qa_roles = [
            ('ADMIN', True, True, True, True, True),
            ('PRODUCTION_MGR', True, True, True, True, True),
            ('ENGINEERING_HEAD', True, True, True, False, False),
            ('SALES_MGR', True, False, False, False, False),
            ('STORE_MGR', True, False, False, False, False),
            ('VIEWER', True, False, False, False, False),
            ('YARD_SUPERVISOR', True, False, False, False, False),
        ]

        for role_code, v, c, e, d, a in prod_roles:
            perm_res = await session.execute(
                text("SELECT id FROM role_module_permission WHERE role_code = :r AND module_code = 'PRODUCTION'"),
                {'r': role_code}
            )
            if not perm_res.scalar():
                await session.execute(text("""
                    INSERT INTO role_module_permission (id, role_code, module_code, can_view, can_create, can_edit, can_delete, can_approve, updated_at)
                    VALUES (:pid, :r, 'PRODUCTION', :v, :c, :e, :d, :a, NOW())
                """), {'pid': str(uuid.uuid4()), 'r': role_code, 'v': v, 'c': c, 'e': e, 'd': d, 'a': a})
                print(f'Granted PRODUCTION permissions to {role_code}')

        for role_code, v, c, e, d, a in qa_roles:
            perm_res = await session.execute(
                text("SELECT id FROM role_module_permission WHERE role_code = :r AND module_code = 'QA'"),
                {'r': role_code}
            )
            if not perm_res.scalar():
                await session.execute(text("""
                    INSERT INTO role_module_permission (id, role_code, module_code, can_view, can_create, can_edit, can_delete, can_approve, updated_at)
                    VALUES (:pid, :r, 'QA', :v, :c, :e, :d, :a, NOW())
                """), {'pid': str(uuid.uuid4()), 'r': role_code, 'v': v, 'c': c, 'e': e, 'd': d, 'a': a})
                print(f'Granted QA permissions to {role_code}')

        await session.commit()
        print('Done seeding PRODUCTION & QA modules and permissions.')

seed_production_module = seed_production_and_qa_modules

if __name__ == '__main__':
    asyncio.run(seed_production_and_qa_modules())
