import AVFoundation

class CameraInput {
    private var videoInput: AVCaptureDeviceInput?
    private var audioInput: AVCaptureDeviceInput?
    
    func configure(for session: AVCaptureSession, device: CameraDevice, audio: Bool) {
        if let videoDevice = device.videoDevice {
            self.configureVideoInput(for: session, device: videoDevice)
        }
        if audio, let audioDevice = device.audioDevice {
            self.configureAudioInput(for: session, device: audioDevice)
        }
    }
    
    func invalidate(for session: AVCaptureSession) {
        for input in session.inputs {
            session.removeInput(input)
        }
    }
    
    private func configureVideoInput(for session: AVCaptureSession, device: AVCaptureDevice) {
        if let videoInput = try? AVCaptureDeviceInput(device: device) {
            if let currentVideoInput = self.videoInput {
                session.removeInput(currentVideoInput)
            }
            self.videoInput = videoInput
            if session.canAddInput(videoInput) {
                session.addInput(videoInput)
            }
        }
    }
    
    private func configureAudioInput(for session: AVCaptureSession, device: AVCaptureDevice) {
        guard self.audioInput == nil else {
            return
        }
        if let audioInput = try? AVCaptureDeviceInput(device: device) {
            self.audioInput = audioInput
            if session.canAddInput(audioInput) {
                session.addInput(audioInput)
            }
        }
    }
}