
struct PhoneScreensBlock: OrderedKeyBlockProcessor {

    enum Key: String {
        case id
        case frame
        case tall
        case wide
    }

    static let blockId: ContentBlock = .screens

    let content: Content

    let results: PageGenerationResults

    let language: ContentLanguage

    init(content: Content, results: PageGenerationResults, language: ContentLanguage) {
        self.content = content
        self.results = results
        self.language = language
    }

    func process(_ arguments: [(key: Key, value: String)], markdown: Substring) -> String {
        guard let frameId = arguments.first(where: {$0.key == .frame })?.value else {
            invalid(markdown)
            return ""
        }
        guard let frameFile = content.file(frameId) else {
            results.missing(file: frameId, source: "Wallpaper Block")
            return ""
        }

        guard let id = arguments.first(where: {$0.key == .id })?.value else {
            invalid(markdown)
            return ""
        }

        let remaining = arguments.filter { $0.key == .tall || $0.key == .wide }

        var images = [WallpaperSlider.Image]()
        var tall: FileResource?
        var wide: FileResource?
        for (key, fileId) in remaining {
            guard let file = content.file(fileId) else {
                print("Missing file: \(fileId)")
                results.missing(file: fileId, source: "Wallpaper Block")
                return ""
            }
            if key == .tall {
                if tall != nil {
                    print("Another tall image: \(file.identifier)")
                    invalid(markdown)
                    return ""
                }
                if let other = wide {
                    let image = WallpaperSlider.Image(
                        tall: file,
                        wide: other,
                        language: language,
                        results: results)
                    images.append(image)
                    wide = nil
                    continue
                }
                tall = file
                continue
            }
            // key == .wide
            if wide != nil {
                print("Another wide image: \(file.identifier)")
                invalid(markdown)
                return ""
            }
            guard let other = tall else {
                wide = file
                continue
            }
            let image = WallpaperSlider.Image(
                tall: other,
                wide: file,
                language: language,
                results: results)
            images.append(image)
            tall = nil
        }
        if tall != nil || wide != nil {
            invalid(markdown)
            print("Wide/tall does not have the same number of items")
            return ""
        }

        let frame = WallpaperSlider.Frame(frame: frameFile, language: language, results: results)
        let slider = WallpaperSlider(frame: frame, images: images, id: id)

        results.require(footer: slider.script)
        results.require(headers: .swiperJs, .swiperCss)
        results.require(header: .style(slider.style))

        return slider.content
    }
}
