#!/bin/env python
# -*- coding: utf-8 -*-
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

import random
import datetime
import time
import pytz

random.seed(42)

### NUMBERS

numbers = {
    'int2' : ((-32768, 32767), False),
    'int4' : ((-2147483648, 2147483647), False),
    'int8' : ((-9223372036854775808, 9223372036854775807), False),
    'float4' : ((10**6, 10**6), True),
    'float8' : ((10**15, 10**15), True),
    'numeric' : ((10**20, 10**20), True),
}


def save_datafile(t, data):
    filename = f'data/tt_{t}.data'
    file = open(filename, 'w')
    file.write('\n'.join([str(d) for d in data]))

    return filename


for number_type in numbers:

    type_range = numbers[number_type][0]
    is_float = numbers[number_type][1]

    mn = type_range[0]
    mx = type_range[1]

    nln = 0
    ln = len(str(type_range[1]))-1

    table_name = f'tt_{number_type}'

    values = []

    for c in range(nln, ln):
        rep = 20 // ln + 1
        for _ in range(rep):
            n = random.random()
            if c >= 0:
                n *= (10 ** (c+1))
            else:
                n /= (10 ** (-c))
            if not is_float:
                n = int(n)
            
            values += [n]

    filename = save_datafile(number_type, values)

### TIMES

MINTIME = datetime.datetime.fromtimestamp(0)
MAXTIME = datetime.datetime(2024,12,2,10,39,59)
mintime_ts = int(time.mktime(MINTIME.timetuple()))
maxtime_ts = int(time.mktime(MAXTIME.timetuple()))

timestamp_values = []
timestamptz_values = []
time_values = []
timetz_values = []
date_values = []
interval_values = []

timezones = [pytz.timezone("UTC"), pytz.timezone("Asia/Istanbul"), pytz.timezone("US/Eastern"), pytz.timezone("Asia/Tokyo")]

for _ in range(12):
    random_ts = random.randint(mintime_ts, maxtime_ts)
    randtom_tz = timezones[random.randint(0, len(timezones)-1)]
    RANDOMTIME = datetime.datetime.fromtimestamp(random_ts, randtom_tz)
    R_clear = datetime.datetime.fromtimestamp(RANDOMTIME.timestamp())
    
    timestamp_text = str(R_clear)
    timestamptz_text = str(RANDOMTIME)
    timetz_text = str(RANDOMTIME.time()) + " " + RANDOMTIME.tzname()
    time_text = str(RANDOMTIME.time())
    date_text = str(RANDOMTIME.date())
    dt = (R_clear-MINTIME)
    interval_text = str(dt)

    timestamp_values += [timestamp_text]
    timestamptz_values += [timestamptz_text]
    time_values += [time_text]
    timetz_values += [timetz_text]
    date_values += [date_text]
    interval_values += [interval_text]

save_datafile("timestamp", timestamp_values)
save_datafile("timestamptz", timestamptz_values)
save_datafile("time", time_values)
save_datafile("timetz", timetz_values)
save_datafile("date", date_values)
save_datafile("interval", interval_values)
