import Foundation
import ComplyCubeMobileSDK

public final class CustomerInfoFieldMapper {

    public init() {}

    public func mapStringField(_ field: String) -> CustomerInformationField? {
        switch field {
        case "joined_date": return .joinedDate
        case "telephone":   return .telephone
        case "external_id": return .externalId
        default:            return nil
        }
    }

    public func mapPersonFields(_ list: [Any]) -> [CustomerInformationPersonField] {
        return list.compactMap { entry in
            if let name = entry as? String {
                return personField(name: name, id: name, constraint: nil)
            }
            if let m = entry as? [String: Any],
               let name = m["name"] as? String {
                let constraint = (m["constraint"] as? [String: Any])?["expression"] as? String
                return personField(name: name, id: name, constraint: constraint)
            }
            return nil
        }
    }

    public func mapCompanyFields(_ list: [Any]) -> [CustomerInformationCompanyField] {
        return list.compactMap { entry in
            if let name = entry as? String {
                return companyField(name: name, id: name, constraint: nil)
            }
            if let m = entry as? [String: Any],
               let name = m["name"] as? String {
                let constraint = (m["constraint"] as? [String: Any])?["expression"] as? String
                return companyField(name: name, id: name, constraint: constraint)
            }
            return nil
        }
    }

    private func personField(name: String, id: String?, constraint: String?) -> CustomerInformationPersonField? {
        switch name {
        case "email":                      return .email()
        case "mobile":                     return .mobile()
        case "first_name":                 return .firstName(id: id, constraint: constraint)
        case "middle_name":                return .middleName(id: id, constraint: constraint)
        case "last_name":                  return .lastName(id: id, constraint: constraint)
        case "gender":                     return .gender(id: id, constraint: constraint)
        case "date_of_birth":              return .dateOfBirth(id: id, constraint: constraint)
        case "birth_country":              return .birthCountry(id: id, constraint: constraint)
        case "nationality":                return .nationality(id: id, constraint: constraint)
        case "national_id":                return .nationalIdentityNumber(id: id, constraint: constraint)
        case "social_insurance_number":    return .socialInsuranceNumber(id: id, constraint: constraint)
        case "ssn":                        return .ssn(id: id, constraint: constraint)
        case "tax_identification_number":  return .taxIdentificationNumber(id: id, constraint: constraint)
        default: return nil
        }
    }

    private func companyField(name: String, id: String?, constraint: String?) -> CustomerInformationCompanyField? {
        switch name {
        case "name":                   return .name(id: id, constraint: constraint)
        case "website":                return .website(id: id, constraint: constraint)
        case "registration_number":    return .registrationNumber(id: id, constraint: constraint)
        case "incorporation_country":  return .incorporationCountry(id: id, constraint: constraint)
        case "incorporation_type":     return .incorporationType(id: id, constraint: constraint)
        default: return nil
        }
    }
}
