//! Service layer that implements business logic using uniform contracts
//! This is the SINGLE implementation that CLI, MCP, and HTTP all use

use super::simple_service::SimpleContractService;
use super::{
    AnalyzeComplexityContract, AnalyzeDeadCodeContract, AnalyzeEntropyContract,
    AnalyzeLintHotspotContract, AnalyzeSatdContract, AnalyzeTdgContract, QualityGateContract,
    RefactorAutoContract,
};
use anyhow::Result;
use serde_json::Value;
use std::sync::Arc;

/// Unified service that processes all contracts
pub struct ContractService {
    inner: Arc<SimpleContractService>,
}

impl ContractService {
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    /// Create a new instance.
    pub fn new() -> Result<Self> {
        Ok(Self {
            inner: Arc::new(SimpleContractService::new()?),
        })
    }

    /// Process analyze complexity contract
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    pub async fn analyze_complexity(&self, contract: AnalyzeComplexityContract) -> Result<Value> {
        self.inner.analyze_complexity(contract).await
    }

    /// Process analyze SATD contract
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    pub async fn analyze_satd(&self, contract: AnalyzeSatdContract) -> Result<Value> {
        self.inner.analyze_satd(contract).await
    }

    /// Process analyze dead code contract
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    pub async fn analyze_dead_code(&self, contract: AnalyzeDeadCodeContract) -> Result<Value> {
        self.inner.analyze_dead_code(contract).await
    }

    /// Process analyze TDG contract
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    pub async fn analyze_tdg(&self, contract: AnalyzeTdgContract) -> Result<Value> {
        self.inner.analyze_tdg(contract).await
    }

    /// Process analyze lint hotspot contract
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    pub async fn analyze_lint_hotspot(
        &self,
        contract: AnalyzeLintHotspotContract,
    ) -> Result<Value> {
        self.inner.analyze_lint_hotspot(contract).await
    }

    /// Process analyze entropy contract
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    pub async fn analyze_entropy(&self, contract: AnalyzeEntropyContract) -> Result<Value> {
        self.inner.analyze_entropy(contract).await
    }

    /// Process quality gate contract
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    pub async fn quality_gate(&self, contract: QualityGateContract) -> Result<Value> {
        self.inner.quality_gate(contract).await
    }

    /// Process refactor auto contract
    #[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
    pub async fn refactor_auto(&self, contract: RefactorAutoContract) -> Result<Value> {
        self.inner.refactor_auto(contract).await
    }
}

// Service module exports
pub use self::ContractService as UnifiedService;

// Property-based tests for service contract stability
include!("service_property_tests.rs");

// Coverage tests for analysis contracts (complexity, SATD, dead code, TDG, lint, entropy)
include!("service_coverage_tests.rs");

// Coverage tests for quality gates, refactor, output formats, and configuration variations
include!("service_quality_tests.rs");
