//
//  ExperienceTypeSelectorView.swift
//  Reveri
//
//  Created by Tristan-Reveri on 10/06/2025.
//
import SwiftUI

enum ExperienceType: String, Equatable {
    case talk = "Talk"
    case listen = "Listen"
}

struct ExperienceTypeSelectorView: View {
    @Environment(\.colorScheme) var colorScheme
    @Namespace var modeAnimationNamespace
    @Binding var experienceType: ExperienceType

    var body: some View {
        HStack {
            option(for: .talk)
            option(for: .listen)
        }
        .padding(2)
        .background(
            Capsule().fill(RVColor.lightGrey10.darkVariant(RVColor.bgCard).value)
        )
        .animation(.default, value: experienceType)
    }
}

private extension ExperienceTypeSelectorView {
    @ViewBuilder
    func option(for type: ExperienceType) -> some View {
        ZStack {
            selected(for: type).matchedGeometryEffect(id: "selectedMode", in: modeAnimationNamespace)

            Button(
                action: {
                    experienceType = type
                }, label: {
                    label(for: type)
                }
            )
            .buttonStyle(.plain)
        }
    }

@ViewBuilder
    func label(for type: ExperienceType) -> some View {
        HStack(spacing: .xxs) {
            switch type {
            case .talk:
                Image("images/today/switchStars")
                    .renderingMode(.template)
                    .foregroundStyle(foregroundColor(for: type).value)
                RVText("Talk", style: .caption1, textColor: foregroundColor(for: type))
            case .listen:
                RVText("Listen", style: .caption1, textColor: foregroundColor(for: type))
            }
        }
        .padding(.vertical, .md)
        .padding(.horizontal, .xl)
    }

    @ViewBuilder
    func selected(for type: ExperienceType) -> some View {
        if experienceType == type {
            switch type {
            case .talk:
                label(for: type)
                    .opacity(0)
                    .background(Capsule().fill(.switchBackgroundSelected))
            case .listen:
                label(for: type)
                    .opacity(0)
                    .background(Capsule().fill(.switchBackgroundSelected))
            }
        } else {
            EmptyView()
        }
    }

    func isSelected(_ type: ExperienceType) -> Bool {
        experienceType == type
    }

    func foregroundColor(for type: ExperienceType) -> RVColor {
        isSelected(type) ? .switchForegroundSelected : .switchForegroundUnselected
    }

    func backgroundColour(for type: ExperienceType) -> RVColor {
        isSelected(type) ? .switchBackgroundSelected : .switchBackgroundUnselected
    }
}

#Preview("Listen") {
    ReveriBackgroundView().overlay(
        ExperienceTypeSelectorView(experienceType: .constant(.listen))
    )
}

#Preview("Talk") {
    ReveriBackgroundView().overlay(
        ExperienceTypeSelectorView(experienceType: .constant(.talk))
    )
}
