import React from "react";
import { Table } from "react-fluid-table";
import styled from "styled-components";
import { Input, Image, Flag } from "semantic-ui-react";
import { testData } from "../data";

const TextStyle = styled.div`
  font-family: Helvetica;
  font-size: 14px;
  font-weight: 300;
  font-stretch: normal;
  line-height: normal;
  letter-spacing: normal;
  color: black;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
`;

const EmailInput = styled(Input)`
  width: 100%;
`;

const ProfPic = styled(Image)`
  &&& {
    width: 100%;
    height: 134px;
  }
`;

const countries = [
  { name: "Afghanistan", countryCode: "af" },
  { name: "Aland Islands", countryCode: "ax" },
  { name: "Albania", countryCode: "al" },
  { name: "Algeria", countryCode: "dz" },
  { name: "American Samoa", countryCode: "as" },
  { name: "Andorra", countryCode: "ad" },
  { name: "Angola", countryCode: "ao" },
  { name: "Anguilla", countryCode: "ai" },
  { name: "Antigua", countryCode: "ag" },
  { name: "Argentina", countryCode: "ar" },
  { name: "Armenia", countryCode: "am" },
  { name: "Aruba", countryCode: "aw" },
  { name: "Australia", countryCode: "au" },
  { name: "Austria", countryCode: "at" },
  { name: "Azerbaijan", countryCode: "az" },
  { name: "Bahamas", countryCode: "bs" },
  { name: "Bahrain", countryCode: "bh" },
  { name: "Bangladesh", countryCode: "bd" },
  { name: "Barbados", countryCode: "bb" },
  { name: "Belarus", countryCode: "by" },
  { name: "Belgium", countryCode: "be" },
  { name: "Belize", countryCode: "bz" },
  { name: "Benin", countryCode: "bj" },
  { name: "Bermuda", countryCode: "bm" },
  { name: "Bhutan", countryCode: "bt" },
  { name: "Bolivia", countryCode: "bo" },
  { name: "Bosnia", countryCode: "ba" },
  { name: "Botswana", countryCode: "bw" },
  { name: "Bouvet Island", countryCode: "bv" },
  { name: "Brazil", countryCode: "br" },
  { name: "British Virgin Islands", countryCode: "vg" },
  { name: "Brunei", countryCode: "bn" },
  { name: "Bulgaria", countryCode: "bg" },
  { name: "Burkina Faso", countryCode: "bf" },
  { name: "Burma", countryCode: "mm", alias: "Myanmar" },
  { name: "Burundi", countryCode: "bi" },
  { name: "Caicos Islands", countryCode: "tc" },
  { name: "Cambodia", countryCode: "kh" },
  { name: "Cameroon", countryCode: "cm" },
  { name: "Canada", countryCode: "ca" },
  { name: "Cape Verde", countryCode: "cv" },
  { name: "Cayman Islands", countryCode: "ky" },
  { name: "Central African Republic", countryCode: "cf" },
  { name: "Chad", countryCode: "td" },
  { name: "Chile", countryCode: "cl" },
  { name: "China", countryCode: "cn" },
  { name: "Christmas Island", countryCode: "cx" },
  { name: "Cocos Islands", countryCode: "cc" },
  { name: "Colombia", countryCode: "co" },
  { name: "Comoros", countryCode: "km" },
  { name: "Congo", countryCode: "cd" },
  { name: "Congo Brazzaville", countryCode: "cg" },
  { name: "Cook Islands", countryCode: "ck" },
  { name: "Costa Rica", countryCode: "cr" },
  { name: "Cote Divoire", countryCode: "ci" },
  { name: "Croatia", countryCode: "hr" },
  { name: "Cuba", countryCode: "cu" },
  { name: "Cyprus", countryCode: "cy" },
  { name: "Czech Republic", countryCode: "cz" },
  { name: "Denmark", countryCode: "dk" },
  { name: "Djibouti", countryCode: "dj" },
  { name: "Dominica", countryCode: "dm" },
  { name: "Dominican Republic", countryCode: "do" },
  { name: "Ecuador", countryCode: "ec" },
  { name: "Egypt", countryCode: "eg" },
  { name: "El Salvador", countryCode: "sv" },
  { name: "Equatorial Guinea", countryCode: "gq" },
  { name: "Eritrea", countryCode: "er" },
  { name: "Estonia", countryCode: "ee" },
  { name: "Ethiopia", countryCode: "et" },
  { name: "Europeanunion", countryCode: "eu" },
  { name: "Falkland Islands", countryCode: "fk" },
  { name: "Faroe Islands", countryCode: "fo" },
  { name: "Fiji", countryCode: "fj" },
  { name: "Finland", countryCode: "fi" },
  { name: "France", countryCode: "fr" },
  { name: "French Guiana", countryCode: "gf" },
  { name: "French Polynesia", countryCode: "pf" },
  { name: "French Territories", countryCode: "tf" },
  { name: "Gabon", countryCode: "ga" },
  { name: "Gambia", countryCode: "gm" },
  { name: "Georgia", countryCode: "ge" },
  { name: "Germany", countryCode: "de" },
  { name: "Ghana", countryCode: "gh" },
  { name: "Gibraltar", countryCode: "gi" },
  { name: "Greece", countryCode: "gr" },
  { name: "Greenland", countryCode: "gl" },
  { name: "Grenada", countryCode: "gd" },
  { name: "Guadeloupe", countryCode: "gp" },
  { name: "Guam", countryCode: "gu" },
  { name: "Guatemala", countryCode: "gt" },
  { name: "Guinea", countryCode: "gn" },
  { name: "Guinea-Bissau", countryCode: "gw" },
  { name: "Guyana", countryCode: "gy" },
  { name: "Haiti", countryCode: "ht" },
  { name: "Heard Island", countryCode: "hm" },
  { name: "Honduras", countryCode: "hn" },
  { name: "Hong Kong", countryCode: "hk" },
  { name: "Hungary", countryCode: "hu" },
  { name: "Iceland", countryCode: "is" },
  { name: "India", countryCode: "in" },
  { name: "Indian Ocean Territory", countryCode: "io" },
  { name: "Indonesia", countryCode: "id" },
  { name: "Iran", countryCode: "ir" },
  { name: "Iraq", countryCode: "iq" },
  { name: "Ireland", countryCode: "ie" },
  { name: "Israel", countryCode: "il" },
  { name: "Italy", countryCode: "it" },
  { name: "Jamaica", countryCode: "jm" },
  { name: "Jan Mayen", countryCode: "sj", alias: "Svalbard" },
  { name: "Japan", countryCode: "jp" },
  { name: "Jordan", countryCode: "jo" },
  { name: "Kazakhstan", countryCode: "kz" },
  { name: "Kenya", countryCode: "ke" },
  { name: "Kiribati", countryCode: "ki" },
  { name: "Kuwait", countryCode: "kw" },
  { name: "Kyrgyzstan", countryCode: "kg" },
  { name: "Laos", countryCode: "la" },
  { name: "Latvia", countryCode: "lv" },
  { name: "Lebanon", countryCode: "lb" },
  { name: "Lesotho", countryCode: "ls" },
  { name: "Liberia", countryCode: "lr" },
  { name: "Libya", countryCode: "ly" },
  { name: "Liechtenstein", countryCode: "li" },
  { name: "Lithuania", countryCode: "lt" },
  { name: "Luxembourg", countryCode: "lu" },
  { name: "Macau", countryCode: "mo" },
  { name: "Macedonia", countryCode: "mk" },
  { name: "Madagascar", countryCode: "mg" },
  { name: "Malawi", countryCode: "mw" },
  { name: "Malaysia", countryCode: "my" },
  { name: "Maldives", countryCode: "mv" },
  { name: "Mali", countryCode: "ml" },
  { name: "Malta", countryCode: "mt" },
  { name: "Marshall Islands", countryCode: "mh" },
  { name: "Martinique", countryCode: "mq" },
  { name: "Mauritania", countryCode: "mr" },
  { name: "Mauritius", countryCode: "mu" },
  { name: "Mayotte", countryCode: "yt" },
  { name: "Mexico", countryCode: "mx" },
  { name: "Micronesia", countryCode: "fm" },
  { name: "Moldova", countryCode: "md" },
  { name: "Monaco", countryCode: "mc" },
  { name: "Mongolia", countryCode: "mn" },
  { name: "Montenegro", countryCode: "me" },
  { name: "Montserrat", countryCode: "ms" },
  { name: "Morocco", countryCode: "ma" },
  { name: "Mozambique", countryCode: "mz" },
  { name: "Namibia", countryCode: "na" },
  { name: "Nauru", countryCode: "nr" },
  { name: "Nepal", countryCode: "np" },
  { name: "Netherlands", countryCode: "nl" },
  { name: "Netherlandsantilles", countryCode: "an" },
  { name: "New Caledonia", countryCode: "nc" },
  { name: "New Guinea", countryCode: "pg" },
  { name: "New Zealand", countryCode: "nz" },
  { name: "Nicaragua", countryCode: "ni" },
  { name: "Niger", countryCode: "ne" },
  { name: "Nigeria", countryCode: "ng" },
  { name: "Niue", countryCode: "nu" },
  { name: "Norfolk Island", countryCode: "nf" },
  { name: "North Korea", countryCode: "kp" },
  { name: "Northern Mariana Islands", countryCode: "mp" },
  { name: "Norway", countryCode: "no" },
  { name: "Oman", countryCode: "om" },
  { name: "Pakistan", countryCode: "pk" },
  { name: "Palau", countryCode: "pw" },
  { name: "Palestine", countryCode: "ps" },
  { name: "Panama", countryCode: "pa" },
  { name: "Paraguay", countryCode: "py" },
  { name: "Peru", countryCode: "pe" },
  { name: "Philippines", countryCode: "ph" },
  { name: "Pitcairn Islands", countryCode: "pn" },
  { name: "Poland", countryCode: "pl" },
  { name: "Portugal", countryCode: "pt" },
  { name: "Puerto Rico", countryCode: "pr" },
  { name: "Qatar", countryCode: "qa" },
  { name: "Reunion", countryCode: "re" },
  { name: "Romania", countryCode: "ro" },
  { name: "Russia", countryCode: "ru" },
  { name: "Rwanda", countryCode: "rw" },
  { name: "Saint Helena", countryCode: "sh" },
  { name: "Saint Kitts and Nevis", countryCode: "kn" },
  { name: "Saint Lucia", countryCode: "lc" },
  { name: "Saint Pierre", countryCode: "pm" },
  { name: "Saint Vincent", countryCode: "vc" },
  { name: "Samoa", countryCode: "ws" },
  { name: "San Marino", countryCode: "sm" },
  { name: "Sandwich Islands", countryCode: "gs" },
  { name: "Sao Tome", countryCode: "st" },
  { name: "Saudi Arabia", countryCode: "sa" },
  { name: "Scotland", countryCode: "gb sct" },
  { name: "Senegal", countryCode: "sn" },
  { name: "Serbia", countryCode: "cs" },
  { name: "Serbia", countryCode: "rs" },
  { name: "Seychelles", countryCode: "sc" },
  { name: "Sierra Leone", countryCode: "sl" },
  { name: "Singapore", countryCode: "sg" },
  { name: "Slovakia", countryCode: "sk" },
  { name: "Slovenia", countryCode: "si" },
  { name: "Solomon Islands", countryCode: "sb" },
  { name: "Somalia", countryCode: "so" },
  { name: "South Africa", countryCode: "za" },
  { name: "South Korea", countryCode: "kr" },
  { name: "Spain", countryCode: "es" },
  { name: "Sri Lanka", countryCode: "lk" },
  { name: "Sudan", countryCode: "sd" },
  { name: "Suriname", countryCode: "sr" },
  { name: "Swaziland", countryCode: "sz" },
  { name: "Sweden", countryCode: "se" },
  { name: "Switzerland", countryCode: "ch" },
  { name: "Syria", countryCode: "sy" },
  { name: "Taiwan", countryCode: "tw" },
  { name: "Tajikistan", countryCode: "tj" },
  { name: "Tanzania", countryCode: "tz" },
  { name: "Thailand", countryCode: "th" },
  { name: "Timorleste", countryCode: "tl" },
  { name: "Togo", countryCode: "tg" },
  { name: "Tokelau", countryCode: "tk" },
  { name: "Tonga", countryCode: "to" },
  { name: "Trinidad", countryCode: "tt" },
  { name: "Tunisia", countryCode: "tn" },
  { name: "Turkey", countryCode: "tr" },
  { name: "Turkmenistan", countryCode: "tm" },
  { name: "Tuvalu", countryCode: "tv" },
  { name: "U.A.E.", countryCode: "ae", alias: "United Arab Emirates" },
  { name: "Uganda", countryCode: "ug" },
  { name: "Ukraine", countryCode: "ua" },
  { name: "United Kingdom", countryCode: "gb", alias: "uk" },
  { name: "United States", countryCode: "us", alias: "America" },
  { name: "Uruguay", countryCode: "uy" },
  { name: "US Minor Islands", countryCode: "um" },
  { name: "US Virgin Islands", countryCode: "vi" },
  { name: "Uzbekistan", countryCode: "uz" },
  { name: "Vanuatu", countryCode: "vu" },
  { name: "Vatican City", countryCode: "va" },
  { name: "Venezuela", countryCode: "ve" },
  { name: "Vietnam", countryCode: "vn" },
  { name: "Wales", countryCode: "gb wls" },
  { name: "Wallis and Futuna", countryCode: "wf" },
  { name: "Western Sahara", countryCode: "eh" },
  { name: "Yemen", countryCode: "ye" },
  { name: "Zambia", countryCode: "zm" },
  { name: "Zimbabwe", countryCode: "zw" }
];

const countryMap = countries.reduce((pv, c) => ({ ...pv, [c.countryCode]: c.name }), {});

const columns = [
  {
    key: "id",
    header: "ID",
    width: 50
  },
  {
    key: "avatar",
    header: "Profile Photo",
    width: 150,
    content: ({ row }) => <ProfPic size="small" src={row.avatar} />
  },
  {
    key: "email",
    header: "Email",
    content: ({ row }) => <EmailInput defaultValue={row.email} />
  },
  {
    key: "firstName",
    header: "First",
    width: 100,
    content: ({ row }) => <TextStyle>{row.firstName}</TextStyle>
  },
  {
    key: "lastName",
    header: "Last",
    width: 100,
    content: ({ row }) => <TextStyle>{row.lastName}</TextStyle>
  },
  {
    key: "country",
    header: "Country",
    content: ({ row }) =>
      !countryMap[row.country] ? (
        `No flag for this country: ${row.country.toUpperCase()}`
      ) : (
        <>
          <Flag name={row.country} />
          {countryMap[row.country]}
        </>
      )
  }
];

const Example4 = () => (
  <Table data={testData} columns={columns} tableHeight={400} rowHeight={150} />
);

const Source = `
const data = [/* ... */];

const columns = [
  { key: "id", header: "ID", width: 50 },
  {
    key: "avatar",
    header: "Profile Photo",
    width: 150,
    content: ({ row }) => <ProfPic size="small" src={row.avatar} />
  },
  {
    key: "email",
    header: "Email",
    content: ({ row }) => <Email email={row.email} />
  },
  {
    key: "firstName",
    header: "First",
    width: 100,
    content: ({ row }) => <TextStyle>{row.firstName}</TextStyle>
  },
  {
    key: "lastName",
    header: "Last",
    width: 100,
    content: ({ row }) => <TextStyle>{row.lastName}</TextStyle>
  },
  {
    key: "country",
    header: "Country",
    content: ({ row }) =>
      !countryMap[row.country] ? (
        \`No flag for this country: \${row.country.toUpperCase()}\`
      ) : (
        <>
          <Flag name={row.country} />
          {countryMap[row.country]}
        </>
      )
  }
];

const Example = () => (
  <Table
    data={data}
    columns={columns}
    tableHeight={400}
    rowHeight={150}
  />
);
`;

export { Example4, Source };