//
//  ContentView.swift
//  AuraUtility
//
//  Created by Sunny Uppal on 10/22/24.
//

import SwiftUI
import Adamantium

struct ContentView: View {
    
    @ObservedObject var auraCoordinator: AuraView.Coordinator
    
    @State var colorSetType: SunoTriColorSet = .custom(
        .wallpaperGreen, .wallpaperGreen, .wallpaperGreen)
    
    @State var colorTypeA: SunoColorPalette = .custom(.zero, .zero, .zero)
    @State var colorTypeB: SunoColorPalette = .custom(.zero, .zero, .zero)
    @State var colorTypeC: SunoColorPalette = .custom(.zero, .zero, .zero)
    
    @State var morphSpeed: ADFloat = 0.1
    @State var scale: ADFloat = 1.0
    @State var seed: ADFloat = .zero
    
    @State var swiftColorA: Color = .red
    @State var swiftColorB: Color = .green
    @State var swiftColorC: Color = .blue
    
    @State var isShowingCopyIndicator: Bool = false
    
    init () {
        Adamantium.setupGlobals()
        auraCoordinator = AuraView.Coordinator()
    }
    
    var body: some View {
        HStack(spacing: .zero) {
            AuraView(
                auraCoordinator,
                colorSet: auraColorSet,
                morphSpeed: morphSpeed,
                scale: scale
            )
            
            ZStack {
                Color.black
                VStack(alignment: .leading) {
                    
                    HStack {
                        Text("Aura\nProperties")
                            .font(.largeTitle)
                            .fontWeight(.black)
                            .foregroundStyle(.white)
                        Spacer()
                    }
                    .padding(.bottom, 16.0)
                    
                    Text("Color")
                        .font(.title2)
                        .fontWeight(.bold)
                        .foregroundStyle(.white)
                    
                    ColorSetPicker(selection: $colorSetType)
                        .frame(height: 128)
                    
                    if showCustomColors {
                        
                        HStack {
                            Text("Base")
                            Spacer()
                            ColorPalettePicker(selection: $colorTypeA)
                            if isCustomColorA {
                                ColorPicker("", selection: $swiftColorA, supportsOpacity: false)
                            }
                        }
                        
                        HStack {
                            Text("Middle")
                            Spacer()
                            ColorPalettePicker(selection: $colorTypeB)
                            if isCustomColorB {
                                ColorPicker("", selection: $swiftColorB, supportsOpacity: false)
                            }
                        }
                        
                        HStack {
                            Text("Highlight")
                            Spacer()
                            ColorPalettePicker(selection: $colorTypeC)
                            if isCustomColorC {
                                ColorPicker("", selection: $swiftColorC, supportsOpacity: false)
                            }
                        }
                    }
                    
                    Divider()
                    .padding(.bottom, 16.0)
                    
                    HStack {
                        Text("Scale")
                            .font(.title2)
                            .fontWeight(.bold)
                            .foregroundStyle(.white)
                        Spacer()
                        Text(String(format: "%.2f", scale))
                            .font(.subheadline)
                            .foregroundStyle(.white.opacity(0.5))
                    }
                    
                    Slider(value: $scale, in: 0...10, step: 0.01) {
                        Text("Scale")
                    } minimumValueLabel: {
                        Text("0")
                    } maximumValueLabel: {
                        Text("10")
                    }
                    
                    Divider()
                    .padding(.bottom, 16.0)
                    
                    HStack {
                        Text("Morph Speed")
                            .font(.title2)
                            .fontWeight(.bold)
                            .foregroundStyle(.white)
                        Spacer()
                        Text(String(format: "%.2f", morphSpeed))
                            .font(.subheadline)
                            .foregroundStyle(.white.opacity(0.5))
                    }
                    
                    Slider(value: $morphSpeed, in: 0...1, step: 0.01) {
                        Text("Morph Speed")
                    } minimumValueLabel: {
                        Text("0")
                    } maximumValueLabel: {
                        Text("1")
                    }
                    
                    Spacer()
                    
                    Text("SwiftUI Code")
                        .font(.title2)
                        .fontWeight(.bold)
                        .foregroundStyle(.white)
                    Button {
                        UIPasteboard.general.string = formattedSwiftUIString
                        isShowingCopyIndicator = true
                        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                            isShowingCopyIndicator = false
                        }
                    } label: {
                        ZStack {
                            HStack {
                                Text(formattedSwiftUIString)
                                    .font(.system(size: 12).monospaced())
                                    .padding(.all, 16.0)
                                    .foregroundStyle(.white.opacity(0.5))
                                Spacer()
                            }
                            .background {
                                Color.white.opacity(0.1)
                            }
                            .clipShape(.rect(cornerRadius: 8.0))
                        }
                        .padding(.bottom, 16.0)
                        .overlay {
                            ZStack {
                                VStack {
                                    Spacer()
                                    ZStack {
                                        Text("Code copied")
                                            .foregroundStyle(.white)
                                            .padding(.horizontal, 16.0)
                                            .padding(.vertical, 8.0)
                                            .background(.blue)
                                            .clipShape(.rect(cornerRadius: 8.0))
                                    }
                                    .opacity(isShowingCopyIndicator ? 1.0 : 0.0)
                                    .animation(.easeInOut, value: isShowingCopyIndicator)
                                    .padding(.bottom, 16.0)
                                }
                                
                                VStack {
                                    Spacer()
                                    HStack {
                                        Spacer()
                                        Image(systemName: "doc.on.doc")
                                            .font(.system(size: 16.0))
                                            .foregroundStyle(.white.opacity(0.25))
                                            .padding(.all, 8.0)
                                    }
                                }
                            }
                            .padding(.vertical, 16.0)
                        }
                    }
                }
                .padding(.top, 48.0)
                .padding(.horizontal, 16.0)
                .buttonStyle(.plain)
            }
            .frame(width: 320.0)
        }
        .ignoresSafeArea()
    }
}

private extension ContentView {
    var colorA: SunoColorPalette {
        switch colorTypeA {
        case .custom:
            let colors = getRGB(from: swiftColorA)
            return .custom(colors.red, colors.green, colors.blue)
        default:
            return colorTypeA
        }
    }
    
    var isCustomColorA: Bool {
        switch colorTypeA {
        case .custom:
            return true
        default:
            return false
        }
    }
    
    var colorB: SunoColorPalette {
        switch colorTypeB {
        case .custom:
            let colors = getRGB(from: swiftColorB)
            return .custom(colors.red, colors.green, colors.blue)
        default:
            return colorTypeB
        }
    }
    
    var isCustomColorB: Bool {
        switch colorTypeB {
        case .custom:
            return true
        default:
            return false
        }
    }
    
    var colorC: SunoColorPalette {
        switch colorTypeC {
        case .custom:
            let colors = getRGB(from: swiftColorC)
            return .custom(colors.red, colors.green, colors.blue)
        default:
            return colorTypeC
        }
    }
    
    var isCustomColorC: Bool {
        switch colorTypeC {
        case .custom:
            return true
        default:
            return false
        }
    }
    
    
    var auraColorSet: SunoTriColorSet {
        switch colorSetType {
        case .custom:
            return .custom(colorA, colorB, colorC)
        default:
            return colorSetType
        }
    }
    
    var showCustomColors: Bool {
        switch colorSetType {
        case .custom:
            return true
        default:
            return false
        }
    }
    
    func getRGB(from color: Color) -> (red: Float, green: Float, blue: Float) {
        let uiColor = UIColor(color)
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        
        if uiColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha) {
            return (Float(red), Float(green), Float(blue))
        }
        return (red: .zero, green: .zero, blue: .zero)
    }
    
    var formattedSwiftUIString: String {
        
        let rgbColorA = getRGB(from: swiftColorA)
        let rgbColorB = getRGB(from: swiftColorB)
        let rgbColorC = getRGB(from: swiftColorC)
        
        let colorSetString = colorSetType.swiftUICodeString(
            a: colorTypeA.swiftUICodeString(r: rgbColorA.red, g: rgbColorA.green, b: rgbColorA.blue),
            b: colorB.swiftUICodeString(r: rgbColorB.red, g: rgbColorB.green, b: rgbColorB.blue),
            c: colorC.swiftUICodeString(r: rgbColorC.red, g: rgbColorC.green, b: rgbColorC.blue)
        )
        
        return """
        @ObservedObject private var auraCoordinator = AuraView.Coordinator()
        
        @ViewBuilder
        var auraView: some View {
            AuraView(
                auraCoordinator,
                colorSet: \(colorSetString),
                morphSpeed: \(String(format: "%.2f", morphSpeed)),
                scale: \(String(format: "%.2f", scale)),
                seed: .zero
            )
        }
        """
    }
}
