"""
Test Phase 2.5 with CBUSH Element Stiffness Optimization Request

Tests the intelligent gap detection with a 1D element force optimization request.
"""

import sys
from pathlib import Path

project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

from optimization_engine.utils.codebase_analyzer import CodebaseCapabilityAnalyzer
from optimization_engine.future.workflow_decomposer import WorkflowDecomposer
from optimization_engine.config.capability_matcher import CapabilityMatcher
from optimization_engine.future.targeted_research_planner import TargetedResearchPlanner


def main():
    user_request = """I want to extract forces in direction Z of all the 1D elements and find the average of it, then find the maximum value and compere it to the average, then assign it to a objective metric that needs to be minimized.

I want to iterate on the FEA properties of the Cbush element stiffness in Z to make the objective function minimized.

I want to use uptuna with TPE to iterate and optimize this"""

    print('=' * 80)
    print('PHASE 2.5 TEST: 1D Element Forces Optimization with CBUSH Stiffness')
    print('=' * 80)
    print()
    print('User Request:')
    print(user_request)
    print()
    print('=' * 80)
    print()

    # Initialize
    analyzer = CodebaseCapabilityAnalyzer()
    decomposer = WorkflowDecomposer()
    matcher = CapabilityMatcher(analyzer)
    planner = TargetedResearchPlanner()

    # Step 1: Decompose
    print('[1] Decomposing Workflow')
    print('-' * 80)
    steps = decomposer.decompose(user_request)
    print(f'Identified {len(steps)} workflow steps:')
    print()
    for i, step in enumerate(steps, 1):
        print(f'  {i}. {step.action.replace("_", " ").title()}')
        print(f'     Domain: {step.domain}')
        if step.params:
            print(f'     Params: {step.params}')
        print()

    # Step 2: Match to capabilities
    print()
    print('[2] Matching to Existing Capabilities')
    print('-' * 80)
    match = matcher.match(steps)
    print(f'Coverage: {match.coverage:.0%} ({len(match.known_steps)}/{len(steps)} steps)')
    print(f'Confidence: {match.overall_confidence:.0%}')
    print()

    print('KNOWN Steps (Already Implemented):')
    for i, known in enumerate(match.known_steps, 1):
        print(f'  {i}. {known.step.action.replace("_", " ").title()} ({known.step.domain})')
        if known.implementation != 'unknown':
            impl_name = Path(known.implementation).name if ('\\' in known.implementation or '/' in known.implementation) else known.implementation
            print(f'     File: {impl_name}')
    print()

    print('MISSING Steps (Need Research):')
    if match.unknown_steps:
        for i, unknown in enumerate(match.unknown_steps, 1):
            print(f'  {i}. {unknown.step.action.replace("_", " ").title()} ({unknown.step.domain})')
            print(f'     Required: {unknown.step.params}')
            if unknown.similar_capabilities:
                similar_str = ', '.join(unknown.similar_capabilities)
                print(f'     Similar to: {similar_str}')
                print(f'     Confidence: {unknown.confidence:.0%} (can adapt)')
            else:
                print(f'     Confidence: {unknown.confidence:.0%} (needs research)')
            print()
    else:
        print('  None - all capabilities are known!')
    print()

    # Step 3: Create research plan
    print()
    print('[3] Creating Targeted Research Plan')
    print('-' * 80)
    plan = planner.plan(match)
    print(f'Research steps needed: {len(plan)}')
    print()

    if plan:
        for i, step in enumerate(plan, 1):
            print(f'Step {i}: {step["description"]}')
            print(f'  Action: {step["action"]}')
            details = step.get('details', {})
            if 'capability' in details:
                print(f'  Study: {details["capability"]}')
            if 'query' in details:
                print(f'  Query: "{details["query"]}"')
            print(f'  Expected confidence: {step["expected_confidence"]:.0%}')
            print()
    else:
        print('No research needed - all capabilities exist!')
        print()

    print()
    print('=' * 80)
    print('ANALYSIS SUMMARY')
    print('=' * 80)
    print()
    print('Request Complexity:')
    print('  - Extract forces from 1D elements (Z direction)')
    print('  - Calculate average and maximum forces')
    print('  - Define custom objective metric (max vs avg comparison)')
    print('  - Modify CBUSH element stiffness properties')
    print('  - Optuna TPE optimization')
    print()
    print(f'System Analysis:')
    print(f'  Known capabilities: {len(match.known_steps)}/{len(steps)} ({match.coverage:.0%})')
    print(f'  Missing capabilities: {len(match.unknown_steps)}/{len(steps)}')
    print(f'  Overall confidence: {match.overall_confidence:.0%}')
    print()

    if match.unknown_steps:
        print('What needs research:')
        for unknown in match.unknown_steps:
            print(f'  - {unknown.step.action} ({unknown.step.domain})')
    else:
        print('All capabilities already exist in Atomizer!')

    print()


if __name__ == '__main__':
    main()
