//
//  DesignConstants.swift
//  Blackjack
//
//  Centralized design constants for the Blackjack app.
//  Uses CasinoDesign from CasinoKit for shared values, with game-specific overrides.
//

import SwiftUI
import CasinoKit

// MARK: - Design Namespace

/// Design constants for the Blackjack app.
/// Shared constants are imported from CasinoDesign; game-specific values are defined here.
enum Design {
    // MARK: - Debug
    
    /// Set to true to show layout debug borders on views
    static let showDebugBorders = false
    
    /// Set to true to show debug log statements
    static let showDebugLogs = false
    
    /// Debug logger - only prints when showDebugLogs is true
    static func debugLog(_ message: String) {
        if showDebugLogs {
            print(message)
        }
    }
    
    // MARK: - Shared Constants (from CasinoKit)
    
    typealias Spacing = CasinoDesign.Spacing
    typealias CornerRadius = CasinoDesign.CornerRadius
    typealias LineWidth = CasinoDesign.LineWidth
    typealias Shadow = CasinoDesign.Shadow
    typealias Opacity = CasinoDesign.Opacity
    typealias Animation = CasinoDesign.Animation
    typealias Scale = CasinoDesign.Scale
    typealias MinScaleFactor = CasinoDesign.MinScaleFactor
    typealias BaseFontSize = CasinoDesign.BaseFontSize
    typealias IconSize = CasinoDesign.IconSize
    
    // MARK: - Blackjack-Specific Sizes (use CasinoDesign.Size for shared values)
    
    enum Size {
        // Cards
        static let cardWidth: CGFloat = 90
        static let cardOverlap: CGFloat = -50  // Negative = more overlap
        
        // Player hands
        static let playerHandsHeight: CGFloat = 240
        
        // Hand labels
        static let handLabelFontSize: CGFloat = 14
        static let handNumberFontSize: CGFloat = 12
        static let handValueFontSize: CGFloat = 18
        
        // Hints
        static let hintFontSize: CGFloat = 15
        static let hintIconSize: CGFloat = 24
        static let hintPaddingH: CGFloat = 10
        static let hintPaddingV: CGFloat = 10
        static let hintMinWidth: CGFloat = 90
        
        // Hand icons
        static let handIconSize: CGFloat = 18
        
        // Hi-Lo count badge
        static let countBadgeFontSize: CGFloat = 10
        static let countBadgePaddingH: CGFloat = 6
        static let countBadgePaddingV: CGFloat = 2
        static let countBadgeOffset: CGFloat = 6
        
        // Betting
        static let bettingChipSize: CGFloat = 54
        
        // Card count display
        static let cardCountLabelSize: CGFloat = 11
        static let cardCountValueSize: CGFloat = 18
        
        // Table
        static let tableHeight: CGFloat = 280
        
        // Result banner
        static let resultRowAmountWidth: CGFloat = 70
        static let resultRowResultWidth: CGFloat = 120
        
        // Side bet zones
        static let sideBetLabelFontSize: CGFloat = 13
        static let sideBetPayoutFontSize: CGFloat = 11
        
        // Side bet toast notifications
        static let sideBetToastTitleFontSize: CGFloat = 11
        static let sideBetToastResultFontSize: CGFloat = 12
        static let sideBetToastAmountFontSize: CGFloat = 14
    }
    
    // MARK: - Blackjack-Specific Delays
    
    enum Delay {
        /// Delay before playing game over sound
        static let gameOverSound: Double = 1.0
    }
    
    // MARK: - Blackjack-Specific Animation
    
    enum AnimationExtra {
        /// Bounce for side bet toast animations
        static let toastBounce: Double = 0.4
    }
    
    // MARK: - Toast Configuration
    
    enum Toast {
        /// Duration all toasts stay visible (in seconds).
        static let duration: Duration = .seconds(2)
    }
    
    // MARK: - Card Deal Animation
    
    enum DealAnimation {
        /// Horizontal offset for dealer cards (shoe is nearby, less horizontal travel)
        static let dealerOffsetX: CGFloat = 120
        /// Vertical offset for dealer cards (small since near top)
        static let dealerOffsetY: CGFloat = -80
        
        /// Horizontal offset for player cards (shoe is far away, more horizontal travel)
        static let playerOffsetX: CGFloat = 180
        /// Vertical offset for player cards (large since far from top)
        static let playerOffsetY: CGFloat = -350
    }
}

// MARK: - Blackjack App Colors

extension Color {
    
    // MARK: - Table Colors (use CasinoTable from CasinoKit for consistency)
    
    /// Typealias for consistent table colors across all games.
    typealias Table = CasinoTable
    
    // MARK: - Betting Zone Colors
    
    enum BettingZone {
        static let main = Color(red: 0.2, green: 0.4, blue: 0.3)
        static let mainBorder = Color(red: 0.4, green: 0.6, blue: 0.4)
        static let insurance = Color(red: 0.5, green: 0.4, blue: 0.2)
        static let insuranceBorder = Color(red: 0.7, green: 0.6, blue: 0.3)
    }
    
    // MARK: - Hand Colors
    
    enum Hand {
        static let player = Color(red: 0.2, green: 0.5, blue: 0.8)
        static let dealer = Color(red: 0.8, green: 0.3, blue: 0.3)
        static let active = Color.yellow
        static let inactive = Color.white.opacity(CasinoDesign.Opacity.medium)
    }
    
    // MARK: - Result Colors
    
    enum Result {
        static let win = Color.green
        static let lose = Color.red
        static let push = Color.blue
        static let blackjack = Color.yellow
    }
    
    // MARK: - Action Button Colors (Blackjack-specific)
    
    enum Button {
        static let hit = Color(red: 0.2, green: 0.6, blue: 0.3)
        static let stand = Color(red: 0.6, green: 0.4, blue: 0.1)
        static let doubleDown = Color(red: 0.5, green: 0.3, blue: 0.6)
        static let split = Color(red: 0.3, green: 0.5, blue: 0.7)
        static let surrender = Color(red: 0.6, green: 0.3, blue: 0.3)
        static let insurance = Color(red: 0.7, green: 0.6, blue: 0.2)
    }
    
    // MARK: - TopBar Colors
    
    enum TopBar {
        static let balance = Color(red: 0.95, green: 0.85, blue: 0.4)
    }
    
    // MARK: - Side Bet Colors
    
    enum SideBet {
        /// Perfect Pairs - purple theme
        static let perfectPairs = Color(red: 0.4, green: 0.2, blue: 0.5)
        /// 21+3 - teal/cyan theme
        static let twentyOnePlusThree = Color(red: 0.1, green: 0.4, blue: 0.5)
    }
}
