import Foundation
import OpenClawIPC
import Testing

struct CameraIPCTests {
    @Test func `camera snap codable roundtrip`() throws {
        let req: Request = .cameraSnap(
            facing: .front,
            maxWidth: 640,
            quality: 0.85,
            outPath: "/tmp/test.jpg")

        let data = try JSONEncoder().encode(req)
        let decoded = try JSONDecoder().decode(Request.self, from: data)

        switch decoded {
        case let .cameraSnap(facing, maxWidth, quality, outPath):
            #expect(facing == .front)
            #expect(maxWidth == 640)
            #expect(quality == 0.85)
            #expect(outPath == "/tmp/test.jpg")
        default:
            Issue.record("expected cameraSnap, got \(decoded)")
        }
    }

    @Test func `camera clip codable roundtrip`() throws {
        let req: Request = .cameraClip(
            facing: .back,
            durationMs: 3000,
            includeAudio: false,
            outPath: "/tmp/test.mp4")

        let data = try JSONEncoder().encode(req)
        let decoded = try JSONDecoder().decode(Request.self, from: data)

        switch decoded {
        case let .cameraClip(facing, durationMs, includeAudio, outPath):
            #expect(facing == .back)
            #expect(durationMs == 3000)
            #expect(includeAudio == false)
            #expect(outPath == "/tmp/test.mp4")
        default:
            Issue.record("expected cameraClip, got \(decoded)")
        }
    }

    @Test func `camera clip defaults include audio to true when missing`() throws {
        let json = """
        {"type":"cameraClip","durationMs":1234}
        """
        let decoded = try JSONDecoder().decode(Request.self, from: Data(json.utf8))
        switch decoded {
        case let .cameraClip(_, durationMs, includeAudio, _):
            #expect(durationMs == 1234)
            #expect(includeAudio == true)
        default:
            Issue.record("expected cameraClip, got \(decoded)")
        }
    }
}
