import argparse
import math
import sys
from typing import Tuple

def calculate_proportion(visitors: int, conversions: int) -> float:
    """Calculate the proportion of conversions."""
    if visitors == 0:
        return 0.0
    return conversions / visitors

def calculate_standard_error(p: float, n: int) -> float:
    """Calculate the standard error for a proportion."""
    if n == 0:
        return 0.0
    return math.sqrt(p * (1 - p) / n)

def calculate_z_score(p1: float, p2: float, se1: float, se2: float) -> float:
    """Calculate the z-score for the difference in proportions."""
    if se1 == 0 and se2 == 0:
        return 0.0
    return (p1 - p2) / math.sqrt(se1**2 + se2**2)

def calculate_p_value(z: float) -> float:
    """Calculate the p-value from the z-score."""
    return 2 * (1 - math.erf(abs(z) / math.sqrt(2)))

def calculate_confidence_interval(p: float, se: float, z: float = 1.96) -> Tuple[float, float]:
    """Calculate the confidence interval for a proportion."""
    margin_of_error = z * se
    return (p - margin_of_error, p + margin_of_error)

def main():
    parser = argparse.ArgumentParser(
        description="A/B Test Significance Calculator"
    )
    parser.add_argument("--visitors-a", type=int, required=True, help="Visitors for group A")
    parser.add_argument("--conversions-a", type=int, required=True, help="Conversions for group A")
    parser.add_argument("--visitors-b", type=int, required=True, help="Visitors for group B")
    parser.add_argument("--conversions-b", type=int, required=True, help="Conversions for group B")

    args = parser.parse_args()

    # Validate input
    if args.visitors_a < 0 or args.visitors_b < 0:
        print("Error: Number of visitors cannot be negative.")
        sys.exit(1)

    if args.conversions_a < 0 or args.conversions_b < 0:
        print("Error: Number of conversions cannot be negative.")
        sys.exit(1)

    if args.conversions_a > args.visitors_a or args.conversions_b > args.visitors_b:
        print("Error: Conversions cannot exceed visitors.")
        sys.exit(1)

    # Calculate proportions
    p_a = calculate_proportion(args.visitors_a, args.conversions_a)
    p_b = calculate_proportion(args.visitors_b, args.conversions_b)

    # Calculate standard errors
    se_a = calculate_standard_error(p_a, args.visitors_a)
    se_b = calculate_standard_error(p_b, args.visitors_b)

    # Calculate z-score
    z = calculate_z_score(p_a, p_b, se_a, se_b)

    # Calculate p-value
    p_value = calculate_p_value(z)

    # Calculate confidence intervals
    ci_a = calculate_confidence_interval(p_a, se_a)
    ci_b = calculate_confidence_interval(p_b, se_b)

    # Print results
    print("A/B Test Results:")
    print(f"Group A: {args.conversions_a} conversions out of {args.visitors_a} visitors")
    print(f"Group B: {args.conversions_b} conversions out of {args.visitors_b} visitors")
    print(f"\nConversion Rates:")
    print(f"Group A: {p_a:.4%}")
    print(f"Group B: {p_b:.4%}")
    print(f"\n95% Confidence Intervals:")
    print(f"Group A: {ci_a[0]:.4%} - {ci_a[1]:.4%}")
    print(f"Group B: {ci_b[0]:.4%} - {ci_b[1]:.4%}")
    print(f"\nZ-score: {z:.4f}")
    print(f"P-value: {p_value:.4f}")

    if p_value < 0.05:
        winner = "A" if p_a > p_b else "B"
        print(f"\nRecommended winner: Group {winner} (statistically significant)")
    else:
        print("\nNo statistically significant difference between groups.")

if __name__ == "__main__":
    main()