//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2021 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

extension Locale {

    @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *)
    public struct Language : Hashable, Codable, Sendable {

        @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *)
        /// Represents a language identifier
        public struct Components : Hashable, Codable, Sendable {
            public var languageCode: Locale.LanguageCode?
            public var script: Locale.Script?
            public var region: Locale.Region?

            public init(languageCode: Locale.LanguageCode? = nil, script: Locale.Script? = nil, region: Locale.Region? = nil) {
                self.languageCode = languageCode
                self.script = script
                self.region = region
            }

            package var identifier: String {
                var result: String = ""

                if let languageCode = languageCode {
                    result += languageCode._normalizedIdentifier
                }
                if let script = script {
                    result += "-"
                    result += script._normalizedIdentifier
                }
                if let region = region {
                    result += "_"
                    result += region._normalizedIdentifier
                }

                return result
            }
            
#if !FOUNDATION_FRAMEWORK
            @_spi(SwiftCorelibsFoundation) public var _identifier: String { identifier }
#endif
        }

        package var components: Language.Components
        
#if !FOUNDATION_FRAMEWORK
        @_spi(SwiftCorelibsFoundation) public var _components: Language.Components {
            components
        }
#endif
        
        public init(components: Language.Components) {
            self.components = components
        }

        public init(languageCode: Locale.LanguageCode? = nil, script: Locale.Script? = nil, region: Locale.Region? = nil) {
            self.components = Components(languageCode: languageCode, script: script, region: region)
        }

        /// Returns a list of system languages, includes the languages of all product localization for the current platform
        public static var systemLanguages: [Language] {
#if FOUNDATION_FRAMEWORK && canImport(_FoundationICU)
            NSLocale.systemLanguages().map {
                let comp = Components(identifier: $0 as! String)
                return Language(components: comp)
            }
#else
            // TODO: Read language list for other platforms
            return []
#endif
        }
    }
}
